U3L14-3——代码控制动画状态机切换

关键组件Animator参数相关

image

  • Controller:对应的动画控制器(状态机)

  • Avatar:对应的替身配置信息(之后讲解3D模型时详细讲解)

  • Apply Root Motion:是否启用动画位移更新

    如果要使用动作目标匹配,则该选项必须启用!

  • UpdateMode:更新模式(一般不修改它)

    • Normal:正常更新
    • Animate Physics:物理更新
    • Unscaled Time:不受时间缩放影响
  • Culling Mode:裁剪剔除模式

    • Always Animate:始终播放动画,即使在屏幕外也不剔除
    • Cull Update Transforms:摄像机没有渲染该物体时,停止位置、IK的写入
    • Cull Completely:摄像机没有渲染物体时,整个动画被完全禁用

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
Animator                                //动画状态机类
animator.SetFloat() //设置状态机的float类型条件
animator.SetInteger() //设置状态机的Bool类型条件
animator.SetBool() //设置状态机的Int类型条件
animator.SetTrigger() //设置状态机的Trigger类型条件
animator.GetFloat() //获取状态机的Float类型的值
animator.GetInteger() //获取状态机的Int类型的值
animator.GetBool() //获取状态机的Bool类型的值
animator.Play() //直接切换到某个动画
animator.runtimeAnimatorController //动画状态机使用的状态机文件
RuntimeAnimatorController //状态机文件类

Animator中的API

我们用代码控制状态机切换主要使用的就是Animator提供给我们的API
我们知道一共有四种切换条件 intfloatbooltrigger
所以对应的API也是和这四种类型有关系的

1
animator = GetComponent<Animator>();

通过状态机条件切换动画

1
2
3
4
animator.SetFloat("条件名", 1.2f);
animator.SetInteger("条件名", 5);
animator.SetBool("条件名", true);
animator.SetTrigger("条件名");
1
2
3
4
5
6
7
8
if (Input.GetKeyDown(KeyCode.A))
{
animator.SetBool("change", true);
}
if (Input.GetKeyDown(KeyCode.S))
{
animator.SetBool("change", false);
}

···

获取状态机条件对应的值

1
2
3
animator.GetFloat("条件名");
animator.GetInteger("条件名");
animator.GetBool("条件名");

直接切换动画

除非特殊情况 不然一般不使用

1
animator.Play("状态名");

动画状态机加载状态机文件

如果动画要加载某个状态机文件,需要注意属性名为runtimeAnimatorController​,使用RuntimeAnimatorController​类

1
animator.runtimeAnimatorController = Resources.Load<RuntimeAnimatorController>(info.animator);