概述
Unity提供的消息推送機制可以非常方便我們的腳本開發,它實現的是一種偽監聽者模式,利用的是反射機制。
常用函數
關於消息推送,常用的函數有三個:”SendMessage“、”SendMessageUpwards“、”BroadcastMessage“。這些函數都是GameObject或者Component的成員函數,只要得到一個對象,然后調用它的這三個函數就可以進行一個消息的推送。也就是說比如獲得一個物體對象,然后調用gameObject.SendMessage(functionA...),這個方法就會遍歷自身的所有組件,只要一個組件中有函數functionA,那么functionA就會被調用,並且同時傳遞參數。
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的作用正好相反,它不是推送消息給父對象,而是推送消息給所有的子對象,當然,也是會遍歷所有的子對象。
第三個參數使用:
SendMessageOptions.RequireReceiver //如果沒有找到相應函數,會報錯(默認是這個狀態) SendMessageOptions.DontRequireReceiver //即使沒有找到相應函數,也不會報錯,自動忽略
gameObject.SendMessage
這個函數的目的就是為了調用其他腳本中的函數,也就是交互目的.
他會在指定的gameobject上所依附的腳本中針對函數名"string"去檢索. 找到后調用並傳送參數object
發送多個參數:
首先創建一個接受信息的腳本,並賦給一個物體Obj,
public class DJH_String : MonoBehaviour { void PrintMessage(object[] obj) { Debug.Log(obj[0]+""+obj[1]); } }
接下來,來傳遞信息,代碼如下:
public class DJH_SendMessage : MonoBehaviour { private string msgValue1 = "Val1"; private string msgValue2 = "Val2"; public GameObject obj; void Start () { object[] message = new object[2]; message[0] = msgValue1; message[1] = msgValue2; obj.SendMessage("PrintMessage", message, SendMessageOptions.DontRequireReceiver); } }
作者:完美風暴互動開發工作室
鏈接:https://www.jianshu.com/p/d314dc7c7777
來源:簡書