Unity2022编辑器为动画添加的脚本StateMachineBehaviour

在Unity 2022中,StateMachineBehaviour是一个脚本类,可以用于扩展Animator State Machine的行为。当该脚本被添加到Animator State Machine中的任何状态时,它将在状态机转换到该状态时被调用。StateMachineBehaviour类默认包含以下四个方法:

1. OnStateEnter:当状态机进入该状态时调用。可以在该方法中执行一些初始化操作。

2. OnStateUpdate:在状态机更新该状态时调用。可以在该方法中执行一些操作,例如更新游戏对象的位置、旋转等状态。

3. OnStateExit:当状态机退出该状态时调用。可以在该方法中执行一些清理操作。

4. OnStateMove:在状态机更新该状态时调用,用于处理Root Motion。当动画包含Root Motion时,可以使用该方法来更新游戏对象的位置、旋转等状态。

除了上述四个默认方法外,StateMachineBehaviour还提供了一些虚方法可以供子类覆盖:

1. OnStateIK:在状态机更新该状态时调用,用于处理IK(Inverse Kinematics)。

2. OnStateMachineEnter:当状态机进入该状态时调用。与OnStateEnter不同的是,该方法不仅在状态机进入该状态时调用,还在状态机中任何状态之间切换时调用。

3. OnStateMachineExit:当状态机退出该状态时调用。与OnStateExit不同的是,该方法不仅在状态机退出该状态时调用,还在状态机中任何状态之间切换时调用。

4. OnStateIK:在状态机更新该状态时调用,用于处理IK(Inverse Kinematics)。

5. OnStateMoveTransition:在状态机中的转换过渡期间调用。可以在该方法中执行一些操作,例如更新游戏对象的位置、旋转等状态。

使用StateMachineBehaviour可以让开发者更加灵活地控制Animator State Machine的行为,从而实现更加复杂的动画效果。例如,在OnStateEnter方法中可以实现动画的预处理,如禁用某些组件或者添加一些特效;在OnStateExit方法中可以实现状态的清理,如恢复组件状态或者停止特效的播放。同时,在OnStateUpdate方法中可以实现动画的实时更新,如根据动画状态更新游戏对象的位置、旋转等状态,使得动画效果更加真实。

当我们向Animator State Machine中的某个状态添加了StateMachineBehaviour脚本之后,该脚本中默认包含以下四个方法:

1. OnStateEnter:


public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    // 在状态进入时被调用,可以在这里进行一些初始化操作
}

在该方法中,animator参数表示触发状态进入事件的动画控制器,stateInfo参数表示所触发状态的当前状态信息,layerIndex参数表示所触发状态所在的层级。

例如,可以通过以下代码实现当动画状态进入时,将游戏对象的位置设置为指定位置:


public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    animator.transform.position = new Vector3(0, 1, 0);
}

2. OnStateUpdate:

public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    // 在状态更新时被调用,可以在这里进行一些操作
}


 

在该方法中,animator参数表示触发状态更新事件的动画控制器,stateInfo参数表示所触发状态的当前状态信息,layerIndex参数表示所触发状态所在的层级。

例如,可以通过以下代码实现当动画状态更新时,将游戏对象随机旋转:

public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    animator.transform.Rotate(new Vector3(0, Random.Range(0, 360), 0));
}


3. OnStateExit:

public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    // 在状态退出时被调用,可以在这里进行一些清理操作
}


 

在该方法中,animator参数表示触发状态退出事件的动画控制器,stateInfo参数表示所触发状态的当前状态信息,layerIndex参数表示所触发状态所在的层级。

例如,可以通过以下代码实现当动画状态退出时,将游戏对象的位置恢复到原始位置:

public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    animator.transform.position = Vector3.zero;
}


 

4. OnStateMove:

public override void OnStateMove(Animator animator,AnimatorStateInfo stateInfo, int layerIndex)
{
    // 在状态更新时被调用,用于处理Root Motion
}


 

在该方法中,animator参数表示触发状态更新事件的动画控制器,stateInfo参数表示所触发状态的当前状态信息,layerIndex参数表示所触发状态所在的层级。

例如,可以通过以下代码实现当动画包含Root Motion时,根据动画状态更新游戏对象的位置:

public override void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    Vector3 position = animator.deltaPosition;
    position.y = 0; // 忽略y轴位移
    animator.transform.position += position;
}


 

除了上述四个默认方法外,StateMachineBehaviour还提供了一些虚方法可以供子类覆盖,例如OnStateMachineEnter、OnStateMachineExit、OnStateIK等。使用这些方法可以在Animator State Machine中实现更加复杂的动画行为。例如,可以在OnStateIK方法中实现角色的IK效果,使得角色的手部、脚部等能够更加真实地跟随环境。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值