6.
6.1动画帧
6.2关联动画
6.3添加跑动动画
首先在Windows中打开Animation界面,create new floder,建立四个方向的ruby的待机动画godown\goup\goright\goleft
将Assets中的动画拖入到里面,拖动动画帧,这里我们复制动画的第一帧粘贴到最后一帧的后面,这样能够使得动画更加自然。总长设定为0.40.
这里因为官方资源没有ruby向右的动画帧,所以我们复制向左的所有帧粘贴到goright中后,选择Add Property -> Sprite Renderer -> Flip X
删去自动添加的一帧,选择所有帧,勾选
运行动画,就会发现人物朝右啦!
之后,我们在Animation文件夹中找到这个并打开
选中这些组件并delete
右键新建Blend Tree,双击进入Blend Tree,打开parameteris面板,删去blend,点击加号,新建float类型
新建两个float类型,命名为look x , look y .
点开混合树,查看面板,选择Blend Type -> 2D FreeForm Directional
Parameters选择look x and look y
点开 ‘+’ 选择 Add Motion Field,添加四个,分别对应上左右下。
选中我们之前设置好的动画,设置X & Y 数值。
这里 0 代表无的意思,1代表向正方向(向上或向右),-1代表负方向(向下或向左),于是得到如下图的设置:
之后打开在ruby身上的C#脚本,编辑加入设置的待机动画。
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class PlayerContal : MonoBehaviour 6 { 7 public float speed = 5f; 8 9 Rigidbody2D rbody; 10 11 private float _x; 12 private float _y; 13 14 private Vector2 lookDir = Vector2.down;//向量向下 ////// 15 private Vector2 currentInput; 16 private Animator _animator; /////// 17 18 void Start() 19 { 20 rbody = GetComponent<Rigidbody2D>(); 21 _animator = GetComponent<Animator>(); ////// 22 //初始化 23 } 24 25 void Update() 26 { 27 _x = Input.GetAxis("Horizontal"); 28 _y = Input.GetAxis("Vertical"); 29 30 Vector2 movement = new Vector2(_x, _y); 31 ////////******/////// 32 //动画部分,移动发生时,对朝向进行赋值 33 if(!Mathf.Approximately(movement.x, 0.0f) || !Mathf.Approximately(movement.y, 0.0f)) 34 { 35 lookDir.Set(movement.x, movement.y); 36 //对朝向进行归一化,更好的控制人物 37 lookDir.Normalize(); 38 } 39 //选择SetFloat和之间设置的浮点型进行对应 40 //lookx looky 就是之前设置的blend tree中的名称 41 _animator.SetFloat("lookx",lookDir.x); 42 _animator.SetFloat("looky",lookDir.y); 43 ////////*******/////// 44 currentInput = movement; 45 } 46 47 private void FixedUpdate() 48 { 49 Vector2 position = rbody.position; 50 position += currentInput * speed * Time.deltaTime; 51 rbody.MovePosition(position); 52 } 53 }
加入了Animator和向量lookDirection。!Mathf.Approximately(string name, float num),是用来判断位置移动,是将位置移动与0.0进行比较(浮点数的比较)。
lookDirection.Set();是对朝向进行赋值,是将我们通过键盘移动的值和lookDirection关联起来。
lookDirection.Normalize();我们只考虑方向,所以要进行归一化,方向在0~1范围,就不会出现奇怪的朝向。
然后将设置的lookx和looky和Animator关联起来。增加Animator变量,并进行GetConponent初始化。
_animator.SetFloat("string", ...)(这里是要和我们之前设置好的东西一致,SetFloat\SetBool\...)
注意_animator.SetFloat中的名称一定要和之前设置的名称相同,比如设置的是"look x",就不能写成"lookx",这里我出错了之后将unity中的设置改为了lookx & looky
类似于之前添加帧动画的操作,新建后拖入帧,然后复制第一帧到最后一帧的位置。
回到我们建立的Animation文件夹下的Player的图中,删除新加入的runup...,新建Blend Tree,双击进入Tree,与上面同样的操作,注意一定要是上左右下。如图:
然后回到面板建立Run与Idle两个树之间的联系。
右键选中Make Translation
双向指向,因为两者同时有反馈能够传达给对方。接下来设置联系的属性。选中由Idle到Run的箭头,右边面板更改属性如下(Speed依然是在parameters中添加的):
就是说,当我的速度大于0.1时,我操作的人物的运动状态更改为Run。
由Run到Idle的箭头则设置为speed -> Less -> 0.1
当速度小于0.1时人物运动状态更改为idle 。
接下来设置运动状态的转移时间:
因为我们希望人物能够立刻更改运动状态,所以将Inspector -> Has Exit Time去掉勾选 -> Setings -> Fixed Duration去掉勾选 -> Transtion Duration设为0
两个箭头是一样的设置(๑ᵔ⌔ᵔ๑).
之前图片上面的参数设置错了不知道你有没有发现TVT.
让我们先去编码吧!
_animator.SetFloat("speed", movement.magnitude); //magnitude(求模)是将数值变换限制在我们规定的范围内
只加入了这一句就能够完成我们所需要的功能了!
哈哈,但是我运行之后发现我的人物在跑动的时候只有向后和向左的动画,这是怎么回事呢?找了半天最后发现是这里的问题orz
之前两个元素都选成了lookx! orz!
可以成功运行了!还真是不容易呢!(๑ᵔ⌔ᵔ๑)
请发表评论