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

news/2025/1/16 2:56:22 标签: unity, 游戏引擎

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.niftyadmin.cn/n/5824589.html

相关文章

arcgis中生成格网矢量带高度

效果 1、数据准备 (1)矢量边界(miain.shp) (2)DEM(用于提取格网标高) (3)DSM(用于提取格网最高点) 2、根据矢量范围生成格网 模板范围选择矢量边界,像元宽度和高度根据坐标系来输入,我这边是4326的,所以输入的是弧度,输出格网矢量gewang.shp 3、分区统计 …

JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析

ZGC ZGC 收集器是一个可伸缩的、低延迟的垃圾收集器&#xff0c;基于 Region 内存布局的&#xff0c;不设分代&#xff0c;使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记压缩算法 在 CMS 和 G1 中都用到了写屏障&#xff0c;而 ZGC 用到了读屏障 染色指针&a…

【2025 Rust学习 --- 16 集合:Rust的STL】

集合 — Rust的STL CPP —> Standard Template Library Rust 标准库包含多个集合&#xff0c;这些集合是泛型类型&#xff0c;用于在内存中存储各种数据。 Rust 的集合与其他语言的集合之间的一些系统性差异&#xff1a; 首先&#xff0c;移动和借用无处不在。Rust 使用…

APISQL在线一键安装教程

本文档将指导您在 Linux 服务器上使用 Docker 安装 APISQL 软件。提供了两种安装方式&#xff1a;在线安装和离线安装&#xff0c;您可以根据实际环境选择合适的安装方式。 1. 准备工作 1.1 硬件要求 Linux (x86_64) 服务器 1.2 软件要求 Docker Engine 推荐版本&#xff…

【案例81】NMC调用导致数据库的效率问题

问题现象 客户在使用NC系统时&#xff0c;发现系统特别卡顿。需要紧急排查。 问题分析 排查NMC发现&#xff0c;所有的线程都处于执行SQL层面&#xff0c;说明数据库当前出现了异常。查看数据库资源状态发现&#xff0c;Oracle相关进程CPU利用率达到了100%。 查看现在数据库…

智能物流升级利器——SAIL-RK3576核心板AI边缘计算网关设计方案(一)

近年来&#xff0c;随着物流行业智能化和自动化水平不断提升&#xff0c;数据的实时处理与智能决策成为推动物流运输、仓储管理和配送优化的重要手段。传统的集中式云平台虽然具备强大计算能力&#xff0c;但高延迟和带宽限制往往制约了物流现场的即时响应。为此&#xff0c;我…

Python海龟绘图库:从入门到精通 - Python官方文档(三万字解析!)

turtle --- 海龟绘图 源码&#xff1a; Lib/turtle.py 概述 海龟绘图是对 最早在 Logo 中引入的受欢迎的几何绘图工具 的实现&#xff0c;它由 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 在 1967 年开发。 入门 请想象绘图区有一只机器海龟&#xff0c;起始位置在…

2025宝塔API一键建站系统PHP源码

源码介绍 2025宝塔API一键建站系统PHP源码&#xff0c;对接自己的支付&#xff0c;虚拟主机也能搭建&#xff0c;小白式建站系统&#xff0c;基于宝塔面板搭建的建站系统&#xff0c;功能丰富&#xff0c;多款模板&#xff0c;每日更新 上传源码到服务器&#xff0c;浏览器访问…