混合树用于允许通过按不同程度组合所有动画的各个部分来平滑混合多个动画。各个运动参与形成最终效果的量使用混合参数进行控制。
在Animator Controller中右键Create State->From New Blend Tree创建动画混合树;
可以看到,是通过控制Key值来混合动画的,我这里有三个动画。
当key=0时,会播放idle动画;
当0<key<1时,会混合idle和walk动画;
当key=1时,会播放walk动画;
当1<key<2时,会混合walk和run动画;
当key=2时,会播放run动画;
添加动画的方式:在Inspector中点击加号,再将需要的动画拖拽到空位中
在动画混合树中,使用SetFloat("key",value)来控制;
void Update()
{
if (Input.GetKeyDown(KeyCode.LeftShift))
{
run = true;
}
h = Input.GetAxis("Horizontal");
v = Input.GetAxis("Vertical");
x = Mathf.Sqrt((h * h) + (v * v));//斜45度方向
anim.SetFloat("forward", x* (run ? 2.0f : 1.0f));
//model.transform.forward += v * transform.forward + h * transform.right;//控制角色转向
model.transform.forward = Vector3.Slerp(model.transform.forward, v * transform.forward + h * transform.right, 0.3f);
//平滑人物转向
moving = x * model.transform.forward * walkspeed * (run ? 2.0f : 1.0f);
}
private void FixedUpdate()
{
rigid.position += moving * Time.fixedDeltaTime;
}
这段代码可以测试模型的走、跑、停止的动画
备注
如果在跳跃时发现会跳两次,那么可以在动画混合树上,添加一个脚本就可以解决此问题了。
public class FSMClearSignals : StateMachineBehaviour
{
public string[] clearAtEnter;
public string[] clearAtExit;
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
foreach (var signal in clearAtEnter)
{
animator.ResetTrigger(signal);
}
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
foreach (var signal in clearAtExit)
{
animator.ResetTrigger(signal);
}
}
}