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

【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.kler.cn/a/507370.html

相关文章:

  • 意图颠覆电影行业的视频生成模型:Runway的Gen系列
  • 使用 ChatGPT 生成和改进你的论文
  • kalilinux - 目录扫描之dirsearch
  • MySQL NaviCat 安装及配置教程(Windows)【安装】
  • Linux的常用命令(三)
  • apidoc thinkphp likeadmin 遇到解析报错
  • 华为HCIE-Security考试心得
  • SpringMVC复习笔记
  • Oracle系列---【Smallfile模式的表空间如何确定单个数据文件的最大大小?】
  • 踏上 C++ 编程之旅:开篇之作
  • Observability:组装 OpenTelemetry NGINX Ingress Controller 集成
  • yt-dlp脚本下载音频可选设置代理
  • 探索 Linux:(一)介绍Linux历史与Linux环境配置
  • 鸿蒙UI开发——文本级联选择器
  • 基于Python招聘职位数据采集与数据可视化分析
  • 用 HTML5 Canvas 和 JavaScript 实现雪花飘落特效
  • 基于Matlab实现微带贴片天线仿真程序
  • 深入探索Vue.js 3中基于Composition API的动态组件开发
  • 源码编译http
  • 让iPhone自带浏览器Safari能自动播放Video视频的办法
  • Python----Python高级(面向对象:封装、继承、多态,方法,属性,拷贝,组合,单例)
  • vue.js辅助函数-mapMutations
  • 2.slf4j入口
  • Edge Scdn是什么,它如何提升网站安全性与访问速度?
  • 【前端】框架-构建-包管理-语言-语法-生态工具
  • MySQL配置文件