任务6:事件中心模块
事件中心模式
1,事件中心
1 Private Dictionary<string,UnityAction<object>> eventDic = new Dictionary<string, UnityAction<object>>
2,添加事件监听
1 /// <summary> 2 /// 添加监听的事件 3 /// </summary> 4 /// <param name="name">事件的名字</param> 5 /// <param name="action">准备用来处理事件的委托函数</param> 6 public void AddEventListener(string name,UnityAction<object> action) 7 { 8 //有没有对应的事件监听 9 if (eventDic.ContainsKey(name))//有监听的情况 10 { 11 eventDic[name] += action; 12 } 13 else//没有监听的情况 14 { 15 eventDic.Add(name,action); 16 } 17 18 }
3,监听事件触发
1 /// <summary> 2 /// 事件触发 3 /// </summary> 4 /// <param name="name">哪一个名字的事件触发了</param> 5 public void EventTrigger(string name,object info) 6 { 7 8 //有没有对应的事件监听 9 if (eventDic.ContainsKey(name))//有监听的情况 10 { 11 eventDic[name].Invoke(info); 12 13 } 14 15 }
4,移除监听事件
1 /// <summary> 2 /// 移除对应的事件监听 3 /// </summary> 4 /// <param name="name">事件的名字</param> 5 /// <param name="action">对应之前添加的委托函数</param> 6 public void RemoveEventListener(string name,UnityAction<object> action) 7 { 8 if (eventDic.ContainsKey(name)) 9 { 10 eventDic[name] -= action; 11 } 12 13 }
5,
1 /// <summary> 2 /// 清空事件中心 3 /// 主要用在场景切换时 4 /// </summary> 5 public void ClearEvent() 6 { 7 eventDic.Clear(); 8 }
6,先触发事件(别的脚本之类的)
1 private void Start() 2 { 3 Dead(); 4 } 5 6 public void Dead() 7 { 8 Debug.Log("怪物死亡"); 9 10 //触发事件 11 12 EventCenter.GetInstance().EventTrigger("MonsterDead",this); 13 }
7,再需要添加事件监听的位置添加监听点(别的脚本之类的)
1 void Awake() 2 { 3 EventCenter.GetInstance().AddEventListener("MonsterDead", MonsterDeadDo); 4 } 5 6 // Update is called once per frame 7 public void MonsterDeadDo(object info) 8 { 9 Debug.Log("玩家的奖励"+ (info as Monster).name); 10 11 }
8,添加完事件最后还要销毁事件
1 private void OnDestroy() 2 { 3 EventCenter.GetInstance().RemoveEventListener("MonsterDead", MonsterDeadDo); 4 }