Unity 事件中心
生活随笔
收集整理的這篇文章主要介紹了
Unity 事件中心
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Unity 事件中心
為了降低模塊與模塊之間的耦合,舉個例子如下圖
有 boss、player、winpanle(游戲勝利界面) ,當boss死亡時,玩家得到一定金幣,游戲勝利面板彈出。通常的做法是在Boss腳本里 得到player 和 winpanle 的實例對象,然后再調用其對應函數
此做法簡單,對于不復雜的業務邏輯比較友好也方便,但是對于稍微復雜點的業務邏輯就顯得很混亂,模塊間的耦合性也非常高 如圖
這還只是4個模塊間相互引用,更復雜的可能有幾十個或上百,解決這問題就需要用到設計模式中的 發布訂閱模式 (Publish–subscribe pattern) 。
boss把死亡消息發給中心(中間人Broker),此后就不用管了,誰需要這個事件 誰就訂閱即可,中心會通知這些訂閱者。玩家和勝利面板需要知道boss什么時候死亡,于是就訂閱boss的死亡事件,boss死后就會收到通知。
UML關系圖
腳本實現
創建IEventInfo接口和EventInfo類,類繼承接口
using UnityEngine.Events;interface IEventInfo { }public class EventInfo<T> : IEventInfo {public UnityAction<T> m_action;public EventInfo (UnityAction<T> _action) {m_action += _action;} }事件中心實現 因為是唯一的 所以是單例 需繼承單例基類
/// <summary> /// 事件中心 /// </summary> public class Evencenter : SingletonBase<Evencenter> {private Dictionary<string, IEventInfo> m_eventDic;protected override void Init () {m_eventDic = new Dictionary<string, IEventInfo> ();}/// <summary>/// 注冊監聽函數/// </summary>/// <param name="_eventName">事件名</param>/// <param name="_action">回調函數</param>/// <typeparam name="T">參數類型</typeparam>public void AddEventListener<T> (string _eventName, UnityAction<T> _action) {if (!m_eventDic.ContainsKey (_eventName)) {m_eventDic.Add (_eventName, new EventInfo<T> (_action));return;}(m_eventDic[_eventName] as EventInfo<T>).m_action += _action;}/// <summary>/// 事件的發布/// </summary>/// <param name="_eventName">事件名</param>/// <param name="_info">事件觸發時需要傳出去的參數</param>/// <typeparam name="T">參數類型</typeparam>public void EventTrigger<T> (string _eventName, T _info) {if (m_eventDic.ContainsKey (_eventName) && (m_eventDic[_eventName] as EventInfo<T>).m_action != null)(m_eventDic[_eventName] as EventInfo<T>).m_action (_info);//里氏轉換 把父類轉為子類}/// <summary>/// 取消函數監聽 一般用于對象銷毀/// </summary>/// <param name="_eventName">事件名</param>/// <param name="_action">注冊的回調函數</param>/// <typeparam name="T">參數類型</typeparam>public void RemoveEventListener<T> (string _eventName, UnityAction<T> _action) {(m_eventDic[_eventName] as EventInfo<T>).m_action -= _action;}public void Clear () {m_eventDic.Clear ();} }使用
分別創建boss、player、winpanle的GameObject和對應腳本
public class Boss : MonoBehaviour {void Start () {Invoke ("Die", 3);//延遲三秒Boss死亡}//死亡后發布死亡事件void Die () {// 回調函數的參數類型 事件名 回調函數參數 這里是boss名字Evencenter.Instance.EventTrigger<string> ("BossDead", "加里奧");} } public class Player : MonoBehaviour {void Start () {//對boss死亡這個事件進行監聽 Evencenter.Instance.AddEventListener<string> ("BossDead", Fun);}void Fun (string _bossName) {Debug.Log (_bossName + " 死亡 玩家加金幣");}void OnDestroy () {Evencenter.Instance.RemoveEventListener<string> ("BossDead", Fun);} } public class WinPanle : MonoBehaviour {void Start () {Evencenter.Instance.AddEventListener<string> ("BossDead", (_bossName)=>{Debug.Log (_bossName + " 死亡 勝利面板彈出");});} }點擊運行按鈕不出意外 3秒后 控制臺會打印如下信息
最后
學習筆記,僅供參考,如有不正,歡迎指正
總結
以上是生活随笔為你收集整理的Unity 事件中心的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 弘辽科技:拼多多改销量是什么意思?
- 下一篇: 充电桩市场与发展前景分析