在之前的移动脚本中,虽然成功完成了移动,但是所有移动都没有动画效果,正常的游戏中,我们向左或向右移动应该会有相应的动画效果,因此我们用Blend Tree实现。
角色移动脚本:传送门
1.创建一个玩家空闲状态
玩家没有任何操作的时候,应当有一个空闲动画状态,因此我们可以使用之前的动画创建方式创建一个Idle的空闲状态:
动画创建:传送门
Animator视图
动画的状态设置在Animator视图中,双击精灵相应的Animator Controller文件即可自动打开视图:
2.将空闲状态设置成我们玩家的默认状态
选中我们创建的空闲动画,右键选中Set as Layer Default State,将我们的Idle设置成默认动画,这样玩家在不行动的情况下就会播放这个动画:
变成默认动画状态成功后,动画的颜色会变成橙色:
默认的状态
3.创建Blend Tree
在我们Animator视图的空白处右键,Create State -> From New Blend Tree创建一个Blend Tree:
双击我们的Blend Tree,会打开一个新的视图,可以编辑我们的Blend Tree:
Blend Tree视图
4.创建动画参数
动画参数相当于一个开关,可以使用这些参数让动画应该展示什么,如果使用编程语言来描述,就类似于if判断,因此我们在执行动画的时候只要设置相应参数的值,即可播放相应的动画:
查看我们Animator左上角的Parameters标签,打开后点击+号可以创建各种类型的参数:
Float:浮点类型,该参数是带有小数点的数值,如1.2、3.4;
Int:整数类型,如1、3、4;
Bool:布尔类型,如true、false;
Trigger:触发器类型,触发动画后会自动恢复为之前的状态。
本次我们创建三个Float类型的参数:Horizontal、Vertical、Magnitude:
Horizontal:触发播放向左或向右的动画;
Vertical:触发播放向上或向下的动画;
Magnitude:触发从Idle到移动的动画。
5.调整Blend Tree属性
Blend Tree属性面板我们使用Blend Type为2D Simple Directional,这样我们的动画会受到两个动画参数影响。
这里我们将Parameters选择为我们设置的Horizontal和Vertical。
接下来在下面点击+号,创建六个条件,每个条件如上图设置(如果有左上、右上、左下、右下的动画文件,可以进行相应替换),每个条件设置好Pos X和Pos Y后,上方就会出现一个完美的六边形。
Pos X表示我们的Horizontal值大于方框内的值,Pos Y表示我们的Vertical值大于方框内的值,我们就会播放相应条件的动画,我们可以拖动中心的红点来预览动画,这个过程有点像手机游戏中的方向键圆盘:
6.调整Idle到Blend Tree的过渡条件
选中我们的Idle,右键Make Transition拉出一条线连接我们的Blend Tree,然后选中Blend Tree,右键Make Transition拉出一条线连接Idle:
完成之后如下:
拉线完成
选择Idle -> Walk的线(我已经将Blend Tree重命名为Walk),面板属性中按+号添加Magnitude大于0:
Magnitude大于0
选择Idle <- Walk的线,面板属性中按+号添加Magnitude小于0.001:
Magnitude小于0.001其实相当于Magnitude等于0,由于浮点型的特殊性质,无法完全等于0,因此小于0.001就相当于等于0;
Has Exit Time取消打勾,不会产生退出动画的时间;
Transition Duration(s)设置为0,将会在动画和动画转换时没有过渡时间,直接转换。
修改MovementController文件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovementController : MonoBehaviour
{
public Rigidbody2D rBody;
public Animator animator;
public float speed = 1;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
private void FixedUpdate()
{
Vector2 movement = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
Vector2 targetPos = rBody.position + movement * Time.deltaTime * speed;
animator.SetFloat("Horizontal", movement.x);
animator.SetFloat("Vertical", movement.y);
animator.SetFloat("Magnitude", movement.magnitude);
rBody.MovePosition(targetPos);
}
}
public Animator animator:获取动画控制器,如果只想自己使用,可以 使用animator = GetComponent<Animator>()获取;
movement.magnitude代表长度,所以我们可以判断如果长度为0,则要变为Idle;如果长度大于0,我们就需要进入Walk的Blend Tree;
animator.SetFloat("xxxxx", xxxx)这个方法就相当于开启动画的开关,我们根据方向按键的值来进行相关动画的播放;
关于移动动画脚本相关:传送门
7.挂载脚本预览效果
脚本挂载动画效果
网友评论