动画事件回调

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【Unity3D(AR/VR) 334163814】【Unity3D(游戏) 119706192】 本文链接地址:Unity3D 动画回调

注册Animation回调

[csharp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class test_AddAnimationEvent : MonoBehaviour  
  2. {  
  3.     Animation anim;  
  4.   
  5.     void Start () {  
  6.         anim = GetComponent<Animation>();  
  7.         AddEvent(1, "testLog");  
  8.     }  
  9.   
  10.     void AddEvent(float EventTime, string funcname)  
  11.     {  
  12.         AnimationEvent auidoEvent = new AnimationEvent();  
  13.         auidoEvent.time = EventTime;  
  14.         auidoEvent.functionName = funcname;  
  15.         anim.clip.AddEvent(auidoEvent);  
  16.         //注:同一动画能被多次注册回调。  
  17.     }  
  18.   
  19.     int n = 0;  
  20.     public void testLog()  
  21.     {  
  22.         n++;  
  23.         Debug.Log("n=" + n + ", time=" + DateTime.Now.Ticks / 1000000.0);  
  24.     }  
  25. }  


注册Animtor回调

1.先创建个脚本,用来执行回调事件。

[csharp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class test_animatorEvent : MonoBehaviour   
  2. {  
  3.     int n = 0;  
  4.     public void CallNull()  
  5.     {  
  6.         n++;  
  7.         Debug.Log("n=" + n + ", time=" + DateTime.Now.Ticks / 1000000.0);  
  8.     }  
  9.   
  10.     int i = 0;  
  11.     public void CallInt(int _int)  
  12.     {  
  13.         i++;  
  14.         Debug.Log(_int +  " | i=" + i + ", time=" + DateTime.Now.Ticks / 1000000.0);  
  15.     }  
  16.   
  17.     int i_s = 0;  
  18.     public void CallIntStr(int _int,string _str)  
  19.     {  
  20.         i_s++;  
  21.         Debug.Log(_int + "&" + _str + " | i_s=" + i_s + ", time=" + DateTime.Now.Ticks / 1000000.0);  
  22.     }  
  23. }  

2.找到要绑定回调的动画,选择其文件。


3.找准添加回调时的时机,准备添加动画回调的方法。


4.点击添加回调方法。


添加完成后,是这样的,这个还是可以再拖动调整回调时机。


到此,动画回调就注册完了。

5.投入使用,将第一步写好的脚本挂在Animator同级的gameobject上。


运行结果:


6.再来试试带参数的。



运行结果:


<think>好的,用户想了解在Unity中如何设置动画结束时的回调方法,并需要示例。我需要根据提供的三个引用内容来辅助回答,同时遵循系统级指令中的格式要求。 首先,回忆Unity动画系统的基本机制。动画回调通常涉及在动画剪辑的特定时间点触发事件。用户提到的动画结束回调,可以通过Animation Events来实现,或者在Animator Controller中使用状态行为脚本。 查看引用内容,引用[1]提到Animator Controller管理动画剪辑和过渡,所以可能需要使用Animator组件相关的方法。引用[2]提到动画缓存,可能对性能有影响,但用户的问题更关注事件触发,暂时可能不涉及缓存。引用[3]关于人形动画的Avatar系统,可能和回调关系不大,但需要确认是否有相关内容。 接下来,思考两种常用的方法: 1. **Animation Events**:在动画剪辑中添加事件,在结束时调用函数。这适用于Animation组件,但用户可能在使用Animator Controller,所以需要明确。 2. **Animator State Machine**:在状态机中,当动画状态退出或进入时触发事件。可能需要使用StateMachineBehaviour脚本来监听动画结束的事件。 需要确定用户是使用旧的Animation组件还是Animator组件。根据引用[1],建议使用Animator Controller,因此重点放在Animator的方法上。 步骤一:使用Animation Events。在动画剪辑的末尾添加一个事件,绑定到游戏对象的脚本方法。但这种方法需要编辑动画剪辑,可能不够动态。 步骤二:使用Animator的StateMachineBehaviour。通过继承StateMachineBehaviour,重写OnStateExit方法,当动画状态退出时触发回调。这种方法更灵活,适合在代码中动态处理。 需要验证这两种方法的正确性,并确保示例代码准确。例如,StateMachineBehaviour需要附加到Animator Controller的某个状态上,用户可能需要在编辑器中操作。 另外,考虑是否需要使用动画事件参数传递,或者直接调用函数。确保示例代码中的函数是公共的,并且挂载在正确的游戏对象上。 最后,生成相关问题,需要围绕Unity动画回调的扩展,比如其他事件类型、性能优化、不同动画类型的处理等。参考引用内容中的缓存、Avatar系统可能作为相关问题的基础。 总结回答结构: 1. 方法一:Animation Events,步骤和示例代码。 2. 方法二:StateMachineBehaviour,步骤和示例代码。 3. 相关问题,涵盖扩展知识和优化。</think>在Unity中实现动画结束回调主要有两种常用方法,下面以示例说明具体实现步骤: ### 方法一:使用Animation Events 1. **在动画剪辑中添加事件** 在Animation窗口中选择动画剪辑,将时间轴拖到最后一帧 ```csharp public class AnimationCallback : MonoBehaviour { public void OnAnimationEnd() { Debug.Log("Animation Completed"); } } ``` 将`OnAnimationEnd`方法绑定到动画事件[^1] ### 方法二:使用Animator的StateMachineBehaviour 1. **创建状态行为脚本** ```csharp using UnityEngine; public class AnimationEndBehaviour : StateMachineBehaviour { override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { animator.gameObject.SendMessage("OnAnimationEnd", SendMessageOptions.DontRequireReceiver); } } ``` 2. **在Animator Controller中附加脚本** - 选择对应动画状态 - 添加Behaviour组件并选择上述脚本 $$ \text{动画完成时间计算公式:} t_{end} = \frac{\text{关键帧数}}{\text{帧率}} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值