為了方便多個物體間的消息傳達與接收,Unity中包含了幾種消息推送機制 :
分別為SendMessage、SendMessageUpwards、BroadcastMessage。
我們首先以SendMessage為例:
public void SendMessage(string methodName,object value,SendMessageOptions options);
可以看到它有三個參數,分別為“被調用目標方法的方法名”、“傳遞給目標方法的參數”、“當目標方法不存在時,是否告知開發者(是否打印錯誤)”
下面我們制作簡單的項目Demo測試:
新建場景並設置以下4個物體的層級關系如圖,其中Parent物體掛載“test1”和“test2”腳本,Grandparent 和 Child 以及 Other掛載“test2”腳本
test1 和 test2腳本:(test1腳本包括消息發送和接收方法,test2腳本僅包括消息接收方法)
using UnityEngine; public class test1 : MonoBehaviour { void Update() { if (Input.GetMouseButtonDown(0))//點擊鼠標左鍵執行以下操作 { SendMessage("Example1", 123, SendMessageOptions.DontRequireReceiver);//嘗試調用“Example1”方法 } } void Example1(int i) { Debug.Log(name+" :test1 :"+ i); } }
using UnityEngine; public class test2 : MonoBehaviour { void Example1(int i) { Debug.Log(name+" :test2 :"+ i); } }
運行程序並點擊鼠標左鍵,得到輸出結果如下 :(掛載test1的“Parent”物體接收到)
可以得出結論:SendMessage的消息傳遞機制,僅對當前對象(自身)所掛載的所有腳本發送消息有效,對父物體及其子物體無效,對其他物體無效。
同樣的,我們分別編寫代碼對SendMessageUpwards、BroadcastMessage進行測試,
根據輸出結果,可分別得出結論:
SendMessageUpwards的消息傳遞機制,對當前對象(自身)及它的父物體所掛載的所有腳本發送消息有效,對其子物體無效,對其他物體無效。
BroadcastMessage的消息傳遞機制,與SendMessageUpwards正好相反,對當前對象(自身)及它的子物體所掛載的所有腳本發送消息有效,對其父物體無效,對其他物體無效。