事件中心模块
本文将以一个敌人的死亡来讲解事件中心模块,其中包含的知识点有字典,委托,观察者模式等等。事件中心模块可以用来降低程序耦合性,减小程序的复杂度,避免各个脚本的相互影响,相互关联。本篇文章只是用来记录学习的笔记,老师上课教授,笔记内容有复制拷贝网上的资料、笔记。
不用事件中心模块来完成敌人死亡要执行其他对象身上脚本的方法函数。
主角代码如下:
public class Player : MonoBehaviour
{
public void EnemyDie()
{
//敌人死亡做什么操作
}
}
敌人代码如下:
public class Enemy : MonoBehaviour
{
void Start()
{
DeadFunc();
}
void DeadFunc()
{
//调用玩家相关的对于敌人死亡的方法
GameObject.Find("Player").GetComponent<Player>().EnemyDie();
}
}
脚本分别挂载在相对应的对象上面,运行一下执行就会发现其他三个脚本都在与敌人脚本做关联,如果后面敌人死亡需要触发的脚本很多,就会造成耦合度很高,后面管理不好的话就很容易出现问题,且不易排查。所以我们为了降低耦合度,就有了事件中心的概念,在不同的脚本里需要处理不同的方法,那就发一个事件给他,相对应的脚本监听到了事件就执行相对应的方法,减少了程序的复杂度。
事件中心模块代码:
public class EventManager : SignleBaseManager<EventManager>
{
//key对应的事件名,value对应执行函数
private Dictionary<string, Action<object>> eventDic = new Dictionary<string, Action<object>>();
public void AddEventListener(string name, Action<object> action)
{
if (eventDic.ContainsKey(name))
eventDic[name] += action;
else
eventDic.Add(name, action);
}
public void EventTrigger(string name, object objinfo)
{
if (eventDic.ContainsKey(name))
eventDic[name].Invoke(objinfo);
}
public void RemoveEventListener(string name, Action<object> action)
{
if (eventDic.ContainsKey(name))
eventDic[name] -= action;
}
public void Clear()
{
eventDic.Clear();
}
}
主角代码:
public class Player : MonoBehaviour
{
private void Awake()
{
EventManager.getInstance().AddEventListener("EnemyDead", EnemyDie);
}
//避免当有多种怪物死亡时(多种触发条件)无法具体判断是哪种怪物从而导致事件的混乱,
public void EnemyDie(object objInfo)
{
Debug.Log((objInfo as Enemy).gameObject.name);
//敌人死亡做什么操作
}
private void OnDestroy()
{
EventManager.getInstance().RemoveEventListener("EnemyDead", EnemyDie);
}
}
敌人代码:
public class Enemy : MonoBehaviour
{
void Start()
{
DeadFunc();
}
void DeadFunc()
{
EventManager.getInstance().EventTrigger("EnemyDead",this);
}
}
本片博文参考来源:https://www.cnblogs.com/MinervaZhang/p/15293890.html;
相关链接
Unity程序基础框架__单例基类模块
Unity程序基础框架__缓存池模块
Unity程序基础框架__事件中心模块
Unity程序基础框架__公共Mono模块
Unity程序基础框架__场景切换模块
Unity程序基础框架__资源加载模块
Unity程序基础框架__输入控制模块
Unity程序基础框架__事件中心模块基类优化
Unity程序基础框架__音效管理模块
Unity程序基础框架__UI管理模块