Unity中SendMessage/SendMessageUpwards/BroadcastMessage的用法

Unity中不同腳本間傳遞消息有很多種方式,常見的是GetComponent及其相近的幾個方法。本文將介紹用消息推送的方式來傳遞消息的方法,最後再對二者的優劣進行比較。

傳遞消息的方法有三個:

    public void SendMessage(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
    public void SendMessageUpwards(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
    public void BroadcastMessage(string methodName, object parameter = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);

三個方法的參數是相同的:<1>方法名,<2>方法的參數,<3>是否需要結果信息(默認需要,如果發出的信息找不到相應方法,會輸出一個Error,如果選了SendMessageOptions.DontRequireReceiver,那找不到方法是也沒有任何提示,慎用。)

三個方法不同之處在於:

<1>SendMessage僅向指定對象的所有腳本推送消息

<2>SendMessageUpwards向指定對象和它的所有父物體推送消息

<3>BroadcastMessage向指定對象和它的所有子物體推送消息


下面在Unity中進行驗證:

創建幾個物體,關係如下:


創建兩個腳本,printname腳本每個物體都掛一個,message腳本掛在Cube(2)上。

//Script printname
using UnityEngine;
public class printname : MonoBehaviour {
    private void PrintThisName(){
        Debug.Log(this.gameObject.name);
    }
}


//Script message
using UnityEngine;
public class message : MonoBehaviour {
	void Start () {
        SendMessage("PrintThisName");
        Debug.Log("**************************");
        SendMessageUpwards("PrintThisName");
        Debug.Log("**************************");
        BroadcastMessage("PrintThisName");
	}
}


開始運行後,結果輸出如下:

這跟上面的介紹是完全吻合的。

既然傳遞消息多種方法,那麼那種更好呢?下面對SendMessage和GetComponent兩類方法進行簡單的比較:

SendMessage:支持private、public方法的消息傳遞;針對“方法”,可以一次性遍歷對象的所有腳本,不需要知道腳本名;要求不同用途的方法在不同腳本中也不能重名,否則極容易出錯。

GetComponent:不支持private方法;針對“腳本”,指向性較好,可以針對單個的腳本傳遞消息;不同腳本之間有重名方法也不會有問題。

通過上述的比較,我們對SendMessage方法和GetComponent方法有了更清晰的認識,在使用過程中可以根據具體需求選用。如果還有疑問,歡迎溝通。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章