制作动作游戏时,需要播放很多动画,还有一个需求,就是当动画播放一定时间时,给出一个回调函数,做出相应的状态变化。
我检查了一下,发现如果你使用的是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