BlendTree介绍
Blend Tree用于多个动画之间的混合,比如走到跑的切换、转弯的切换。
BlendTree
BlendTree创建
双击混合树 (Blend Tree) 以进入混合树图 (Blend Tree Graph);
混合节点 (Blend Node)的检视器 (Inspector) 中的第一个选项是混合类型 (Blend Type)。此下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。二维混合 (2D Blending) 类型根据两个参数混合子运动。
Blend Type
一维混合 (1D Blending) 根据单个参数混合子运动。
二维简单方向 (2D Simple Directional)
最适用于运动表示不同方向时,如“向前行走”、“向后行走”、“向左行走”和“向右行走”或是“向上瞄准”、“向下瞄准”、“向左瞄准”和“向右瞄准”。可以选择包括位置 (0, 0) 处的单个运动,如“空闲”或“笔直瞄准”。在简单方向 (Simple Directional) 类型中,相同方向上不应存在多个运动,如“向前行走”和“向前奔跑”。
二维任意方向 (2D Freeform Directional)
此混合类型也在运动表示不同方向时使用,但是可以在相同方向上具有多个运动,例如“向前行走”和“向前奔跑”。在任意方向 (Freeform Directional) 类型中,运动集应始终包括位置 (0, 0) 处的单个运动,如“空闲”。
二维任意笛卡尔 (2D Freeform Cartesian)
最适用于运动不表示不同方向时。使用任意笛卡尔 (Freeform Cartesian) 时,X 参数和 Y 参数可以表示不同概念,如角速度和线速度。示例包括“向前行走而不转弯”、“向前奔跑而不转弯”、“向前行走并右转”、“向前奔跑并右转”等运动。
一维混合 (1D Blending)
右击我们的混合树添加3个Motion,
同时我们设定好3个方向的跑动动画:
我们还需要设定一个名为Direction的Float类型的参数来控制这个混合树:
Parameter:设置动画根据哪个参数进行融合;
Automate Thresholds:是否自动选择参数;
Time Scale
通过动画速度这一列(图标是一个表)可以调节动画的播放速度,比如你想让跑步的动画播放速度变为原来的2倍,可以设置为2。
**Adjust Time Scale > Homogeneous Speed ** 可以将动画的速度调整对应到参数的最小值和最大值,但是保持动画的初始相对速度。
按钮可以将动画的播放速度调整到动画列表中所有动画速度的平均值。
Mirroring 镜像
上面复选框可以左右镜像一个humanoid类型的动画Clip。这个功能可以使用同一个动画创建出来两个方向的动画,可以节省一倍的存储空间和内存。
比如一个向左走的动画,通过镜像可以创建出一个向右走的动画。
代码控制移动转向:
using UnityEngine;
public class TestBlendTree : MonoBehaviour
{
public float DirectionDampTime = 30.0f;//动画之间的最大差值
private Animator _animator;
void Start()
{
_animator = this.GetComponent<Animator>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
_animator.SetBool("run", true);
if (Input.GetKeyUp(KeyCode.W))
_animator.SetBool("run", false);
AnimatorStateInfo state = _animator.GetCurrentAnimatorStateInfo(0);
//奔跑状态下才允许转弯
if (state.shortNameHash == Animator.StringToHash("Run"))
{
//指定人物转弯通过控制混合数的参数即可
float h = Input.GetAxis("Horizontal") * 130.0f;
//DirectionDampTime 指示了每秒可以到达的最大值
//deltaTime 表示当前帧的时间
_animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);
}
else
//重置一下参数
_animator.SetFloat("Direction", 0);
}
}
二维混合树
2D Simple Directional(2D简单方向):当你的运动代表不同的方向,如“向前走”,“向后走”,“向左走”,“向右走”,或“向上瞄准”,“向下瞄准”,“左瞄“和”右瞄“。当然了,可以在(0,0)处包含一个默认动作类似“空闲站立”或“直线瞄准”。与1D混合树不同的是,2D Simple Directional不是在同一个方向上的多个动作,比如“走”和“跑”。
2D Freeform Directional(2D自由方向):动画运用有不同的方向时,也可以使用这种混合类型:可以在同一个方向上有多个运动,例如“走”和“跑”。在Freeform Directional类型中,(0,0)位置必须包含一个默认动作,如“空闲站立”。
2D Freeform Cartesian(2D自由笛卡儿):当混合的2个参数不代表不同的方向时使用。使用Freeform Cartesian,参数X和Y可以表示不同的概念类型,例如角速度和线速度。举个例子:“向前走不转向”,“向前跑不转向”,“向前走并右转”,“向前跑并右转”等动作。
新建两个参数:SpeedZ和SpeedRotate,一个控制直线移动,一个控制转弯。
我们使用2D Freeform Directional
设置X Position From—Augular Speed(Deg角度)
设置Y Position From—VelocityZ(Z轴速度)
private int speedZID = Animator.StringToHash("SpeedZ");
private int speedRotateID = Animator.StringToHash("SpeedRotate");
private float speedMax = 4.1f;
private float speedRotateMax = 126.1f;
private float dampTime = 0.2f;
private Animator anim;
void Start()
{
anim = gameObject.GetComponent<Animator>();
}
void Update()
{
anim.SetFloat(speedZID, Input.GetAxis("Vertical")*speedMax);
anim.SetFloat(speedRotateID, Input.GetAxis("Horizontal")*speedRotateMax,dampTime,Time.deltaTime);
}
//SetFloat的另一种重载方式
//第3个参数表示完成变化所需要的时间,可以给一个比较小的值,相当于自带了一个插值运算Lerp,是动画更加平滑
//第4个参数表示执行该方法的时间间隔,我们的动画是每帧都在运动,所以设置为Time.deltaTime
每个混合树的动画有一些要注意的地方
动画长度需要一致
动画的起始姿势需要一致