动画播放到一定时间时给一个回调函数的方法

动画播放到一定时间时给一个回调函数的方法

制作动作游戏时,需要播放很多动画,还有一个需求,就是当动画播放一定时间时,给出一个回调函数,做出相应的状态变化。

我检查了一下,发现如果你使用的是Unity自带的动画系统,要做到这一点unity 动画调用方法,你需要这样做:

 1    public void AddCallBackOnClip(Type classType,AnimationClip clip,string callbacMethod,int callBackFrame,string sParam="",int iParam = 0,float fParam = 0f)
 2     {
 3         if (string.IsNullOrEmpty(callbacMethod)||clip==null)
 4         {
 5             return;
 6         }
 7         else
 8         {
 9             var methodByName = classType.GetMethod(callbacMethod);
10 
11             if (methodByName==null)
12             {
13                 Debug.LogError(string.Format("在{0}类中,找不到名为{1}的方法", classType.Name, callbacMethod));
14                 return;
15             }
16             else
17             {
18                 var timer =Time.deltaTime*callBackFrame;
19 
20                 Debug.Log("timer=" + timer);
21 
22                 if (timer>clip.length)
23                 {
24                     return;
25                 }
26 
27                 AnimationEvent evt = new AnimationEvent();
28 
29                 evt.functionName = callbacMethod;
30                 evt.intParameter = iParam;
31                 evt.floatParameter = fParam;
32                 evt.stringParameter = sParam;
33 
34                 evt.time = timer;
35 
36                 clip.AddEvent(evt);             
37             }
38         }
39     }

从上面的代码可以看出,其实对于绑定的回调函数来说,它就是传入的回调函数的名字,并没有C#委托这样的东西。 那么问题来了,这只是传入的方法名的字符串,如何确认应该绑定类中的哪个方法呢?

通过实验,我发现确实是这样的。 对于上面给出的绑定方法,在哪个Mono脚本中调用unity 动画调用方法游戏策划,就会绑定Mono脚本中对应的方法。

例如,假设脚本A和脚本B挂在对象Go上。 两者都有一个名为PrintMsg()的方法,AddCallBackOnClip()方法是在工具类C中实现的。

然后现在调用脚本 A 中的 AddCallBackOnClip() 方法。最终的结果是,无论 PrintMsg() 是公共的还是私有的,A 和 B 中的 PrintMsg 都会被调用。

这太作弊了! 所以,使用Unity的这个功能时一定要小心音效,否则很容易不知道问题出在哪里。

除了上面的坑之外,还有一个小问题,就是可以看到事件回调只能通过指定时间来绑定,而不能通过指定动画的具体帧数来绑定。

这样做的问题是,它可能不会那么准确,并且会存在一些小错误。 不过,这是相对可以接受的。

文章来源:https://blog.csdn.net/weixin_30767921/article/details/99496075