Unity 訊息傳送機制 解析

2021-09-20 15:56:51 字數 4009 閱讀 8318

通俗易懂點講,就是 乙個物體發出訊息,另外乙個,或者幾個物體可以同時接收到這一訊息並作出各自不同的行為(反饋,處理)。

那麼,首先,我們想到,需要什麼?

i: 我們需要的是訊息(例項),傳送者。 訊息(例項)+傳送者=我們需要的訊息,就能夠處理任何訊息。

ii:怎麼把這個訊息傳送出去(訊息處理中心)。

iii:傳送者傳送(分發)訊息的行為

iv:接收訊息。

/// 建構函式

///

///public notification(eventargs param)

}

///

/// 傳遞的訊息,這個是訊息類中的具體訊息種類 類

///

public class eventargstest : eventargs

1

notification是乙個稍微抽象一點的訊息類,要傳遞乙個訊息(類),我前面說到了,肯定是需要知道具體傳送者和具體訊息類的。

而具體訊息類,就是後面的eventargstest,這個是繼承於system.eventargs,該類是自定義類,看到後面,可能會理解為什麼這樣繼承。

2)宣告乙個訊息的委託

1

public delegate void onnotification(notification notific);

宣告乙個委託傳遞上面所說的訊息類的委託,這邊通俗一點來講就是:宣告乙個可以傳遞notification 引數的方法。至於委託的用法這裡就不詳訴了。

3)訊息處理中心

public class notificationcenter

return instance;

}        private dictionaryeventlisteners            = new dictionary();        public void addeventlistener(uint eventkey, notificationdelegate listener)

eventlisteners[eventkey] += listener; //註冊接收者的監聽        }        public void removeeventlistener(uint eventkey,notificationdelegate listener)

}        public void removeeventlistener(uint eventkey)

/// /// 分發事件,不需要知道傳送者的情況        /// 

/// 

/// 

public void postdispatchevent(uint eventkey, notification notific)

/// /// 分發事件,需要知道傳送者,具體訊息的情況        /// 

///事件key        ///傳送者        ///通知內容

public void postdispatchevent(uint eventkey, gameobject sender, eventargs param)

public void postdispatchevent(uint eventkey)

/// /// 分發事件,不需要知道任何,只需要知道傳送過來訊息了        /// 

///事件key        ///通知內容

public void postdispatchevent(uint eventkey, eventargs param)

/// /// 是否存在指定事件的***        /// 

public bool haseventlistener(uint eventkey)

}

該訊息機制的核心,難點也就是在這裡了。

首先,既然是訊息處理中心,肯定是需要乙個存放傳遞訊息(上面那個宣告的委託)的容器,於是宣告乙個

private dictionaryeventlisteners            = new dictionary();
增加,移除 傳遞訊息(上面那個宣告的委託),不就是以下**,需要注意的是
eventlisteners[eventkey] -= listener;//取消接收者的監聽     

eventlisteners.remove(eventkey);//移除存放在在eventlisteners為eventkey的傳遞訊息(上面那個委託)

if (!haseventlistener(eventkey))

else

這樣,如何儲存訊息做完了。
4) 傳送者傳送(分發)訊息的行為

/// /// 訊息型別,列舉列出,呼叫時需要強轉為uint    /// 

public enum enotificationmsgtype // 訊息傳送的列舉值,應該轉為uint型    

以上**,寫列舉,純是為了提高**可讀性及可維護性,c#中多寫列舉,少寫那種莫名其妙的 int變數,真心感謝第一家公司對我的影響,保持良好的**可讀性。

eventargstest args = new eventargstest();

args.id = 3;

args.name = "我是test傳送的 name 訊息哦";

notificationcenter.get().postdispatchevent((uint)enotificationmsgtype.enull, args);     //   notificationcenter.get().postdispatchevent((uint)enotificationmsgtype.enull); //我就是通知,不傳送具體啥訊息,也是可以的哦

這邊需要理解的是 postdispatchevent,這個方法,這邊我 寫了三重過載,因為傳送訊息分三種情況,如注釋那樣

5)接收訊息

void awake()

void ondestroy()

void updatetest(notification e)

}

可能你會奇怪,註冊事件和移除事件為什麼這樣寫。這是一種標準寫法。

寫初始(start),結束(ondestroy),使得每個訊息擁有乙個自己的生命週期。

作為乙個一直只做手遊的程式設計師,訊息傳送機制真的是對於每乙個遊戲專案是非常基礎重要的功能。

Unity 訊息傳送機制 解析

通俗易懂點講,就是 乙個物體發出訊息,另外乙個,或者幾個物體可以同時接收到這一訊息並作出各自不同的行為 反饋,處理 那麼,首先,我們想到,需要什麼?i 我們需要的是訊息 例項 傳送者。訊息 例項 傳送者 我們需要的訊息,就能夠處理任何訊息。ii 怎麼把這個訊息傳送出去 訊息處理中心 iii 傳送者傳...

郵件排隊傳送機制

目前我們小組開發系統有乙個郵件提醒功能,但是使用一段時間後就經常有人反映沒有收到郵件提醒,檢視日誌,原來是郵件傳送頻率過高,被郵箱給退回來了,這時,我就在想,有沒有一種辦法可以實現不管有多少人不管他們什麼時候發,都能保證系統發郵件時以一定的時間間隔傳送。我現在寫這篇文章的時候是這個機制剛剛測試成功之...

Unity內建的三套訊息傳送機制的應用例項

簡介 1 例項中包含2個類檔案,sendmessage.cs 和 receivemessage.cs 分別為訊息傳送端和訊息接收端.2 unity內建的訊息傳送系統有乙個很特別的地方 即使接收端的方法型別為 private 或者 protected,也能夠收到資訊.3 unity內建了3套訊息機制,...