通俗易懂點講,就是 乙個物體發出訊息,另外乙個,或者幾個物體可以同時接收到這一訊息並作出各自不同的行為(反饋,處理)。
那麼,首先,我們想到,需要什麼?
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 ///以上**,寫列舉,純是為了提高**可讀性及可維護性,c#中多寫列舉,少寫那種莫名其妙的 int變數,真心感謝第一家公司對我的影響,保持良好的**可讀性。public enum enotificationmsgtype // 訊息傳送的列舉值,應該轉為uint型
eventargstest args = new eventargstest();這邊需要理解的是 postdispatchevent,這個方法,這邊我 寫了三重過載,因為傳送訊息分三種情況,如注釋那樣args.id = 3;
args.name = "我是test傳送的 name 訊息哦";
notificationcenter.get().postdispatchevent((uint)enotificationmsgtype.enull, args); // notificationcenter.get().postdispatchevent((uint)enotificationmsgtype.enull); //我就是通知,不傳送具體啥訊息,也是可以的哦
5)接收訊息
void awake()可能你會奇怪,註冊事件和移除事件為什麼這樣寫。這是一種標準寫法。void ondestroy()
void updatetest(notification e)
}
寫初始(start),結束(ondestroy),使得每個訊息擁有乙個自己的生命週期。
updatetest 為接收了訊息作出了各自的行為,注意傳遞的引數,當然是訊息類。sshpp3.總結
先看圖,再閱讀**。如果看不懂,可能委託還不是理解很明白,自己去看看委託,完全理解完委託再來看這篇帖子提公升。
作為乙個一直只做手遊的程式設計師,訊息傳送機制真的是對於每乙個遊戲專案是非常基礎重要的功能。
Unity 訊息傳送機制 解析
通俗易懂點講,就是 乙個物體發出訊息,另外乙個,或者幾個物體可以同時接收到這一訊息並作出各自不同的行為 反饋,處理 那麼,首先,我們想到,需要什麼?i 我們需要的是訊息 例項 傳送者。訊息 例項 傳送者 我們需要的訊息,就能夠處理任何訊息。ii 怎麼把這個訊息傳送出去 訊息處理中心 iii 傳送者傳...
郵件排隊傳送機制
目前我們小組開發系統有乙個郵件提醒功能,但是使用一段時間後就經常有人反映沒有收到郵件提醒,檢視日誌,原來是郵件傳送頻率過高,被郵箱給退回來了,這時,我就在想,有沒有一種辦法可以實現不管有多少人不管他們什麼時候發,都能保證系統發郵件時以一定的時間間隔傳送。我現在寫這篇文章的時候是這個機制剛剛測試成功之...
Unity內建的三套訊息傳送機制的應用例項
簡介 1 例項中包含2個類檔案,sendmessage.cs 和 receivemessage.cs 分別為訊息傳送端和訊息接收端.2 unity內建的訊息傳送系統有乙個很特別的地方 即使接收端的方法型別為 private 或者 protected,也能夠收到資訊.3 unity內建了3套訊息機制,...