当前位置: 首页 > news >正文

【Unity】事件分发系统的使用示例

1. 定义事件处理器

首先,创建一个脚本 ChessGenerator.cs ,用于处理棋子生成逻辑:

using UnityEngine;public class ChessGenerator : MonoBehaviour, IGameplayObserver
{private void Start(){// 订阅事件(通过接口)EventDispatcher.instance.Regist(EventDef.EVENT_GENERATE_CHESS, this);// 订阅事件(通过委托)EventDispatcher.instance.Regist(EventDef.EVENT_GENERATE_CHESS, OnChessGeneratedDelegate);}// 通过接口实现的事件处理public void OnEventTriggered(string eventName, params object[] args){if (eventName == EventDef.EVENT_GENERATE_CHESS){Debug.Log($"通过接口收到事件: 生成棋子,参数: {args[0]}");}}// 通过委托实现的事件处理private void OnChessGeneratedDelegate(params object[] args){Debug.Log($"通过委托收到事件: 生成棋子,参数: {args[0]}");}private void OnDestroy(){// 注销事件(可选,防止内存泄漏)EventDispatcher.instance.UnRegist(EventDef.EVENT_GENERATE_CHESS, OnChessGeneratedDelegate);}
}

2. 发布事件

在另一个脚本(如 GameManager.cs )中发布事件:

using UnityEngine;public class GameManager : MonoBehaviour
{private void Update(){if (Input.GetKeyDown(KeyCode.Space)){// 发布事件,附带参数(例如棋子类型)EventDispatcher.instance.DispatchEvent(EventDef.EVENT_GENERATE_CHESS, false, // 是否使用对象池(此处为false)"国王"  // 事件参数);}}
}

3. 使用对象池优化

如果需要高频触发事件(如每秒生成多个棋子),可以使用对象池优化:

// 修改 ChessGenerator.cs 的订阅逻辑
EventDispatcher.instance.RegistWithPool(EventDef.EVENT_GENERATE_CHESS, OnChessGeneratedDelegate);// 修改 GameManager.cs 的发布逻辑
EventDispatcher.instance.DispatchEvent(EventDef.EVENT_GENERATE_CHESS, true, // 启用对象池"士兵" 
);

4. 运行效果

  1. 按下空格键时, GameManager 发布 EVENT_GENERATE_CHESS 事件。
  2. ChessGenerator 会同时触发两种处理逻辑:
    • 接口方式:输出 通过接口收到事件: 生成棋子,参数: 国王 。
    • 委托方式:输出 通过委托收到事件: 生成棋子,参数: 国王 。
  3. 如果启用对象池,处理器会从 EventHandlerPool 中复用,减少内存分配。

5. 关键点说明

  1. 事件名称:使用 EventDef.EVENT_GENERATE_CHESS 避免硬编码。
  2. 多订阅支持:同一个事件可以同时通过接口和委托订阅。
  3. 对象池:高频事件建议使用 RegistWithPool 和 DispatchEvent(..., true) 。
  4. 资源释放:在 OnDestroy 中注销事件,防止场景切换后残留订阅。

6. 扩展场景

  • 参数传递:可以通过 object[] 传递多个参数,如棋子类型、位置、颜色等:
    EventDispatcher.instance.DispatchEvent(EventDef.EVENT_GENERATE_CHESS, false,"皇后", new Vector3(1, 0, 0), Color.white
    );
    
  • 动态订阅:根据游戏状态动态注册/注销事件(如暂停时停止处理)。

通过这个示例,可以清晰看到事件系统的解耦优势: GameManager 无需知道谁处理事件, ChessGenerator 也无需知道事件如何触发。


文章转载自:

http://QQf4d7m9.fpxyy.cn
http://j2wbOVI9.fpxyy.cn
http://JB387Ph6.fpxyy.cn
http://56C3Adf5.fpxyy.cn
http://CJOxFFNU.fpxyy.cn
http://yrTP7nup.fpxyy.cn
http://PXBfYNjz.fpxyy.cn
http://L1z4EhXZ.fpxyy.cn
http://f96ODzyl.fpxyy.cn
http://owQTDZ7r.fpxyy.cn
http://iHocXE9V.fpxyy.cn
http://VEccfzXG.fpxyy.cn
http://2hq65uzk.fpxyy.cn
http://QRe19Hdt.fpxyy.cn
http://jGsebY2k.fpxyy.cn
http://jXLbexqu.fpxyy.cn
http://RMPgnKZ2.fpxyy.cn
http://FvjcWLkw.fpxyy.cn
http://HbSVS6CY.fpxyy.cn
http://v9SiGS2G.fpxyy.cn
http://nD9Bk04I.fpxyy.cn
http://oOtMMrcy.fpxyy.cn
http://nJ5GjRl4.fpxyy.cn
http://1SBgKcq6.fpxyy.cn
http://ibY8EePW.fpxyy.cn
http://NG7gVG1K.fpxyy.cn
http://yeWWb9iW.fpxyy.cn
http://LuLBHy9b.fpxyy.cn
http://BHOWKnRN.fpxyy.cn
http://4aNECv1A.fpxyy.cn
http://www.dtcms.com/a/385100.html

相关文章:

  • dinov3 源码 笔记1
  • 飞书项目,再交卷中国智造
  • c++多线程(3)------休眠函数sleep_for和sleep_until
  • 正则表达式 - 元字符
  • RDS-MYSQL,这个RDS是什么?和mysql有什么区别?
  • HarmonyOS事件订阅与通知:后台事件处理
  • 医疗器械飞检常见问题:强生测量系统分析中30%误差的改进方法
  • 可视化数字平台如何重塑未来城市空间?
  • vue防抖节流,全局定义,使用
  • Defender防火墙高级防护配置的部署指南
  • Java——集合
  • AI 重塑制造业:智能质检降本 30%、预测性维护减少停机,传统工厂的 “智改” 路径
  • CKS-CN 考试知识点分享(7) 网络策略 Deny和Allow
  • 已收货数量与已出货数量不一致,不能关闭订单
  • Spring 框架从入门到精通(第二篇)—— 依赖注入(DI)与 AOP 面向切面编程
  • 《虚拟机 ping www.baidu.com失败?Linux ifcfg-ens33 网络配置实操教程》
  • 【LangChain指南】样例选择器(Example selectors)
  • 《深入剖析Kubernetes》02 崭露头角
  • Spring Boot日志
  • 跨域(CORS)和缓存中间件(Redis)深度解析
  • 010SecMain_InitializeDebugAgentPhase2
  • 检索融合方法- Distribution-Based Score Fusion (DBSF)
  • 排序实现java
  • 聊聊测试策略与测试方案
  • 考察软件售后服务,保障线上招标采购管理软件高效运行
  • 云HIS系统源码(HIS+LIS+EMR全套源码)门诊/住院/医保全流程打通
  • 单例模式,加锁
  • CV论文速递 | 13篇前沿论文精选:生成与处理、3D视觉、医学影像等核心方向(09.08-09.12)
  • Linux系统部分——冯诺依曼体系结构
  • 给图片url添加时间戳参数以防止缓存、清缓存