当前位置: 首页 > news >正文

【Unity-Animator】通过 StateMachineBehaviour 实现回调

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。
在这里插入图片描述

http://www.lryc.cn/news/521170.html

相关文章:

  • 鸿蒙中自定义slider实现字体大小变化
  • 数据结构与算法之栈: LeetCode 71. 简化路径 (Ts版)
  • STM32-笔记40-BKP(备份寄存器)
  • NAS中不同RAID级别特点与适用场景
  • node.js的进程保活
  • meta name=“viewport“ content=“width=device-width, initial-scale=1.0“
  • 【vue3】 defineExpose 的使用
  • 思维转换:突破思维桎梏,创造更高效的工作与生活
  • OpenCV相机标定与3D重建(55)通用解决 PnP 问题函数solvePnPGeneric()的使用
  • vue3学习日记5 - 项目起步
  • java导出pdf文件
  • 【MySQL学习笔记】MySQL视图View
  • 从玩具到工业控制--51单片机的跨界传奇【2】
  • 【Redis】初识Redis
  • docker虚拟机平台未启用问题
  • 《零基础Go语言算法实战》【题目 2-22】Go 调度器优先调度问题
  • 关于使用FastGPT 摸索的QA
  • 关于H5复制ios没有效果
  • 【STM32-学习笔记-3-】TIM定时器
  • EMS专题 | 守护数据安全:数据中心和服务器机房环境温湿度监测
  • Vue JavaScript 小写数字金额转换成大写汉字(附编程思路)
  • 【自动化测试】—— Appium安装配置保姆教程(图文详解)
  • 贪心算法详细讲解(沉淀中)
  • RabbitMQ中有哪几种交换机类型?
  • STM32特殊功能引脚详解文章·STM32特殊功能引脚能当作GPIO使用嘛详解!!!
  • Qt QComboBox的QSS美化
  • 计算机视觉算法实战——实时车辆检测和分类(主页有相关源码)
  • what?ngify 比 axios 更好用,更强大?
  • 安装虚拟机VMware遇到的问题
  • 通过ESP32和INMP441麦克风模块实现音频数据传递