状态机的状态(State)
每个Animator Controller都会自带三个状态:Any State, Entry和 Exit。

1、Any State状态
表示任意状态的特殊状态。
例如我们如果希望角色在任何状态下都有可能切换到死亡状态,那么Any State就可以帮我们做到。
当你发现某个状态可以从任何状态以相同的条件跳转到时,那么就可以用Any State来简化过渡关系。
2、Entry状态
表示状态机的入口状态。
当我们为某个GameObject添加上Animator组件时,这个组件就会开始发挥它的作用。
如果Animator Controller控制多个Animation的播放,那么默认情况下Animator组件会播放哪个动画呢? 由Entry来决定的。
但是Entry本身并不包含动画,而是指向某个带有动画的状态,并设置其为默认状态。被设置为默认状态的状态会显示为 橘黄色。

可以随时在任意一个状态上通过 鼠标右键->Set as Layer Default State更改默认状态。

Entry在Animator组件被激活后 无条件 跳转到默认状态,并且每个Layer有且仅有一个默认状态。
3、Exit状态
表示状态机的出口状态,以红色标识。如果你的动画控制器只有一层,那么这个状态可能并没有什么卵用。
但是当你需要从子状态机中返回到上一层(Layer)时,把状态指向Exit就可以了。

动画状态的属性
我们可以选中某个自定义状态,并在Inspector窗口下观察它具有的属性

属性名
|
描述
|
Motion
|
状态对应的动画。每个状态的基本属性,直接选择已定义好的动画(Animation Clip)即可
|
Speed
|
动画播放的速度。默认值为1,表示速度为原动画的1.0倍。
|
Mutiplier
|
勾选右侧的Parameter后可用,即在计算Speed的时考虑 区域1 中定义的某个参数。若选择的参数为smooth, 则动画播放速度的计算公式为 smooth * speed * fps(animation clip中指定)
|
Mirror
|
仅适用于humanoid animation(人型机动画)
|
Cycle Offset
|
周期偏移,取值范围为0-1.0,用于控制动画起始的偏移量。把它和正弦函数的offset进行对比就能够理解了,只会影响起始动画的播放位置。
|
Foot IK
|
仅适用于humanoid animation(人型机动画)
|
Write Default
|
最好保持默认,感兴趣可以参考官方手册
|
Transitions
|
该状态向其他状态发起的过渡列表,包含了Solo和Mute两个参数,在预览状态机的效果时起作用
|
Add Behaviour
|
用于向状态添加“行为”
|
状态间的过渡关系(Transitions)
直观上说它们就是连接不同状态的有向箭头

要创建一个从状态A到状态B的过渡,直接在状态A上 鼠标右键 - Make Transition并把出现的箭头拖拽到状态B上点击鼠标左边即可。

添加状态控制参数
参数有Float,Int,Bool,Trigger。

Float、Int用来控制一个动画状态的参数,比如速度方向等可以用数值量化的东西,
Bool用来控制动画状态的转变,比如从走路转变到跑步,
Trigger本质上也是bool类型,但它默认为false,且当程序设置为true后,它会自动变回false。
编辑切换状态的条件
点击连线,在Inspecter窗口中可以进行设置,在Conditions栏下可以添加条件,如下图表示当参数
AnimState为0时会执行这个动画Any State到New Animation2的过渡
必须在Parameters面板中添加了参数才可以在这里查看到,其次添加的条件为&&”与”关系,即必须同时满足。

代码中控制状态
我们可以通过代码来设置条件状态,达到动画切换的目的
Animator ator = go1.GetComponent<Animator>();
ator.SetInteger("AnimState", 0);
上面的代码,让AnimState这个参数值为0,满足了从Any State到New Animation2的过渡条件,从而实现New Animation2动画的过渡。
检查动画状态
1.AnimatorStateInfo
在脚本中添加代码
//检查是否正在播放jump动画
.
AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(0);
bool playingJump = stateinfo.IsName("jump");if(playingJump){
if(stateinfo.normalizedTime < 1.0f)
{
//
正在播放
}
else
{
//
播放结束
}
}
当处于状态jump,则stateinfo.IsName("jump")返回true
控制播放速度
Animator ator = go1.GetComponent<Animator>();
var stateinfo = ator.GetCurrentAnimatorStateInfo(0);
if(stateinfo.IsName("Jump"))
{
ator.speed = 2;
}
注意事项
1 取消勾选 Can Transition To Self,不然动画会出现抖动

2 动作循环。不然如果没有下个状态切换,直接停止动作

3 Has Exit Time,如果勾选了,则表示在该动作完成后才允许切换,但是一般我们要的都是立即切换,所以这里 不要勾选

1、Mirror
镜像,可以反转当前动画.

2、Solo与Mute
Mute相当于把目标过渡禁用掉。Solo表示只生效这一条过渡
可以多选,当选中后会出现箭头提示
条件满足优先于Solo/Mute,当条件没有满足时依然不会过渡
Solo,勾选后,只会在所有 勾选Solo 中切换,其他默认等同 勾选Mute
Mute,勾选后,不会切入到该状态
