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

Unity Spine帧事件

SpinePro中添加事件帧

首先 选中右上角的层级树 然后选择事件选项

在这里插入图片描述

最后在右下角看到 新建 点击它 新建一个事件

在这里插入图片描述
在这里插入图片描述

点击左上角的设置按钮 弹出编辑窗口

在这里插入图片描述
编辑窗口
在这里插入图片描述

在右上角 动画栏 可以切换对应的动画

点坐边的那个小灰点来切换 亮点代表当前动画
在这里插入图片描述

选中帧

在这里插入图片描述

添加事件 点击对应事件的🔑图标 在当前帧添加事件

在这里插入图片描述

添加成功后 点击左下角播放按钮 可以看到 人物身边有对应事件的文本弹出 表示添加成功

在这里插入图片描述

Unity监听Spine帧事件

面板上添加

可以一个事件 添加多个监听
在这里插入图片描述

代码中动态添加

一个事件可以添加多个监听
在这里插入图片描述

在这里插入图片描述

源码

using System.Collections.Generic;
using UnityEngine;
using Spine.Unity;
using Spine;
using System;
using UnityEngine.Events;public class SpineEventHelper : MonoBehaviour
{[Serializable]public class SpineFrameKey{[SpineEvent] public string key;public UnityEvent handler;}[SerializeField] private List<SpineFrameKey> handlers;private Dictionary<string, UnityEvent> keyFrameEventDict = new Dictionary<string, UnityEvent>( );public const string START_EVENT = "START_EVENT", END_EVENT = "END_EVENT";private SkeletonAnimation skeletonAnimation;private void Start( ){Bind( );}private void Bind( ){skeletonAnimation = GetComponent<SkeletonAnimation>( );if ( skeletonAnimation == null ) return;skeletonAnimation.AnimationState.Event += HandleEvent;skeletonAnimation.AnimationState.Start += delegate ( TrackEntry trackEntry ){if ( keyFrameEventDict.TryGetValue( START_EVENT, out UnityEvent @event ) ){@event.Invoke( );}};skeletonAnimation.AnimationState.End += delegate{if ( keyFrameEventDict.TryGetValue( END_EVENT, out UnityEvent @event ) ){@event.Invoke( );}};foreach ( var handler in handlers ){keyFrameEventDict[ handler.key ] = handler.handler;}}/// <summary>/// 添加自定义的帧事件/// </summary>/// <param name="key"> 帧名称 </param>/// <param name="handler"> 处理的方法 </param>public void AddCustomEventHandler( string key, UnityAction handler ){if ( keyFrameEventDict.TryGetValue( key, out UnityEvent ev ) ){ev.AddListener( handler );}else{var ue = new UnityEvent( );ue.AddListener( handler );keyFrameEventDict.Add( key, ue );}}/// 移除自定义的帧事件/// </summary>/// <param name="key"> 指定帧名称 </param>/// <param name="handler"> 处理的方法 如果忽略则移除key的所有帧事件 </param>public void RemoveCustomEventHandler( string key, UnityAction handler = null ){if ( keyFrameEventDict.TryGetValue( key, out UnityEvent ev ) ){if ( handler == null ){ev.RemoveAllListeners( );}else{ev.RemoveListener( handler );}}}/// <summary>/// 添加动画开始事件/// </summary>/// <param name="handler"> 开始处理事件的方法 </param>public void AddStartEventHandler( UnityAction handler ){if ( keyFrameEventDict.TryGetValue( START_EVENT, out UnityEvent ev ) ){ev.AddListener( handler );}else{var ue = new UnityEvent( );ue.AddListener( handler );keyFrameEventDict.Add( START_EVENT, ue );}}/// <summary>/// 移除开始帧事件/// </summary>/// <param name="handler"></param>public void RemoveStartEventHandler( UnityAction handler ){if ( keyFrameEventDict.TryGetValue( START_EVENT, out UnityEvent ev ) ){ev.RemoveListener( handler );}}/// <summary>/// 添加结束帧事件/// </summary>/// <param name="handler"></param>public void AddEndEventHandler( UnityAction handler ){if ( keyFrameEventDict.TryGetValue( END_EVENT, out UnityEvent ev ) ){ev.AddListener( handler );}else{var ue = new UnityEvent( );ue.AddListener( handler );keyFrameEventDict.Add( END_EVENT, ue );}}/// <summary>/// 移除结束帧事件/// </summary>/// <param name="handler"></param>public void RemoveEndEventHandler( UnityAction handler ){if ( keyFrameEventDict.TryGetValue( END_EVENT, out UnityEvent ev ) ){ev.RemoveListener( handler );}}private void HandleEvent( TrackEntry trackEntry, Spine.Event e ){if ( keyFrameEventDict.TryGetValue( e.Data.Name, out UnityEvent @event ) ){@event.Invoke( );}}/// <summary>/// 清理所有帧事件 /// </summary>public void Clear( ){keyFrameEventDict.Clear( );}private void OnDestroy( ){Clear( );    }
}

相关文章:

Unity Spine帧事件

SpinePro中添加事件帧 首先 选中右上角的层级树 然后选择事件选项 最后在右下角看到 新建 点击它 新建一个事件 点击左上角的设置按钮 弹出编辑窗口 编辑窗口 在右上角 动画栏 可以切换对应的动画 点坐边的那个小灰点来切换 亮点代表当前动画 选中帧 添加事件 点击对应事件…...

AE使用(一)

打开AE 点击“新建合成” 注意参数&#xff1a;宽度高度是视频是横屏还是竖屏。发布在抖音上&#xff0c;需要做出来竖屏效果&#xff1b;发布在视频网站中需要做出横屏效果。没用特殊需求&#xff0c;默认参数就行。 导入素材&#xff1a;左键双击“导入素材区”的空白部分。 …...

YOLOv5、YOLOv8改进:MobileViT:轻量通用且适合移动端的视觉Transformer

MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer 论文&#xff1a;https://arxiv.org/abs/2110.02178 1简介 MobileviT是一个用于移动设备的轻量级通用可视化Transformer&#xff0c;据作者介绍&#xff0c;这是第一次基于轻量级CNN网络性…...

06-4_Qt 5.9 C++开发指南_MDI应用程序设计

文章目录 1. MDI简介2. 文档窗口类 QFormDoc 的设计3. MDI主窗口设计与子窗口的使用3.1 主窗口界面设计3.2 MDI子窗口的创建与加入3.3 QMdiArea 常用功能函数3.4 MDI的信号 4. 源码4.1 qwmainwindow.h4.2 qwmainwindow.cpp 1. MDI简介 传统的应用程序设计中有多文档界面(Multi…...

【SCI征稿】3区SCI,正刊,智能传感、机器学习、智能检测与测量等均可

影响因子&#xff1a;IF&#xff1a;2.0-3.0 期刊分区&#xff1a;JCR3区&#xff0c;中科院4区 检索情况&#xff1a;SCIE在检&#xff0c;正刊 征稿领域&#xff1a;智能技术在测量与检测中的应用研究&#xff0c;如&#xff1a; ● 复杂系统的智能传感和高级故障诊断 ●…...

神经网络ANN(MLP),CNN以及RNN区别和应用

1. Artificial Neural Network(ANN) 又称为Multilayer Perception Model(MLP) 2. CNN AAA 3. RNN 22 先占坑&#xff0c;后期再整理 References [1] CNN vs.RNN vs.ANN——浅析深度学习中的三种神经网络 - 知乎 [2] https://www.youtube.com/watch?vu7obuspdQu4 [3] 深…...

CUDA、cuDNN以及Pytorch介绍

文章目录 前言一、CUDA二、cuDNN三、Pytorch 前言 在讲解cuda和cuDNN之前&#xff0c;我们首先来了解一下英伟达&#xff08;NVIDA&#xff09;公司。 NVIDIA是一家全球领先的计算机技术公司&#xff0c;专注于图形处理器&#xff08;GPU&#xff09;和人工智能&#xff08;…...

使用shift关键字,写一个带二级命令的脚本(如:docker run -a -b -c中的run)

省流&#xff1a;shift关键字 探索思路 最近有一个小小的需求&#xff0c;写一个类似于docker run -a -b -c这样的脚本&#xff0c;这个脚本名为doline&#xff0c;它本身可以执行&#xff08;doline -a -b -c&#xff09;&#xff0c;同时又带有几个如run、init、start这样的…...

MySQL学习笔记 - 进阶部分

MySQL进阶部分 字符集的相关操作&#xff1a;字符集和比较规则&#xff1a;utf8与utf8mb4&#xff1a;比较规则&#xff1a;常见的字符集和对应的Maxlen&#xff1a; Centos7中linux下配置字符集&#xff1a;各个级别的字符集&#xff1a;执行show variables like %character%语…...

微信小程序实现左滑删除

一、效果 二、代码 实现思路使用的是官方提供的 movable-area&#xff1a;注意点&#xff0c;需要设置其高度&#xff0c;否则会出现列表内容重叠的现象。由于movable-view需要向右移动&#xff0c;左滑的时候给删除控件展示的空间&#xff0c;故 movable-area 需要左移 left:…...

安防视频监控有哪些存储方式?哪种存储方式最优?

视频监控系统涉及到大量的视频数据&#xff0c;需要对这些数据进行存储&#xff0c;以备日后查看或备份。视频监控的存储需求需要根据场所的实际情况进行选择&#xff0c;以保证监控数据的有效存储和日后的调阅、回溯。 当前视频监控的存储方式&#xff0c;通常有以下几种&…...

02-C++数据类型-高级

数据类型-高级 4、复合类型 4.4、结构简介 struct inflatable {char name[20];float vol;double price; };inflatable vincent; //C struct inflatable goose; //C例子 // structur.cpp -- a simple structure #include <iostream> struct inflatable // structu…...

Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查

背景 Kotlin作为一门JVM脚本语言&#xff0c;收到很多Java开发者的青睐。 项目采用JavaKotlin混合编程。Spring Boot应用开发&#xff0c;不会发生变动的配置放在本地配置文件&#xff0c;可能会变化的配置放在远程Apollo Server。 问题 因为业务需要&#xff0c;需要增加一…...

TCP协议的报头格式和滑动窗口

文章目录 TCP报头格式端口号序号和确认序号确认应答&#xff08;ACK&#xff09;机制超时重传机制 首部长度窗口大小报文类型URGACKSYNPSHFINRST 滑动窗口滑动窗口的大小怎么设定怎么变化滑动窗口变化问题 TCP报头格式 端口号 两个端口号比较好理解&#xff0c;通过端口号来找…...

java 使用log4j显示到界面和文件 并格式化

1.下载log4j jar包https://dlcdn.apache.org/logging/log4j/2.20.0/apache-log4j-2.20.0-bin.zip 2. 我只要到核心包 &#xff0c;看需要 sources是源码包&#xff0c;可以看到说明。在IDEA里先加入class jar后&#xff0c;再双击这个class jar包或或右键选Navigate ,Add ,…...

【js】链接中有多余的怎么取出参数值

https://pq.equalearning.net/assessment/379208869278126080?userId23ebb&originhttps://www.equalearning.net&fnameIm&lnamehappy在上面的例子中&#xff0c;fnameI’m&#xff0c;其中单引号’被转义为&#xff0c; 而如果使用下面的代码&#xff0c;因为在UR…...

Verdi_traceX and autotrace

Verdi_traceX and autotrace Trace X From nWave/nTrace of from the Teporal Flow View. Show Paths on Flow ViewShow Paths on nWave 若Waveform中有X态&#xff0c;鼠标右键会有Trace X的选项&#xff1b; 会自动打开Temporal Flow View窗口&#xff0c;展示对应路径&am…...

安卓逆向 - 某严选app sign算法还原

本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;若有侵权请联系我删除&#xff01; 目标app: 5ouN5ouN5Lil6YCJMy45LjY 目标接口&#xff1a;aHR0cHM6Ly9hcGkubS5qZC5jb20vYXBp 一、引言 1、本篇分析某二手交易平台 …...

arcgis数据采集与拓扑检查

1、已准备好一张配准好的浙江省行政区划图&#xff0c;如下&#xff1a; 2、现在需要绘制湖州市县级行政区划。需要右击文件夹新建文件地理数据库&#xff0c;如下&#xff1a; 其余步骤均默认即可。 创建好县级要素数据集后&#xff0c;再新建要素类&#xff0c;命名为县。 为…...

【前端 | CSS】滚动到底部加载,滚动监听、懒加载

背景 在日常开发过程中&#xff0c;我们会遇到图片懒加载的功能&#xff0c;基本原理是&#xff0c;滚动条滚动到底部后再次获取数据进行渲染。 那怎么判断滚动条是否滚动到底部呢&#xff1f;滚动条滚动到底部触发时间的时机和方法又该怎样定义&#xff1f; 针对以上问题我…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...