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

Unity 代码实现Animator开始和结束播放动画回调

文章目录

  • 1.代码
  • 2.使用方式
  • 3.注意事项

1.代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;// 播放Animator并加入播放完成回调。
[RequireComponent(typeof(Animator))]
public class AnimatorCallback : MonoBehaviour
{private string startFunName = "StartCallBack";private string endFunName = "EndCallBack";private Animator mAnim;private AnimatorOverrideController mController;private Dictionary<string, AnimationClip> mClipDic = new Dictionary<string, AnimationClip>();private Action endCallBack;             // 动画结束回调private Action startCallBack;           // 动画开始回调private AnimationEvent endEvt;          // 结束帧private AnimationEvent startEvt;        // 结束帧public void Awake(){mController = new AnimatorOverrideController();mAnim = transform.GetComponent<Animator>();ResetEvent();mController.runtimeAnimatorController = mAnim.runtimeAnimatorController;}public void Play(string animName, Action beginAction = null, Action endAction = null){startCallBack = beginAction;endCallBack = endAction;if (!mClipDic.ContainsKey(animName)){mClipDic.Add(animName, mController[animName]);endEvt = new AnimationEvent();endEvt.time = mClipDic[animName].length;startEvt = new AnimationEvent();startEvt.time = 0;endEvt.functionName = endFunName;startEvt.functionName = startFunName;mClipDic[animName].AddEvent(endEvt);mClipDic[animName].AddEvent(startEvt);}if (!mAnim.enabled) mAnim.enabled = true;mAnim.Play(animName, 0, 0);}private void EndCallBack(){if (endCallBack != null)endCallBack.Invoke();}private void StartCallBack(){if (startCallBack != null)startCallBack.Invoke();}#region help// 主要是为了防止已用的动画帧事件被移除private void ResetEvent(){foreach (var clip in mAnim.runtimeAnimatorController.animationClips){List<AnimationEvent> evts = new List<AnimationEvent>();foreach (var curEvt in clip.events){var newEvt = new AnimationEvent();if (curEvt.functionName.Equals(startFunName) || curEvt.functionName.Equals(endFunName))continue;CloneEvent(newEvt, curEvt);evts.Add(newEvt);}clip.events = null;foreach (var evt in evts){clip.AddEvent(evt);}evts = null;}}private void CloneEvent(AnimationEvent newEvt, AnimationEvent oldEvt){newEvt.functionName = oldEvt.functionName;newEvt.floatParameter = oldEvt.floatParameter;newEvt.intParameter = oldEvt.intParameter;newEvt.objectReferenceParameter = oldEvt.objectReferenceParameter;newEvt.time = oldEvt.time;}#endregion
}

2.使用方式

  1. 在需要调用事件的Animator物体上添加上面的脚本
  2. 调用Play方法

3.注意事项

如果你将Animator的某个AnimationClip的Speed设置为了-1(即倒播),动画的开始播放事件和结束播放事件任然是对应的开始帧和结束帧。

相关文章:

  • 代码审计--一道简单的文件包含题目的多种利用方式
  • Jenkins + github 自动化部署配置
  • 二十九篇:构建未来:信息系统的核心框架与应用
  • Laravel(Lumen8) + Supervisor 实现多进程redis消息队列
  • 大一久富农机实习与商业思维学习计划
  • IS-IS DIS
  • Android:OkHttp网络请求框架的使用
  • 【二叉树】LeetCode.144:二叉树的前序遍历(小细节把握)
  • 今天说的什么好呢
  • 汇编原理(二)
  • STL库 —— unordered_set与unordered_map的封装
  • 5月23日学习记录
  • 002 CentOS 7.9 redis-7.2.5安装及配置
  • idea2023的git从dev分支合并到主分支master
  • AlexNet论文解析—ImageNet Classification with Deep Convolutional Neural Networks
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 230. Kth Smallest Element in a BST
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java 多线程编程之:notify 和 wait 用法
  • Leetcode 27 Remove Element
  • orm2 中文文档 3.1 模型属性
  • React as a UI Runtime(五、列表)
  • React Transition Group -- Transition 组件
  • REST架构的思考
  • Spark学习笔记之相关记录
  • supervisor 永不挂掉的进程 安装以及使用
  • uni-app项目数字滚动
  • Vue 动态创建 component
  • webgl (原生)基础入门指南【一】
  • 前端之Sass/Scss实战笔记
  • 使用Gradle第一次构建Java程序
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 正则与JS中的正则
  • const的用法,特别是用在函数前面与后面的区别
  • Java性能优化之JVM GC(垃圾回收机制)
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​zookeeper集群配置与启动
  • ​渐进式Web应用PWA的未来
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #etcd#安装时出错
  • $NOIp2018$劝退记
  • (二)linux使用docker容器运行mysql
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转)h264中avc和flv数据的解析
  • (转)jQuery 基础
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .Net 垃圾回收机制原理(二)
  • .net反编译工具
  • .net网站发布-允许更新此预编译站点
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • [ C++ ] STL---string类的模拟实现
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)