Unity中SendMessage/SendMessageUpwards/BroadcastMessage的用法

来源:互联网 发布:suse linux 挂载iso 编辑:程序博客网 时间:2024/05/17 21:57

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 printnameusing UnityEngine;public class printname : MonoBehaviour {    private void PrintThisName(){        Debug.Log(this.gameObject.name);    }}//Script messageusing 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方法有了更清晰的认识,在使用过程中可以根据具体需求选用。如果还有疑问,欢迎沟通。


原创粉丝点击