diff --git a/Assets/Scripts/ProjectBase/Event/EventCenter.cs b/Assets/Scripts/ProjectBase/Event/EventCenter.cs index a6be2a9..19e70e3 100644 --- a/Assets/Scripts/ProjectBase/Event/EventCenter.cs +++ b/Assets/Scripts/ProjectBase/Event/EventCenter.cs @@ -4,33 +4,79 @@ using UnityEngine; using UnityEngine.Events; using UnityEngine.Windows; +public interface IEventInfo//利用一个空的接口来承载泛型类,里氏转换原则 +{ + +} +public class EventInfo : IEventInfo +{ + public UnityAction action; + public EventInfo(UnityAction action) + { + action += action; + } +} + +public class EventInfo : IEventInfo +{ + + public UnityAction action; + public EventInfo(UnityAction action) + { + this.action += action; + } +} + + + /// /// 事件中心 /// 1.字典 2.委托 3.观察者设计模式 +/// 4.泛型 /// public class EventCenter : BaseManager { //key ---事件名字(比如:怪物死亡,玩家死亡,通关 等等) //value --- 对应 监听这个事件 对应的委托函数 - private Dictionary> eventDic = new Dictionary>(); + private Dictionary eventDic = new Dictionary(); /// /// 添加事件监听 /// /// 事件的名字 /// 准备用来处理时间的委托函数 - public void AddEventListener(string name,UnityAction action) + public void AddEventListener(string name,UnityAction action) { //有没有对应的事件监听 //有的情况 if(eventDic.ContainsKey(name)) { - eventDic[name] += action;//已经有事件就往后排 + (eventDic[name] as EventInfo).action += action;//已经有事件就往后排 } //没有的情况 else { - eventDic.Add(name, action);//没有就加一个 + eventDic.Add(name, new EventInfo(action));//没有就加一个 + } + } + + /// + /// 重载加入事件,不需要参数,没有泛型 + /// + /// + /// + public void AddEventListener(string name, UnityAction action) + { + //有没有对应的事件监听 + //有的情况 + if (eventDic.ContainsKey(name)) + { + (eventDic[name] as EventInfo).action += action;//已经有事件就往后排 + } + //没有的情况 + else + { + eventDic.Add(name, new EventInfo(action));//没有就加一个 } } @@ -40,11 +86,24 @@ public class EventCenter : BaseManager /// /// /// - public void RemoveEventListener(string name, UnityAction action) + public void RemoveEventListener(string name, UnityAction action) { if(eventDic.ContainsKey(name)) { - eventDic[name] -= action; + (eventDic[name] as EventInfo).action -= action; + } + } + + /// + /// 重载事件移除,没有泛型 + /// + /// + /// + public void RemoveEventListener(string name, UnityAction action) + { + if (eventDic.ContainsKey(name)) + { + (eventDic[name] as EventInfo).action -= action; } } @@ -52,11 +111,34 @@ public class EventCenter : BaseManager /// 事件触发 /// /// 哪一个名字的事件触发了 - public void EvennTrigger(string name,object info) + public void EventTrigger(string name,T info) { if(eventDic.ContainsKey(name)) { - eventDic[name].Invoke(info);//有就触发事件 + if((eventDic[name] as EventInfo).action != null) + { + (eventDic[name] as EventInfo).action.Invoke(info); + } + + // eventDic[name].Invoke(info);//有就触发事件 + } + } + + /// + /// 重载事件触发,没有泛型 + /// + /// + /// + public void EventTrigger(string name) + { + if (eventDic.ContainsKey(name)) + { + if ((eventDic[name] as EventInfo).action != null) + { + (eventDic[name] as EventInfo).action.Invoke(); + } + + // eventDic[name].Invoke(info);//有就触发事件 } } diff --git a/Assets/Scripts/ProjectBase/Event/Monster.cs b/Assets/Scripts/ProjectBase/Event/Monster.cs index 7c96430..6ace7d3 100644 --- a/Assets/Scripts/ProjectBase/Event/Monster.cs +++ b/Assets/Scripts/ProjectBase/Event/Monster.cs @@ -22,6 +22,6 @@ public class Monster : MonoBehaviour { Debug.Log("怪物死亡"); //触发事件 - EventCenter.GetInstance().EvennTrigger("MonsterDead",this); + EventCenter.GetInstance().EventTrigger("MonsterDead",this); } } diff --git a/Assets/Scripts/ProjectBase/Event/Other.cs b/Assets/Scripts/ProjectBase/Event/Other.cs index 13a9aa1..a9d60ad 100644 --- a/Assets/Scripts/ProjectBase/Event/Other.cs +++ b/Assets/Scripts/ProjectBase/Event/Other.cs @@ -6,11 +6,22 @@ public class Other : MonoBehaviour { void Start() { - EventCenter.GetInstance().AddEventListener("MonsterDead", OtherWaitMonsterDeadDo); + EventCenter.GetInstance().AddEventListener("MonsterDead", OtherWaitMonsterDeadDo); + + EventCenter.GetInstance().AddEventListener("Win", Win); + + // EventCenter.GetInstance().EventTrigger("MonsterDead", 怪物参数); + EventCenter.GetInstance().EventTrigger("Win"); + } - public void OtherWaitMonsterDeadDo(object info) + public void OtherWaitMonsterDeadDo(Monster info) { Debug.Log("其他各个对象要做的事"); } + public void Win() + { + Debug.Log("无参事件中心"); + } + } diff --git a/Assets/Scripts/ProjectBase/Event/Player.cs b/Assets/Scripts/ProjectBase/Event/Player.cs index baa8f23..48aef78 100644 --- a/Assets/Scripts/ProjectBase/Event/Player.cs +++ b/Assets/Scripts/ProjectBase/Event/Player.cs @@ -4,14 +4,25 @@ using UnityEngine; public class Player : MonoBehaviour { - + /* + void Start() + { + EventCenter.GetInstance().AddEventListener("MonsterDead",MonsterDeadDo); + } + + public void MonsterDeadDo(object info) + { + Debug.Log("玩家获得奖励" +(info as Monster).name1); + }*/ + + void Start() { - EventCenter.GetInstance().AddEventListener("MonsterDead",MonsterDeadDo); + EventCenter.GetInstance().AddEventListener("MonsterDead", MonsterDeadDo); } - public void MonsterDeadDo(object info) + public void MonsterDeadDo(Monster info) { - Debug.Log("玩家获得奖励" +(info as Monster).name1); + Debug.Log("玩家获得奖励" + info.name1); } } diff --git a/Assets/Scripts/ProjectBase/Event/Task.cs b/Assets/Scripts/ProjectBase/Event/Task.cs index 08177c5..9545da7 100644 --- a/Assets/Scripts/ProjectBase/Event/Task.cs +++ b/Assets/Scripts/ProjectBase/Event/Task.cs @@ -5,12 +5,22 @@ using UnityEngine; public class Task : MonoBehaviour { // Start is called before the first frame update + /* void Start() + { + EventCenter.GetInstance().AddEventListener("MonsterDead", TaskWaitMonsterDeadDo); + } + + public void TaskWaitMonsterDeadDo(object info) + { + Debug.Log("任务记录"); + }*/ + void Start() { - EventCenter.GetInstance().AddEventListener("MonsterDead", TaskWaitMonsterDeadDo); + EventCenter.GetInstance().AddEventListener("MonsterDead", TaskWaitMonsterDeadDo); } - public void TaskWaitMonsterDeadDo(object info) + public void TaskWaitMonsterDeadDo(Monster info) { Debug.Log("任务记录"); } diff --git a/Assets/Scripts/ProjectBase/Scenes/ScenesMgr.cs b/Assets/Scripts/ProjectBase/Scenes/ScenesMgr.cs index e3e13aa..a93d7bb 100644 --- a/Assets/Scripts/ProjectBase/Scenes/ScenesMgr.cs +++ b/Assets/Scripts/ProjectBase/Scenes/ScenesMgr.cs @@ -48,7 +48,7 @@ public class ScenesMgr : BaseManager while(!ao.isDone) { //事件中心 向外分发 进度情况 外面想用就用 - EventCenter.GetInstance().EvennTrigger("进度条更新",ao.progress); + EventCenter.GetInstance().EventTrigger("进度条更新",ao.progress); //这里面去更新进度条 yield return ao.progress; }