StateMachineBehaviour
简介
StateMachineBehaviour是一个基类,所有状态脚本都派生自该类。它可以在状态机进入、退出或更新状态时执行代码,而无需编写自己的逻辑来测试和检测状态的变化。这使得开发者可以更方便地处理状态转换时的逻辑,例如播放音效、改变角色状态等
优点
清晰的状态管理:可以针对每个状态实现独立的逻辑。
灵活扩展:无需修改原有代码,通过 Animator 的状态机即可实现功能。
注意事项
StateMachineBehaviour 脚本是状态的扩展,与具体的动画剪辑分离。
如果多个状态共享同一个 StateMachineBehaviour,需要通过 stateInfo.shortNameHash 或状态名进行区分。
实现回调
创建 StateMachineBehaviour 脚本
右键点击项目视图,选择 Create -> C# Script,命名为 CustomStateBehaviour。
修改脚本内容如下:
using UnityEngine;
public class CustomStateBehaviour : StateMachineBehaviour
{
// 动画状态进入时调用
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
Debug.Log($"Entered state: {stateInfo.shortNameHash}");
// 触发某个逻辑,例如播放音效
animator.GetComponent<YourComponent>()?.PlaySound();
}
// 动画状态更新时调用
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
Debug.Log($"Updating state: {stateInfo.shortNameHash}, Time: {stateInfo.normalizedTime}");
}
// 动画状态退出时调用
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
Debug.Log($"Exited state: {stateInfo.shortNameHash}");
// 停止某些逻辑
animator.GetComponent<YourComponent>()?.StopEffect();
}
}
将脚本应用到 Animator 状态
打开 Animator Controller。
选择一个动画状态。
在右侧的 Inspector 面板中点击 Add Behaviour 按钮。
选择刚才创建的 CustomStateBehaviour 脚本。
为对象添加组件(可选)
假设 CustomStateBehaviour 中需要访问一个脚本 YourComponent,可以创建如下脚本并挂载到带有 Animator 的对象上:
using UnityEngine;
public class YourComponent : MonoBehaviour
{
public void PlaySound()
{
Debug.Log("Playing sound...");
// 实现播放音效逻辑
}
public void StopEffect()
{
Debug.Log("Stopping effect...");
// 实现停止特效逻辑
}
}
运行测试
当动画状态进入时,控制台会打印 Entered state。
每帧更新时,打印 Updating state。
动画状态退出时,打印 Exited state。