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

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("回调方法被调用!");}}

http://www.lryc.cn/news/446589.html

相关文章:

  • JavaEE:探索网络世界的魅力——玩转UDP编程
  • 生成式人工智能:企业数字化转型的全新引擎,深度解析The Open Group 2024生态系统架构·可持续发展年度大会
  • 阿里云k8s如何创建可用的api token
  • leetcode刷题day30|贪心算法Part04重叠区间问题(452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间)
  • MQTT客户端实战:从连接到通信。详细说明MQTT客户端和MQTT代理进行通信
  • 【go/方法记录】cgo静态库编译以及使用dlv定位cgo崩溃问题
  • (笔记自用)位运算总结+LeetCode例题:颠倒二进制位+位1的个数
  • 024.PL-SQL进阶—游标
  • 从零开始使用树莓派debian系统使用opencv4.10.0进行人脸识别(保姆级教程)
  • golang qq邮件发送验证码
  • 鸿蒙 OS 开发单词打卡 APP 项目实战 20240922 笔记和源码分享
  • 力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs
  • 使用Python Pandas导入数据库和文件数据
  • lef 中antenna解释
  • 初试Bootstrap前端框架
  • mysql数据库:超键、候选键、主键与外键
  • 音频转MP3格式困难?如何轻松实现wav转mp3?
  • 基于vue框架的大连盐业有限公司生产管理系统的设计与实现3hk5y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 《深入理解JAVA虚拟机(第2版)》- 第13章 - 学习笔记【终章】
  • 网络工程师学习笔记——网络互连与互联网(三)
  • 【Tomcat】常见面试题整理 共34题
  • 到时间没回家又不接电话?如何迅速确定孩子的位置?
  • 接口自动化--commons内容详解-02
  • WanFangAi论文写作研究生论文写作神器在线生成真实数据,标注参考文献位置,表格公式代码流程图查重20以内,研究生论文写作技巧
  • cv2.waitkey(30) 按键盘无效
  • 【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解
  • Ubuntu24.04 安装ssh开启22端口及允许root用户远程登录
  • STM32基础学习笔记-DHT11单总线协议面试基础题7
  • Redisson分布式锁的概念和使用
  • uniapp小程序持续获取用户位置信息,后台位置获取