1. 程式人生 > >Unity3D中的SendMessage使用(訊息推送)

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);
		}
	}

    怎麼樣,很簡單吧,這樣就可以實現在一個指令碼中呼叫另外一些元件中的私有函數了。