【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.rhkb.cn/news/1943.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 VSCode 调试时 Python 文件出现相对路径报错问题‘FileNotFoundError’

文章目录 1. 问题描述2. 解决方法 1. 问题描述 在使用 VSCode 进行 Python 开发时&#xff0c;遇到一个的问题&#xff1a;在调试模式下&#xff0c;程序无法读取文件或路径&#xff0c;导致File Not Found Error 错误。然而&#xff0c;当不使用调试模式而是直接运行 Python 文…

OpenCV的TIF红外可见光融合算法

一、简介 首先TIF是Two-Scale Image Fusion的缩写&#xff0c;论文《Two-Scale Image Fusion of Infrared and Visible Images Using Saliency Detection (TIF)》&#xff0c;作者在论文中提到TIF算法主要通过以下三个步骤实现融合&#xff1a; 图像分解&#xff0c;图像分解使…

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架&#xff0c;专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括&#xff1a; 高效的抓取性能&#xff1a;Scrapy 采用了异步机制&#xff0c;能够高效…

Sentaurus TCAD学习笔记:transform指令

目录 一、transform指令简介二、transform指令的实现1.cut指令2.flip指令3.rotate指令4.stretch指令5.translate指令6.reflect指令 三、transform指令示例 一、transform指令简介 在Sentaurus中&#xff0c;如果需要对器件进行翻转、平移等操作&#xff0c;可以通过transform指…

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章&#xff1a;Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具&#xff0c;放到C盘根目录&#xff0c; 2.1 打开windows Powershell&#xff08;WinX&#xff09;&#xff0c;下边那个最好。 输入两条指令&a…

LSA更新、撤销

LSA的新旧判断&#xff1a; 1.seq&#xff0c;值越大越优先 2.chksum&#xff0c;值越大越优先 3.age&#xff0c;本地的LSA age和收到的LSA age作比较 如果差值<900s&#xff0c;认为age一致&#xff0c;保留本地的&#xff1a;我本地有一条LSA是100 你给的是400 差值小于…

istio-proxy oom问题排查步骤

1. 查看cluster数量 cluster数量太多会导致istio-proxy占用比较大的内存&#xff0c;此时需检查是否dr资源的host设置有配置为* 2. 查看链路数据采样率 若采样率设置过高&#xff0c;在压测时需要很大的内存来维护链路数据。可以调低采样率或增大istio-proxy内存。 检查iop中…

nexus搭建maven私服

说到maven私服每个公司都有&#xff0c;比如我上一篇文章介绍的自定义日志starter&#xff0c;就可以上传到maven私服供大家使用&#xff0c;每次更新只需deploy一下就行&#xff0c;以下就是本人搭建私服的步骤 使用docker安装nexus #拉取镜像 docker pull sonatype/nexus3:…

【声音场景分类--论文阅读】

1.基于小波时频图特征在声音场景分类 基于小波时频图特征在声音场景分类任务中的表现 2.增强增强高效音频分类网络 https://arxiv.org/pdf/2204.11479v5 https://github.com/Alibaba-MIIL/AudioClassfication 音频分类网络如图4所示。在此阶段&#xff0c;主要重点是建立一…

基于springboot果蔬供应链信息管理平台

基于Spring Boot的果蔬供应链信息管理平台是一种集成了先进信息技术和果蔬供应链管理理念的综合性系统。 一、背景与意义 随着人们生活水平的提高和对健康饮食的重视&#xff0c;果蔬市场需求不断增长。然而&#xff0c;果蔬供应链涉及多个环节&#xff0c;包括种植、采摘、加…

RNN之:LSTM 长短期记忆模型-结构-理论详解-及实战(Matlab向)

0.前言 递归&#xff01;循环神经网络Recurrent Neural Network 循环神经网络&#xff08;又称递归神经网络&#xff0c;Recurrent Neural Network&#xff0c;RNN&#xff09;。是一种用于处理序列数据的神经网络结构&#xff0c;具有记忆功能&#xff0c;能够捕捉序列中的时…

kafka原理和实践

Kafka是当前分布式系统中最流行的消息中间件之一&#xff0c;凭借着其高吞吐量的设计&#xff0c;在日志收集系统和消息系统的应用场景中深得开发者喜爱。本篇就聊聊Kafka相关的一些知识点。主要包括以下内容&#xff1a; Kafka简介 Kafka特点Kafka基本概念Kafka架构Kafka的几…

excel 整理表格,分割一列变成多列数据

数据准备 对于很多系统页面的数据是没有办法下载的。 这里用表格数据来举例。随便做数据的准备。想要看excel部分的可以把这里跳过&#xff0c;从数据准备完成开始看。 需要一点前端基础知识&#xff0c;但不多&#xff08;不会也行&#xff09;。 把鼠标放在你想要拿到本地的…

详情页 路由传值

路由传值获取参数 渲染数据 主页面 <template><div class"km"><div v-for"item in items" :key"item.id"><div class"title-km" ><img :src"item.imageUrl" alt"Image" class"…

从源码角度分析SpringMVC执行流程

文章目录 一、SpringMVC基本概述二、SpringMVC的执行流程三、SpringMVC源码的执行流程四、前端控制器根据请求获取处理器原理五、如何根据处理器获取处理器适配器六、SpringMVC拦截器执行源码解读七、处理器适配器执行方法原理 一、SpringMVC基本概述 SpringMVC是基于Servlet进…

Java中网络编程的学习

目录 网络编程概述 网络模型 网络通信三要素: IP 端口号 通信协议 IP地址&#xff08;Internet Protocol Address&#xff09; 端口号 网络通信协议 TCP 三次握手 四次挥手 UDP TCP编程 客户端Socket的工作过程包含以下四个基本的步骤&#xff1a; 服务器程序…

Winforms开发基础之非主线程操作UI控件的误区

前言 想象一下&#xff0c;你正在开发一个桌面应用程序&#xff0c;用户点击按钮后需要执行一个耗时操作。为了避免界面卡顿&#xff0c;你决定使用后台线程来处理任务。然而&#xff0c;当你在后台线程中尝试更新UI控件时&#xff0c;程序突然崩溃了。这是为什么呢&#xff1…

前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单

一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置&#xff0c;在爬虫爬取网站文章时候&#xff0c;会输入给爬虫一个配置文件&#xff0c;里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)

前言 最近开始准备秋招&#xff0c;打算做一个个人主页&#xff0c;以便在秋招市场上更有竞争力。 目前&#xff0c;现有的一些搭建主页的博文教程存在以下一些问题&#xff1a; 使用Github Page进行部署&#xff0c;这在国内访问容易受阻使用宝塔面板等框架&#xff0c;功能…

day07_Spark SQL

文章目录 day07_Spark SQL课程笔记一、今日课程内容二、Spark SQL函数定义&#xff08;掌握&#xff09;1、窗口函数2、自定义函数背景2.1 回顾函数分类标准:SQL最开始是_内置函数&自定义函数_两种 2.2 自定义函数背景 3、Spark原生自定义UDF函数3.1 自定义函数流程&#x…