Contents

状态机行为脚本

状态机行为脚本是什么?

  • 状态机行为脚本时一类特殊的脚本,继承指定的基类
  • 当进入、退出、保持在某一个特定状态时我们可以进行一些逻辑处理
  • 利用这个脚本我们可以做一些特殊功能
  • 比如进入或退出某一状态时播放声音,仅在某些状态下检测一些逻辑,比如是否接触地面等等

如何使用状态机脚本

  1. 新建一个脚本继承StateMachineBehaviour基类
  2. 实现其中的特定方法进行状态行为监听
  • OnStateEnter 进入状态时,第一个Update中调用
  • OnStateExit 退出状态时,最后一个Update中调用
  • OnStateIK OnAnimatorIK后调用
  • OnStateMove OnAnimatorMove后调用
  • OnStateUpdate 除第一帧和最后一帧,每个Update上调用
  • OnStateMachineEnter 子状态机进入时调用,第一个Update中调用
  • OnStateMachineExit 子状态机退出时调用,最后一个Update中调用
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    if( stateInfo.IsName(stateName) )
        Debug.Log("进入HumanoidIdle状态");
}

public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    if (stateInfo.IsName("HumanoidIdle"))
        Debug.Log("退出HumanoidIdle状态");
}

public override void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    base.OnStateIK(animator, stateInfo, layerIndex);
}

public override void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    base.OnStateMove(animator, stateInfo, layerIndex);
}

public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    base.OnStateUpdate(animator, stateInfo, layerIndex);
    if (stateInfo.IsName("HumanoidIdle"))
        Debug.Log("处于HumanoidIdle状态");
}

public override void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
{
    base.OnStateMachineEnter(animator, stateMachinePathHash);
}

public override void OnStateMachineExit(Animator animator, int stateMachinePathHash)
{
    base.OnStateMachineExit(animator, stateMachinePathHash);
}