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方法有了更清晰的認識,在使用過程中可以根據具體需求選用。如果還有疑問,歡迎溝通。