Unity动画系统Animator动态添加事件

之前一直都是手动给模型动画添加事件,最近在做项目的时候,感觉很麻烦,而且经常要改,就变的更麻烦了。于是就在网上查了下,事件是可以在运行时自动添加的,在此记录一下,免得自己以后忘了。

现在有一个模型和动画控制器如下:

很简单,没有什么骚操作。并在模型上挂了一个 Test 脚本,我在 Test 脚本里,分别在动画的开始,结束,和播放一半的时候添加事件。运行打印如下:

截图没办法很好的表示动态效果,大家可以自己尝试一下,代码如下,逻辑很简单,就不多说了:

 1 using UnityEngine;
 2
 3 public class Test : MonoBehaviour
 4 {
 5     #region --变量定义
 6     private Animator animator;
 7     private AnimationClip[] clips;
 8     #endregion
 9
10     #region --系统函数
11     private void Start()
12     {
13         animator = this.GetComponent<Animator>();
14         clips = animator.runtimeAnimatorController.animationClips;
15
16         AnimationClip _clip = clips[0];
17         AddAnimationEvent(animator, _clip.name, "StartEvent", 0);
18         AddAnimationEvent(animator, _clip.name, "HalfEvent", _clip.length * 0.5f);
19         AddAnimationEvent(animator, _clip.name, "EndEvent", _clip.length);
20     }
21     private void OnDestroy()
22     {
23         CleanAllEvent();
24     }
25     #endregion
26
27     #region --自定义函数
28     private void StartEvent()
29     {
30         Debug.Log("开始播放动画");
31     }
32     private void HalfEvent()
33     {
34         Debug.Log("动画播放了一半");
35     }
36     private void EndEvent()
37     {
38         Debug.Log("播放动画完毕");
39     }
40
41     /// <summary>
42     /// 添加动画事件
43     /// </summary>
44     /// <param name="_animator"></param>
45     /// <param name="_clipName">动画名称</param>
46     /// <param name="_eventFunctionName">事件方法名称</param>
47     /// <param name="_time">添加事件时间。单位:秒</param>
48     private void AddAnimationEvent(Animator _animator, string _clipName, string _eventFunctionName, float _time)
49     {
50         AnimationClip[] _clips = _animator.runtimeAnimatorController.animationClips;
51         for (int i = 0; i < _clips.Length; i++)
52         {
53             if (_clips[i].name == _clipName)
54             {
55                 AnimationEvent _event = new AnimationEvent();
56                 _event.functionName = _eventFunctionName;
57                 _event.time = _time;
58                 _clips[i].AddEvent(_event);
59                 break;
60             }
61         }
62         _animator.Rebind();
63     }
64     /// <summary>
65     /// 清除所有事件
66     /// </summary>
67     private void CleanAllEvent()
68     {
69         for (int i = 0; i < clips.Length; i++)
70         {
71             clips[i].events = default(AnimationEvent[]);
72         }
73         Debug.Log("清除所有事件");
74     }
75     #endregion
76 }

有一点需要注意,事件添加过一次后,就会一直存在,除非关闭程序。也就是说,如果你实例化一个模型,并且在 Start 函数里执行添加 事件的逻辑,如果这个模型被实例化了两次,事件就会被添加两次。所以我建议大家像我这样,在 OnDestroy 函数里对事件进行清空处理。

原文地址:https://www.cnblogs.com/xiaoyulong/p/10853287.html

时间: 2024-08-01 16:17:40

Unity动画系统Animator动态添加事件的相关文章

给animator动态添加事件

using UnityEngine; using System.Collections; public class setAnimationEvent : MonoBehaviour { public RuntimeAnimatorController m_runtimeAnimatorController; // Use this for initialization void Start () { m_runtimeAnimatorController = this.GetComponent

Unity 动画系统 Animation 和 Animator的小实例

本文结合一个很简单的动画demo,分别采用2种方法,来对比Animation和Animator的使用方式: 方法1:单独使用Animation 方法2:Animation结合Animator 动画Demo 两个动画.一个是移动,一个是缩放. 实现方式的对比 一.单独Animation来实现 空场景,找到一张Sprite图片,拖到面板中,右键添加Animation组件.如下: 点中这张pig猪的图片,点击Unity的 Window->Animation->Animation.出现如下: 这个时候

【Unity编程】Unity动画系统(一)

Unity动画系统 Unity动画系统,也称为"Mecanim",提供了以下功能: 简单的工作流程,设置动画的所有元素,包括对象,角色和属性. 支持导入外部创建的动画片段和使用内置动画编辑器制作的动画片段. 人型动画重新定位,动画角色的运动控制可以被所有的角色模型共享,即角色的外观(SkinedMesh)和运动(Animator)是分离的,它们互相组合之后形成最终的动画. 用于编辑动画状态的的简化工作流程,即动画控制器. 方便预览动画片段,以及片段之间的插值过渡. 这使得动画师可以独立

js动态添加事件-事件委托

作者:白狼 出处:http://www.manks.top/javascript-dynamic-event.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 其所谓的动态添加事件实质就是指js中的事件委托. 我们知道在js中,事件处理只能绑定在当前被选中的元素上,换句话也就是说,事件处理只能绑定在当前文档已经存在的元素上!但是,往往小伙伴们都会遇到一个问题就是,我的元素是后来动态添加到页面的,而我又想给该元素绑定

Android 向系统日历中添加事件

查了一天半,总算有点大概了.以下是自己的理解,有错误的地方望指正. android系统有日历功能,应用程序可以根据一些接口开发自己的功能,即使是日历app也是根据这些接口开发的,所以我们可以利用程序向系统日历写入事件,然后用手机上的日历软件就可以看到我们添加的事件.网上这方面资料也不少,也有demo,但是我没找到一个可以正确运行的,有的是缺少参数,有的是版本的原因,4.0以上的系统这方面变动比较大,所以只能一边查资料一边修改. 大体思路就是:先查看系统日历是否有账户,如果没有必须要添加一个,然后

UGUI Button和Toogle动态添加事件

如果你想动态创建Button和Toogle 等等一系列控件,需要动态添加事件的如下. 拿button和Toogle抛砖引玉O(∩_∩)O~ using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.Events; public class Test3 : MonoBehaviour { public Button button; public Toggle toggle; void A

Unity 动画系统 AnimationEvent 动画事件

AnimationEvent类 添加事件的方法: 1.创建一个动画事件 AnimationEvent evt = new AnimationEvent(); evt.functionName = "PrintEvent"; evt.intParameter = 12345; evt.time = 1.3f; 2.具体的事件函数,自己写的函数 public void PrintEvent(int i) { print("PrintEvent: " + i ); //自

iOS日历相关操作--读取系统日历、添加事件到系统日历

1 读取系统日历 let eventStore = EKEventStore() let tempFormatter = NSDateFormatter() tempFormatter.dateFormat = "dd.MM.yyyy HH:mm" //获取一个时间段中的日历事件 let startDate = tempFormatter.dateFromString("10.08.2016 15:10")! let endDate = tempFormatter.

Unity3d Mecanim动画系统Animator学习笔记

1. unity3d Mecanim学习  Unity3d新版动画系统网上的介绍很多,但多是流水笔记,外人很难看明白,后来我 终于找到介绍的比较明白的两个作者,特别感谢.一个是58开发网的乐天老师,课程 视频网址:http://www.58kaifa.com/course/24, 这是一个免费的视频课程,讲解的 很仔细,很清除.另一个是博客园的 阿诚de窝,文章地址:http://www.cnblogs.com/hammerc/category/647246.html, 各个控制面板上的参数含义