在制作動作游戲的時候,需要播放許多動畫,同時還有個需求,那就是動畫播放到一定時間時,給一個回調函數,好做對應的狀態變更,
我查了一下,發現如果使用的是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的這個功能時一定要小心,不然就很容易不知道問題出在哪兒了。
除卻上述坑爹的地方之外,還有一個小小的問題,那就是可以看到,事件回調只能通過指定 時間 來綁定,而不能通過指定 動畫具體幀數來綁定,
這樣出現的問題是,可能不會那么精確,會存在一些小小的誤差。不過這一點,相對來說是可以接受的。