天天看點

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

繼續閱讀