unity 中向指定的动画片段添加动画事件,并播放动画,同时获取动画片段的时长。
示例一
using UnityEngine;using System;public static class AnimationUtils{/// <summary>/// 向指定的动画片段添加动画事件,并播放动画,同时获取动画片段的时长。/// </summary>/// <param name="_animator">需要添加动画事件的 Animator 组件。</param>/// <param name="_clipName">目标动画片段的名称。</param>/// <param name="_functionName">当动画事件触发时调用的方法名称。</param>/// <param name="_time">事件触发的时间(以秒为单位)。</param>/// <param name="_callback">事件触发时的回调方法。</param>public static void AddAnimationEventAndPlay(Animator _animator, string _clipName, string _functionName, float _time, Action _callback){// 获取 Animator 的所有动画片段AnimationClip[] _clips = _animator.runtimeAnimatorController.animationClips;// 检查是否找到了动画片段bool clipFound = false;// 遍历所有动画片段for (int i = 0; i < _clips.Length; i++){// 检查动画片段名称是否匹配if (_clips[i].name.Equals(_clipName)){clipFound = true; // 标记找到动画片段// 创建新的动画事件AnimationEvent _event = new AnimationEvent{functionName = _functionName, // 设置事件调用的方法名称time = _time // 设置事件触发的时间};_clips[i].AddEvent(_event); // 将事件添加到动画片段Debug.Log($"动画事件已添加到 '{_clipName}' 动画片段,方法: '{_functionName}',时间: {_time} 秒。");// 获取动画片段的时长float clipLength = _clips[i].length;Debug.Log($"动画片段 '{_clipName}' 的时长为: {clipLength} 秒。");// 播放动画_animator.Play(_clipName); // 播放指定的动画片段// 注册回调if (_callback != null){_callback.Invoke(); // 调用回调方法}break; // 找到后退出循环}}// 如果没有找到动画片段,输出警告if (!clipFound){Debug.LogWarning($"未找到名为 '{_clipName}' 的动画片段。");}// 重新绑定 Animator,以确保使用最新的动画事件_animator.Rebind();}}public class AnimationEventExample : MonoBehaviour{public Animator animator; // 关联的 Animator 组件public string animationClipName = "YourAnimationClip"; // 动画片段名称public string eventFunctionName = "YourEventFunction"; // 事件方法名称public float eventTime = 1.0f; // 事件触发时间void Start(){// 调用 AddAnimationEventAndPlay 方法,并传入回调AnimationUtils.AddAnimationEventAndPlay(animator, animationClipName, eventFunctionName, eventTime, YourCallback);}// 示例事件方法public void YourEventFunction(){Debug.Log("动画事件触发了!");}// 示例回调方法public void YourCallback(){Debug.Log("回调方法被调用!");}}
示例二
using UnityEngine;using System;public static class AnimationUtils{/// <summary>/// 播放指定动画并添加动画事件,同时返回动画片段的时长。/// </summary>/// <param name="_animator">需要播放动画的 Animator 组件。</param>/// <param name="_clipName">目标动画片段的名称。</param>/// <param name="_functionName">当动画事件触发时调用的方法名称。</param>/// <param name="param">传递给事件方法的整数参数。</param>/// <param name="percent">事件触发时间的百分比(默认 1 表示动画结束时触发)。</param>/// <param name="callback">事件触发后的回调方法。</param>/// <returns>返回动画片段的时长;如果无效输入或未找到动画片段,返回 -1。</returns>public static float PlayAnim_AddEventAndGetDuration(Animator _animator, string _clipName, string _functionName, int param, float percent = 1, Action callback = null){// 检查 Animator 和动画名称的有效性 if (_animator == null || string.IsNullOrEmpty(_clipName) || _animator.runtimeAnimatorController == null)return -1; // 返回 -1 表示无效输入 // 获取 Animator 的 RuntimeAnimatorController RuntimeAnimatorController controller = _animator.runtimeAnimatorController;// 遍历所有动画片段 foreach (AnimationClip clip in controller.animationClips){if (clip.name.Equals(_clipName, StringComparison.OrdinalIgnoreCase)){// 创建并添加动画事件 AnimationEvent aniEvent = new AnimationEvent{functionName = _functionName,intParameter = param,time = percent * clip.length};clip.AddEvent(aniEvent);// 播放动画 _animator.Play(_clipName);// 调用回调函数(如果存在) callback?.Invoke();return clip.length; // 返回动画片段的时长 }}return -1; // 如果未找到动画片段,返回 -1 }}public class AnimationEventExample : MonoBehaviour{public Animator animator; // 关联的 Animator 组件public string animationClipName = "YourAnimationClip"; // 动画片段名称public string eventFunctionName = "YourEventFunction"; // 事件方法名称public int eventParam = 0; // 传递给事件方法的参数public float eventPercent = 1.0f; // 事件触发时间的百分比void Start(){// 调用 PlayAnim_AddEventAndGetDuration 方法float duration = AnimationUtils.PlayAnim_AddEventAndGetDuration(animator, animationClipName, eventFunctionName, eventParam, eventPercent, YourCallback);Debug.Log($"动画片段 '{animationClipName}' 的时长为: {duration} 秒。");}// 示例事件方法public void YourEventFunction(int param){Debug.Log($"动画事件触发了,参数: {param}");}// 示例回调方法public void YourCallback(){Debug.Log("回调方法被调用!");}}
相关文章:

unity 中向指定的动画片段添加动画事件,并播放动画,同时获取动画片段的时长。
示例一 using UnityEngine;using System;public static class AnimationUtils{/// <summary>/// 向指定的动画片段添加动画事件,并播放动画,同时获取动画片段的时长。/// </summary>/// <param name"_animator">需要添加动画…...

JavaEE:探索网络世界的魅力——玩转UDP编程
文章目录 UDPUDP的特点UDP协议端格式校验和前置知识校验和具体是如何工作的? UDP UDP的特点 UDP传输的过程类似于寄信. 无连接: 知道对端的IP和端口号就直接进行传输,不需要建立连接.不可靠: 没有确认机制,没有重传机制,如果因为网络故障导致该段无法到达对方,UDP协议也不会…...

生成式人工智能:企业数字化转型的全新引擎,深度解析The Open Group 2024生态系统架构·可持续发展年度大会
生成式人工智能:企业数字化转型的全新引擎,深度解析The Open Group 2024生态系统架构可持续发展年度大会 随着人工智能技术的飞速发展,生成式人工智能(Generative AI)正以惊人的速度渗透到各行各业,成为企…...

阿里云k8s如何创建可用的api token
阿里云的 Kubernetes 配置文件(如您所提供的 YAML 格式文件)通常不会直接包含用于连接 Kubernetes 集群的令牌。而是包含了客户端证书和私钥数据,这些是用于通过证书验证而不是令牌验证的方式来与 Kubernetes API 服务器进行安全交互的。 1.…...

leetcode刷题day30|贪心算法Part04重叠区间问题(452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间)
前言:今天的三道题目都是重叠区间的问题。 452. 用最少数量的箭引爆气球 思路:局部最优:当气球出现重叠,一起射,所用弓箭最少; 全局最优:把所有气球射爆所用弓箭最少。 按照起始位置排序&…...

MQTT客户端实战:从连接到通信。详细说明MQTT客户端和MQTT代理进行通信
EMQX安装 EMQX服务器安装 安装文档,见链接不另外写 https://docs.emqx.com/zh/emqx/latest/deploy/install-ubuntu.html 启动 EMQX 启动为一个 systemd 服务: sudo systemctl start emqx在windows安装客户端 在线 MQTT WebSocket 客户端工具&…...

【go/方法记录】cgo静态库编译以及使用dlv定位cgo崩溃问题
目录 说在前面文件树静态库编译cgo使用崩溃模拟使用dlv定位崩溃参考 说在前面 测试环境:WSL2go版本:go version go1.23.1 linux/amd64gcc版本:gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0cmake版本:3.22.1 文件树 ├── buffer …...

(笔记自用)位运算总结+LeetCode例题:颠倒二进制位+位1的个数
一.位运算总结: 在解题之前理解一下为什么需要位运算?它的本质是什么? 力扣上不少位运算相关的题,并且很多题也会用到位运算的技巧。这又是为什么? 位运算的由来 在计算机里面,任何数据最终都是用数字来表示的&…...

024.PL-SQL进阶—游标
课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :…...

从零开始使用树莓派debian系统使用opencv4.10.0进行人脸识别(保姆级教程)
一、总体架构 本文主要是使用树莓派自带的csi摄像头,搭配上opencv4.10.0进行物体的识别。本文使用的环境是python3.7.3,环境不一样有可能安装的opencv的过程也会很不一样,但是python的环境我们可以自己自行安装。 二、树莓派系统的安装 本文…...

golang qq邮件发送验证码
验证码的使用场景 注册/登录:使用验证码可以有效减少垃圾账号注册和恶意登录;短信接口保护:高效减少防止短信接口被刷情况;提交/投票:有效减少恶意刷单、恶意提交、恶意投票等情况;密码找回:用…...

鸿蒙 OS 开发单词打卡 APP 项目实战 20240922 笔记和源码分享
配套有完整的录播课, 需要的私信. 零基础入门级别, 有点前端基础都能学会. 效果截图: 代码截图: 页面完整代码: import { AnswerStatus } from ../enums/AnswerStatus import { PracticeStatus } from ../enums/PracticeStatus import { getRandomQuestions, Question …...

力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs
代码思路是受一个洛谷题解里面大佬的启发。应该算是一个dfs和回溯的入门题目,很好的入门题目了下面我会先给我原题解思路我想可以很快了解这个思路。下面是我自己根据力扣大佬写的。 我会进行详细讲解并配上图辅助理解大家请往下看 #include<iostream> #inc…...

使用Python Pandas导入数据库和文件数据
大家好,在数据分析过程中,数据的导入是第一步,也是最重要的一步。Python的Pandas提供了强大的数据读取功能,支持从多种数据源导入数据,包括CSV、Excel、JSON、SQL数据库、网页等。Pandas库不仅能够处理常见的文件格式&…...

lef 中antenna解释
这些规则主要涉及集成电路设计中的天线效应(Antenna Effect)和通孔(Via)设计规则。 ANTENNAAREADIFFREDUCEPWL 这条规则指定了一个分段线性函数,用于根据连接到切割层的扩散区面积来计算cut_area的缩减因子。扩散区面积值应从0开始单调增加。如果没有定义此规则,PAR(mi)方程中的…...

初试Bootstrap前端框架
文章目录 一、Bootstrap概述二、Bootstrap实例1、创建网页2、编写代码3、代码说明4、浏览网页,查看结果5、登录按钮事件处理6、浏览网页,查看结果 三、实战小结 一、Bootstrap概述 大家好,今天我们将一起学习一个非常流行的前端框架——Boot…...

mysql数据库:超键、候选键、主键与外键
mysql数据库:超键、候选键、主键与外键 1、超键(Superkey)2、候选键(Candidate Key)3、主键(Primary Key)4、外键(Foreign Key) 💖The Begin💖点点…...

音频转MP3格式困难?如何轻松实现wav转mp3?
格式多样化为我们带来了灵活性和创意的无限可能,但同时,不同格式间的转换也成为了不少用户面临的难题。尤其是当你手握珍贵的WAV音频文件,却希望它们能在更多设备上流畅播放或节省存储空间时,wav转mp3的需求便应运而生。WAV以其无…...

基于vue框架的大连盐业有限公司生产管理系统的设计与实现3hk5y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
系统程序文件列表 项目功能:计划员,工艺员,生产建模,生产计划,生产信息,生产监视,工艺质量,盐政信息 开题报告内容 一、引言 随着信息技术的飞速发展和市场竞争的日益激烈,传统盐业企业如大连盐业有限公司正面临着转型升级的迫切需求。传统管理模式下…...

《深入理解JAVA虚拟机(第2版)》- 第13章 - 学习笔记【终章】
第13章 线程安全与锁优化 13.1 概述 面向过程的编程思想 将数据和过程独立分开,数据是问题空间中的客体,程序代码是用来处理数据的,这种站在计算机角度来抽象和解决问题的思维方式,称为面向对象的编程思想。 面向对象的编程思想…...

网络工程师学习笔记——网络互连与互联网(三)
TCP三次握手 建立TCP连接是通过三次握手实现的,采用三报文握手主要是为了防止已失效的连接请求报文突然又传送到了,因而产生错误 主动发起TCP连接建立的称为客户端 被动等待的为TCP服务器,二者之间需要交换三个TCP报文段 首先是客户端主动…...

【Tomcat】常见面试题整理 共34题
文章目录 1. 简述什么是Tomcat?2. Tomcat的缺省端口是多少,怎么修改?3. 简述Tomcat 目录结构及作用4. 简述Tomcat有几种部署方式?5. 简述Tomcat容器是如何创建servlet类实例?6. Tomcat有哪几种Connector运行模式&#…...

到时间没回家又不接电话?如何迅速确定孩子的位置?
当孩子未按时回家且无法通过电话联系时,家长往往会感到焦虑。此时,如何迅速确定孩子的位置成为许多家长迫切需要解决的问题。 利用智能手机定位技术是最常见的方法之一。大多数智能手机都内置GPS定位功能,通过“查找设备”应用,家…...

接口自动化--commons内容详解-02
上篇文章主要讲解了接口自动化主要架构框架,这篇文庄主要讲解commons中的内容 1. requests_utils.py 首先讲解这个工具类,主要是因为在接口自动化中,基本都有的接口都是发送请求,获取响应结果,唯一不同的是࿰…...

WanFangAi论文写作研究生论文写作神器在线生成真实数据,标注参考文献位置,表格公式代码流程图查重20以内,研究生论文写作技巧
WanFangAi是一个专业的学术论文辅助平台,它提供了一系列工具来帮助用户提升论文写作的效率和质量。以下是WanFangAi的一些核心功能:1.主题探索与文献搜索:用户可以输入关键词和研究领域,WanFangAi会迅速推荐合适的论文主题并提供相关的文献搜索服务。系统…...

cv2.waitkey(30) 按键盘无效
cv2.imshow("detection", color_image) # 窗口显示,显示名为 Capture_Videok cv2.waitKey(100) & 0xFF # 每帧数据延时 1ms,延时不能为 0,否则读取的结果会是静态帧 if k ord(s): # 键盘按一下s, 保存当前照片和机械臂位姿…...

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解
【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解 题目传送门 题解 CSP-S1 补全程序,致敬全 A 的答案,和神奇的预言家。 写一下这篇的题解说不定能加 CSP 2024 的 RP 首先看到 k k k 这么大的一个常数,就想到了二分。然后写一个判…...

Ubuntu24.04 安装ssh开启22端口及允许root用户远程登录
1、安装openssh-server插件开启22端口访问 # 安装ssh会默认启动服务并开启22端口 apt update apt install openssh-server 2、开启root用户远程访问 激活root用户,设置root用户登录密码 hunterlocalhost:/$ sudo passwd root New password: Retype new password…...

STM32基础学习笔记-DHT11单总线协议面试基础题7
第七章、DHT11: 单总线协!议 常见问题 1、DHT11是什么 ?有什么特性 ? 2、单总线协议是什么 ?原理 ?DHT11的单总线协议的组成 ? ## 1、DHT11定义 单总线协议是一种用于在多个设备之间进行通信的协议,所有…...

Redisson分布式锁的概念和使用
Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁?1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出ÿ…...