混合树表示多个状态的混合调用,一般根据某些参数来实现这些动画状态之间的混合与切换,根据参数的个数可以分为1D混合、2D混合和直接混合。比如在之前的案例中,我们通过控制Float参数Speed实现了Idle、Run、Walk之间的过渡,我们这里也可以通过混合树来实现。1D混合如下图所示。
设定混合类型为1D添加混合参数Speed添加Motion,并设定Motion在的门坎值。 我们通过一个混合树就实现了之前通过三个状态并设定过渡条件实现的功能。 除了1D混合,我们还可以2D混合,2D混合有三种不同类型: 2D simple Directional,表示在二维每个空间方向只能有一个动作;2D Freedom Directional,表示在二维每个空间方向可以有两个动作,但是必须一个是Idle。2D Freedom Cartesian,表示在笛卡尔二维空间中各个方向可以随便设定动作。这个是最常用的。 下面我们在1D的基础上,增加三个动作,后退、左转和右转,那么1D混合满足不了需求了,我们需要用2D混合类型,通过2D类型控制了6个Motion的切换。子状态相当于在目前层的状态机下面建立一个自状态集合,可以将类似的动画装填结合在一起,简化动画逻辑。典型的子状态机如下所示(Attack是子状态机):
状态行为即为状态机中的状态添加脚本,在状态进入、更新事件、IK、根动画时进行一些脚本控制。
状态行为脚本继承的类是StateMachineBehaviour,包括五个回调函数。他们的回调时机可以从Unity提供的注释得知:
using UnityEngine; using System.Collections; public class Test : StateMachineBehaviour { // OnStateEnter is called before OnStateEnter is called on any state inside this state machine //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateExit is called before OnStateExit is called on any state inside this state machine //override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateMove is called before OnStateMove is called on any state inside this state machine //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateIK is called before OnStateIK is called on any state inside this state machine //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateMachineEnter is called when entering a statemachine via its Entry Node //override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash){ // //} // OnStateMachineExit is called when exiting a statemachine via its Exit Node //override public void OnStateMachineExit(Animator animator, int stateMachinePathHash) { // //} }状态行为可以用于添加状态发生时的音效、控制碰撞检测代码等。