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 事件中心相关推荐

  1. Unity程序框架总结归置系列(3)——事件中心

    上一篇--Unity程序框架总结归置系列(2)--对象池 依然是话不多说,直接肝. /// <summary> /// 事件中心 /// </summary> public c ...

  2. Unity 事件番外篇:事件管理中心(另一种版本)

    前置知识:Unity 事件管理中心 本篇博客展示的是事件管理中心的另一种写法.如果大家想了解其中的原理,可以看看前置知识里的介绍. 之前那个版本的事件管理中心,利用 EventHandler 和 Ev ...

  3. Unity游戏框架学习笔记——03基于观察者模式的事件中心

    Unity游戏框架学习笔记--03基于观察者模式的事件中心 基于观察者模式的事件中心 一如既往指路牌:https://www.bilibili.com/video/BV1C441117wU?p=5. ...

  4. 脚本事件中心与事件订阅器

    在脚本中,要订阅COM对象的连接点事件,必须要通过对象容器来实现,且无法对获取到的二级接口进行订阅事件.通过实现的脚本订阅器,即可轻松实现.另外通过事件中心,可以在脚本中轻松实现模块解耦. 一.事件订 ...

  5. NBF事件中心架构设计与实现

    简介:NBF是阿里巴巴供应链中台的基础技术团队打造的一个技术PaaS平台,她提供了微服务FaaS框架,低代码平台和中台基础设施等一系列的PaaS产品,旨在帮助业务伙伴快速复用和扩展中台能力,提升研发效 ...

  6. 事件中心与观察者模式

    事件中心与观察者模式 楔子 观察者模式 事件中心demo 被观察者 具体的事件 观察者 具体事件的具体观察者 主题 具体的主题->事件中心 验证事件中心 总结 楔子 event一种我们在代码中经 ...

  7. 实践 | Kafka 不够好,智联招聘基于 Pulsar 打造企业级事件中心

    消息队列作为智联招聘非常重要的平台级服务负责全业务线的消息投递.有很多非常典型的业务场景,我们用一个业务场景简历投递来说明消息队列为业务提供的支持 图 1. 简历投递业务 当 C 端用户发生一次简历投 ...

  8. Apache Pulsar在智联招聘的实践 -- 从消息队列到基于Apache Pulsar的事件中心

    导读:本文中鹏辉介绍了以前的消息中间件在智联招聘的应用和场景:以及对消息中间件选型的诉求:详细描述了选型过程中的细致思考.接着介绍了为什么会选择Pulsar,以及Pulsar中和智联的场景匹配的特性. ...

  9. 业务事件中心设计思想

    这里看原文 本文只是提供一个简单的思考方向,实现方案只是举例说明,如果读者也需要一个类似的功能,可以根据以下思路去完善. 背景 在订单系统的业务中通常会碰到类似这样的功能 订单5分钟未支付自动取消订单 ...

最新文章

  1. 嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得
  2. Nested Mappings
  3. gitolite搭建
  4. Big Data Exchange宣布在南京建设数据中心
  5. python抓取中文网页乱码
  6. C++基本入门资料搜集
  7. 不要重新发明轮子_是否重新发明轮子
  8. 如何设置Active Directory域控制器
  9. 二级java考什么_计算机二级Java考试资料!
  10. jdk1.5的类转换成jdk1.4的类文件
  11. web前端项目实例网站_2020最全web前端项目实战课程(含项目实战+源码)
  12. 记2021上半年软考中级-数据库系统工程师考试
  13. 变频器供电高频电子变压器电源电压检测
  14. java pos58打印_POS58票据热敏打印机,怎么用ESC/POS命令控制打印
  15. Python爬虫:爬取必应壁纸(可直接运行)
  16. 图像处理:图像清晰度评价
  17. manjaro go的安装
  18. list遍历删除元素
  19. Excel批量插入多行空白行
  20. 报童问题求解最大利润_仿真实例009:汽车天线仿真(双向混合求解)

热门文章

  1. 【引路帖】【MATLAB】【求解最优化问题】
  2. 字体的分类图示——对网页设计很有益的图
  3. Arduino - 继电器
  4. word删除页眉下面的横线
  5. nginx报错问题记录
  6. sequencer和driver
  7. C++线性表(单链表)的应用算法(附源码)
  8. 蓝桥杯嵌入式CT117E硬件开发平台经验分享11 | 第九届蓝桥杯国赛题
  9. Linux系统下detectron2安装(cuda11为例)
  10. python flask上传Excel并把Excel的数据导入数据库