在Unity中使用EventManager消息管理類來管理各種事件


在使用Unity進行開發(fā)的過程中秧荆,我們總需要響應(yīng)各種事件倔毙,有時一個事件的觸發(fā)需要我們同時進行幾項處理。舉個例子:比如我們有這樣的需求:點擊模型之后播放特定模型動畫乙濒,同時播放一段音樂陕赃,如果之前有其它音樂正在播放卵蛉,也應(yīng)該立即停止。在這種情況下么库,我們就可以使用這個EventManager類來處理這種需求傻丝。

一、寫在前面

代碼來自Unity官方教程:Events: Creating a simple messaging system
在實際項目開發(fā)過程中诉儒,感覺比較好用葡缰,分享給大家。

二忱反、代碼

using UnityEngine;
using UnityEngine.Events;
using System.Collections;
using System.Collections.Generic;

public class EventManager : MonoBehaviour {
    //這個dic用來管理需要監(jiān)聽的各類事件
    private Dictionary <string, UnityEvent> eventDictionary;
    
    private static EventManager eventManager;
    //單例
    public static EventManager instance
    {
        get
        {
            if (!eventManager)
            {
                //在Unity的Hierarchy中必須有一個名為EventManager的空物體,并掛上EventManager腳本
                eventManager = FindObjectOfType (typeof (EventManager)) as EventManager;

                if (!eventManager)
                {
                    Debug.LogError ("There needs to be one active EventManger script on a GameObject in your scene.");
                }
                else
                {
                    eventManager.Init (); 
                }
            }

            return eventManager;
        }
    }

    void Init ()
    {
        if (eventDictionary == null)
        {
            eventDictionary = new Dictionary<string, UnityEvent>();
        }
    }
    //在需要監(jiān)聽某個事件的腳本中泛释,調(diào)用這個方法來監(jiān)聽這個事件
    public static void StartListening (string eventName, UnityAction listener)
    {
        UnityEvent thisEvent = null;
        if (instance.eventDictionary.TryGetValue (eventName, out thisEvent))
        {
            thisEvent.AddListener (listener);
        } 
        else
        {
            thisEvent = new UnityEvent ();
            thisEvent.AddListener (listener);
            instance.eventDictionary.Add (eventName, thisEvent);
        }
    }
    //在不需要監(jiān)聽的時候停止監(jiān)聽
    public static void StopListening (string eventName, UnityAction listener)
    {
        if (eventManager == null) return;
        UnityEvent thisEvent = null;
        if (instance.eventDictionary.TryGetValue (eventName, out thisEvent))
        {
            thisEvent.RemoveListener (listener);
        }
    }
    //觸發(fā)某個事件
    public static void TriggerEvent (string eventName)
    {
        UnityEvent thisEvent = null;
        if (instance.eventDictionary.TryGetValue (eventName, out thisEvent))
        {
            thisEvent.Invoke ();
        }
    }
}

2.1代碼講解

場景中添加好這個腳本后,在需要監(jiān)聽某個事件的腳本中這行代碼來開始監(jiān)聽某個事件:

EventManager.StartListening ("(事件key值)", listener);

結(jié)束監(jiān)聽某個事件:

EventManager.StopListening ("(事件key值)", listener);

某個時刻觸發(fā)這個事件:

//這里觸發(fā)了事件之后温算,上面的listener綁定的事件將會隨之觸發(fā)怜校,如果有多個腳本監(jiān)聽這個事件,也會同時觸發(fā)這些listener
EventManager.TriggerEvent ("(事件key值)");

三注竿、工程Demo

對于想要看整個工程demo的茄茁,可以去上面給出的鏈接中找,我自己也寫了個Demo項目在這里蔓搞,有需要的可以自行下載胰丁。PS:由于博客更新的時,我已經(jīng)把Unity版本升級到了2017.1.0f3喂分,所以需要下載Unity最新版喲~
https://pan.baidu.com/s/1mhIxWus 密碼:y2uf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锦庸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒲祈,更是在濱河造成了極大的恐慌甘萧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梆掸,死亡現(xiàn)場離奇詭異扬卷,居然都是意外死亡,警方通過查閱死者的電腦和手機酸钦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門怪得,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卑硫,你說我怎么就攤上這事徒恋。” “怎么了欢伏?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵入挣,是天一觀的道長。 經(jīng)常有香客問我硝拧,道長径筏,這世上最難降的妖魔是什么葛假? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮滋恬,結(jié)果婚禮上聊训,老公的妹妹穿的比我還像新娘。我一直安慰自己夷恍,他們只是感情好魔眨,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布媳维。 她就那樣靜靜地躺著酿雪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侄刽。 梳的紋絲不亂的頭發(fā)上指黎,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音州丹,去河邊找鬼醋安。 笑死,一個胖子當著我的面吹牛墓毒,可吹牛的內(nèi)容都是我干的吓揪。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼所计,長吁一口氣:“原來是場噩夢啊……” “哼柠辞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起主胧,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤叭首,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踪栋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焙格,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年夷都,在試婚紗的時候發(fā)現(xiàn)自己被綠了眷唉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡囤官,死狀恐怖冬阳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情治拿,我是刑警寧澤摩泪,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站劫谅,受9級特大地震影響见坑,放射性物質(zhì)發(fā)生泄漏嚷掠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一荞驴、第九天 我趴在偏房一處隱蔽的房頂上張望不皆。 院中可真熱鬧,春花似錦熊楼、人聲如沸霹娄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犬耻。三九已至,卻和暖如春执泰,著一層夾襖步出監(jiān)牢的瞬間枕磁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工术吝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留计济,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓排苍,卻偏偏與公主長得像沦寂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淘衙,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,870評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫传藏、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • “清明時節(jié)雨紛紛,路上行人欲斷魂遗增〗芯”從05年的清明節(jié)開始,我都會隨媽媽給姥爺掃墓做修,而今年遠在異鄉(xiāng)讀書的我霍狰,只能...
    lc許愿閱讀 303評論 0 1
  • 即使我有翅膀 也無法飛翔 現(xiàn)實的重量太重 壓得我無法呼吸 更何況飛翔!
    憨憨爹閱讀 106評論 0 0