Unity3D中的SendMessage使用(訊息推送)
概述
Unity提供的訊息推送機制可以非常方便我們的指令碼開發,它實現的是一種偽監聽者模式,利用的是反射機制。
常用函式
關於訊息推送,常用的函式有三個:”SendMessage“、”SendMessageUpwards“、”BroadcastMessage“。這些函式都是GameObject或者Component的成員函式,只要得到一個物件,然後呼叫它的這三個函式就可以進行一個訊息的推送。
1.SendMessage
原型:public void SendMessage(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
作用:呼叫一個物件的methodName函式,這個函式可以是公有的也可以是私有的,後面跟一個可選引數(此引數作為傳入引數),最後面跟一個可選的設定引數(它有兩個選項,後面再講)。
2.SendMessageUpwards
原型:public void SendMessageUpwards(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
作用:它的作用和SendMessage類似,只不過它不僅會向當前物件推送一個訊息,也會向這個物件的父物件推送這個訊息(記住,是會遍歷所有父物件)。
3.BroadcastMessage
原型:public void BroadcastMessage(string methodName, object parameter = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
作用:這個函式的作用和SendMessageUpwards的作用正好相反,它不是推送訊息給父物件,而是推送訊息給所有的子物件,當然,也是會遍歷所有的子物件。
例項
首先,有一個test_SendMessage指令碼掛在MainCamera上,然後所有Cube都掛有一個test_setActive指令碼。如下圖:
其中:test_setActive指令碼內容非常簡單,就是一個私有的SetActive函式,如下:
public class test_setActive : MonoBehaviour
{
void SetActive (bool b)
{
gameObject.SetActive(b);
}
}
test_SendMessage指令碼內容如下:
void Update ()
{
if (Input.GetKeyDown (KeyCode.Space)) {
GameObject.Find ("TestCube").SendMessageUpwards ("SetActive", false);
}
}
怎麼樣,很簡單吧,這樣就可以實現在一個指令碼中呼叫另外一些元件中的私有函數了。