使用代碼給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腳本中調用,就會去綁定哪一個Mono腳本中對應的方法。

舉個例子,假設 物體Go上掛了腳本 A和腳本B,兩個都擁有一個叫做PrintMsg()的方法,工具類C 中實現了 AddCallBackOnClip()方法

那么現在在腳本A 中調用 AddCallBackOnClip() 方法,最后的結果是, A 和B 中的PrintMsg均會被調用,並且無論PrintMsg()是公有的還是私有的。

這就很坑爹了!所以在使用Unity的這個功能時一定要小心,不然就很容易不知道問題出在哪兒了。

 

除卻上述坑爹的地方之外,還有一個小小的問題,那就是可以看到,事件回調只能通過指定 時間 來綁定,而不能通過指定 動畫具體幀數來綁定,

這樣出現的問題是,可能不會那么精確,會存在一些小小的誤差。不過這一點,相對來說是可以接受的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM