在使用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