状态机行为脚本 & 状态机复用

1、状态机行为脚本

状态机行为脚本时一类特殊的脚本,继承指定的基类,它主要用于关联到状态机中的状态矩形上

我们可以按照一定规则编写脚本,当进入、退出、保持在某一个特定状态时我们可以进行一些逻辑处理

简单解释就是为Animator Controller状态机窗口中的某一个状态添加一个脚本,利用这个脚本我们可以做一些特殊功能

比如

  • 进入或退出某一状态时播放声音

  • 仅在某些状态下检测一些逻辑,比如是否接触地面等等

  • 激活和控制某些状态相关的特效

2、如何使用状态机脚本

(1)新建一个脚本继承StateMachineBehaviour基类
(2)实现其中的特定方法进行状态行为监听

OnStateEnter

进入状态时,第一个Update中调用

OnStateExit

退出状态时,最后一个Update中调用

OnStateIK

OnAnimatorIK后调用

OnStateMove

OnAnimatorMove后调用

OnStateUpdate

除第一帧和最后一帧,每个Update上调用

OnStateMachineEnter

子状态机进入时调用,第一个Update中调用

OnStateMachineExit

子状态机退出时调用,最后一个Update中调用

(3)处理对应逻辑

3、状态机行为脚本和动画事件如何选择

状态机行为脚本相对动画事件来说更准确,但是使用起来稍微麻烦一些,根据实际需求选择使用。

public class Test_StateMachineBehaviour : StateMachineBehaviour
{
    public string stateName;
    public string musicName;
    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);
    }
}

5、状态机复用

游戏开发时经常遇到这样的情况,有n个玩家和n个怪物,他们的动画状态机行为都是一致的,只是对应的动作不同而已,这时如果我们为他们每一个对象都创建一个状态机进行状态设置和过渡设置无疑是浪费时间的

所以状态机复用就是解决这一问题的方案,主要用于为不同对象使用共同的状态机行为。减少工作量,提升开发效率

6、如何复用状态机

(1)在Project窗口右键Create->Animator Override Controller
(2)为Animator Override Controller文件在Inspector窗口关联基础的Animator Controller文件
(3)关联需要的动画

猜你喜欢

转载自blog.csdn.net/Go_Accepted/article/details/128892097