當時一看SendMessage函數,瞬間感覺好高大上,但是仔細研究了一下,其實屬於一種語法糖。我們完全可以用一種更加直接的方式,但是可能需要多些點兒字母:例如我們需要在另一個腳本中獲得一個游戲對象goInvokeObj的Greet.cs腳本的一個Public方法 public void Greet(),我們可以在該腳本的Start()函數中使用SendMessage()按如下方式寫: goInvokeObj.SendMessage("Greet");這樣我們就不需要寫明哪個腳本了。但是這樣感覺思路上多轉了一圈,看看用簡單粗暴好理解的方式實現吧。 在Start函數中變為 goInvokeObj.GetComponent<Greet>().Greet()。就多了一句獲得Greet.cs腳本的語句,這樣我們還多了一個該函數在哪個腳本的信息,這是SendMessage函數所不具備的功能呀。
講到這兒,我就有一個疑問了,如果一個游戲對象goInvokeObj身上掛了兩個腳本GreetChinese.cs 和 GreetEnglish.cs,並且恰好這兩個腳本都已共同的public方法 public void Greet(),那我們調用goInvokeObj.SendMessage("Greet")會得到怎樣的結果呢? 剛剛做完實驗,發現結果是這個樣子的:SendMessage函數把goInvokeObj身上掛了兩個腳本GreetChinese.cs 和 GreetEnglish.cs的Greet()函數都執行了一遍。或許有這么一種情況,當我們要求該游戲對象的不同腳本的某個函數都要執行一遍的話,用SendMessage還是非常棒的。據說,SendMessage數據傳值技術是Unity官方推薦的方式,所以,簡單粗暴的方式還是不用為好了。剛剛試了一下SendMessage函數,發現調用SendMessage的游戲對象的被調用的函數不一定必須public修飾的函數,例如下面的代碼中的Greet(),為private也是可以的,也可以將字符串傳到goInvokeObj里面的Greet函數中的,這功能有點兒逆天呀。
說到數據傳值,就是將我們需要的變量傳到SendMessage中的函數中去,在這里也就是Greet()函數啦。但是SendMessage中使用字符串標識函數名,換言之,只要函數名相同就行,我做過這樣一個實驗,我用了goInvokeObj.SendMessage("Greet","LiMing"),但是我的不帶參數的Greet()函數也會被執行到,這或許在某些方面還是一個坑吧。只根據函數名而不是函數簽名(函數名,參數類型,參數個數)的方式,是我現在接受不了的。如果換成GreetChinese(int age)函數,則系統會很負責任的告訴我們。
MissingMethodException: The best match for method Greet has some invalid parameter.
好了,上代碼。代碼中的goInvokeObj就是綁定了GreetEnglish.cs和GreetChinese.cs腳本的對象。上面的異常就是Greetchinese腳本中的Greet函數參數與SendMessage中指定的參數不匹配導致的。
1 using UnityEngine; 2 using System.Collections; 3 //在該腳本中進行SendMessage的測試 4 public class TestSendMessage : MonoBehaviour { 5 public GameObject goInvokeObj; 6 // Use this for initialization 7 void Start () { 8 goInvokeObj.SendMessage ("Greet","shengming",SendMessageOptions.RequireReceiver); 9 } 10 11 } 12 13 14 using UnityEngine; 15 using System.Collections; 16 17 public class GreetEnglish : MonoBehaviour { 18 19 public void Greet(string name) 20 { 21 print ("hello" + name); 22 } 23 } 24 25 26 using UnityEngine; 27 using System.Collections; 28 29 public class GreetChinese : MonoBehaviour { 30 31 public void Greet(int name) 32 { 33 print ("你好"+name); 34 } 35 }
