Unity事件处理封装【事件注册、派发】
1、使用场景:
有复杂的事件关联,逻辑关系杂乱
2、作用:
处理复杂的事件关联,降低代码耦合,便于功能开发维护
3、理论原理:
借鉴观察者模式,使用事件中心处理,注册派发执行指定事件
4、实现原理:
通过一个字典保存事件,通过委托实现事件的绑定添加
5、代码实现:【场景:怪物死后玩家血量增加、背包获得奖励】
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; /// <summary> /// 事件处理【注册、派发】 单例类 /// </summary> public class EventCenter : SingletonBase<EventCenter> { //保存事件的字典 private Dictionary<string, UnityAction<object>> eventDict = new Dictionary<string, UnityAction<object>>(); /// <summary> /// 注册事件 /// </summary> /// <param name="name">事件名称</param> /// <param name="eve">要添加的事件名【函数名】</param> public void AddListenerEvent(string name, UnityAction<object> action) { //字典存在该事件 if (eventDict.ContainsKey(name)) { //将事件 添加绑定 eventDict[name] += action; } else { //不存在则 注册该事件 将该事件 添加进字典 eventDict.Add(name, action); } } /// <summary> /// 事件派发 /// </summary> /// <param name="name">注册的事件名称</param> public void EventTrigger(string name,object info) { //事件中心存在该事件 if (eventDict.ContainsKey(name)) { //派发 执行 eventDict[name].Invoke(info); } } /// <summary> /// 移除事件的监听 /// </summary> /// <param name="name">事件名称</param> /// <param name="action">具体事件【函数名】</param> public void RemoveEventListener(string name,UnityAction<object> action) { //字典存在该事件 if (eventDict.ContainsKey(name)) { //将事件 移除 eventDict[name] -= action; } } /// <summary> /// 清空全部事件 /// 主要应用于跳转场景 /// </summary> public void Clear() { eventDict.Clear(); } }
怪物死亡方法:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Monster : MonoBehaviour { public int hp = 100; void Start () { Invoke("dead",2); } public void dead() { Debug.Log("怪物死了..."); EventCenter.GetInstance().EventTrigger("MonsterDead",this); } }
玩家类:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { private int HP=100; private double Money = 0; void Start () { EventCenter.GetInstance().AddListenerEvent("MonsterDead", addHP); } private void addHP(object info) { HP += 20; Debug.Log("怪物少了 "+(info as Monster).hp+" 玩家HP增加了20"); } void OnDestroy() { EventCenter.GetInstance().RemoveEventListener("MonsterDead", addHP); } }
背包类:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Bag : MonoBehaviour { void Start () { EventCenter.GetInstance().AddListenerEvent("MonsterDead", addReward); } public void addReward(object info) { Debug.Log("背包获得奖励"); } void OnDestroy() { EventCenter.GetInstance().RemoveEventListener("MonsterDead", addReward); } }
最终实现效果:
评论