天天看点

Unity 消息发送机制 解析

通俗易懂点讲,就是 一个物体发出消息,另外一个,或者几个物体可以同时接收到这一消息并作出各自不同的行为(反馈,处理)。

那么,首先,我们想到,需要什么?

I: 我们需要的是消息(实例),发送者。 消息(实例)+发送者=我们需要的消息,就能够处理任何消息。

II:怎么把这个消息发送出去(消息处理中心)。

III:发送者发送(分发)消息的行为

IV:接收消息。

图解:

  

Unity 消息发送机制 解析

public class Notification

    {

        /// <summary>

        /// 发送者

        /// </summary>

        public GameObject sender;

        /// 消息内容

        public EventArgs param;

        /// 构造函数 (初始化)

        ///<param name="sender">通知发送者

        ///<param name="param">通知内容

        public Notification(GameObject sender, EventArgs param)

        {

            this.sender = sender;

            this.param = param;

        }<br>      

        public Notification()

        }

        /// 构造函数

        ///<param name="param">

        public Notification(EventArgs param)

            this.sender = null;

}

/// <summary>

    /// 传递的消息,这个是消息类中的具体消息种类 类

    /// </summary>

    public class EventArgsTest : EventArgs

        public int id;

        public string name;

    }

<span style="color: #008000">Notification是一个稍微抽象一点的消息类,要传递一个消息(类),我前面说到了,肯定是需要知道具体发送者和具体消息类的。</span><br><span style="color: #008000">而具体消息类,就是后面的EventArgsTest,这个是继承于System.EventArgs,该类是自定义类,看到后面,可能会理解为什么这样继承。</span><br><br>

 2)声明一个消息的委托

public delegate void OnNotification(Notification notific);

  声明一个委托传递上面所说的消息类的委托,这边通俗一点来讲就是:声明一个可以传递Notification 参数的方法。至于委托的用法这里就不详诉了。

 3)消息处理中心

 该消息机制的核心,难点也就是在这里了。

首先,既然是消息处理中心,肯定是需要一个存放传递消息(上面那个声明的委托)的容器,于是声明一个

4) 发送者发送(分发)消息的行为

以上代码,写枚举,纯是为了提高代码可读性及可维护性,C#中多写枚举,少写那种莫名其妙的 int变量,真心感谢第一家公司对我的影响,保持良好的代码可读性。

 这边需要理解的是 PostDispatchEvent,这个方法,这边我 写了三重重载,因为发送消息分三种情况,如注释那样

{

只需要通知发送,不需要知道发送的具体消息类型,也不需要发送者。

只需要发送具体消息类型,不需要发送者。

需要发送具体消息类型,需要发送者。

5)接收消息

   可能你会奇怪,注册事件和移除事件为什么这样写。这是一种标准写法。

   写初始(Start),结束(OnDestroy),使得每个消息拥有一个自己的生命周期。

本文转自帅气的头头博客51CTO博客,原文链接http://blog.51cto.com/12902932/1924093如需转载请自行联系原作者

sshpp

继续阅读