混合树控制2D角色的移动以及动画状态机的切换

今天做中期的时候做到角色的控制,想了很多种方法,在这记录下其中一种:(使用混合树来控制)

1.找素材,需要一个2d的角色,以及动画(我这个素材是unity自带的)

   在这里分享几个找素材的网站,我经常在上面找:

  https://opengameart.org/

  https://www.spriters-resource.com/

  https://www.100font.com/

 

2.把素材切割好,并且做成动画帧......

(保证所有动画都由一个控制器控制,没有的话把多余的控制器删了,全部拖到一个控制器就可以了)

 

 

 

3.把控制器上的动画删掉,创建两个混合树,并且创建两个float类型的变量来控制:

 

 

 

4.混合树里面分别加上动画

 

 

 

 

 

 

 

 

 

 

 

 (这些都是写代码前的准备)

 

5.下面开始写代码,把其中一个精灵图片拖到Hierarchy界面,并且改名字为Player,设置层级为1,避免地板等东西覆盖;

6.给这个精灵添加动画控制器Animator,并且加上刚刚做的动画控制器;

 

 

 

7.加上刚体Rigidbody2D;因为是2d角色,所以用2d刚体;

8.创建一个脚本起名:Player_Ctrl,并且挂上去;

9.编辑脚本:

 1 public class Player_Ctrl : MonoBehaviour 
 2 {
 3     float moveSpeed = 2;
 4     Rigidbody2D rig2D;
 5     Animator ani;
 6     float inputX, inputY;//按下的XY
 7     float stopX, stopY;//最后停留时的XY
 8 
 9     void Start()
10     {
11         rig2D = GetComponent<Rigidbody2D>();
12         ani = GetComponent<Animator>();
13     }
14 
15     void Update()
16     {
17         inputX = Input.GetAxisRaw("Horizontal");
18         inputY = Input.GetAxisRaw("Vertical");
19     }
20 
21     void FixedUpdate()
22     {
23         PlayerMove();
24         Player_Attack();
25     }
26 
27     void PlayerMove()    {
28         Vector2 input = new Vector2(inputX, inputY).normalized;
29         rig2D.velocity = input * moveSpeed;
30 
31         if (!isAttack)
32         {
33             if (input != Vector2.zero)
34             {
35                 ani.Play("Walk");
36                 stopX = inputX;
37                 stopY = inputY;
38                 ani.SetFloat("InputX", stopX);
39                 ani.SetFloat("InputY", stopY);
40             }
41             else
42             {
43                 ani.Play("Idle");
44             }
45         }
46     }
47 }

亲测可用~

有问题欢迎滴滴我~大家一起进步呀!

 

posted @ 2021-02-18 17:31  邪心鳞宝  阅读(150)  评论(0编辑  收藏  举报