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

Unity笔记——事件中心

事件中心是什么

事件中心是 Unity 游戏开发中常用的架构设计,它基于观察者模式 或 发布-订阅模式,通过委托事件构建的一种消息管理系统。主要用于降低代码耦合度,实现模块间的松耦合通信的消息处理系统能大幅提升代码的可维护性和扩展性,允许不同脚本在不直接引用彼此的情况下进行交互。

作用

1. 解耦代码,减少直接依赖

传统方式:A 脚本调用 B 脚本的方法,需要 GetComponent<B>() 或持有 B 的引用。

事件中心方式:A 触发事件,B 监听事件,两者无需互相知道对方存在。

2. 全局通信

任何脚本都可以监听或触发事件,适合跨场景、跨系统的通信(如UI更新、游戏状态变化、敌人死亡通知等)。

3. 动态管理事件

可以随时添加/移除事件监听,避免硬编码调用关系。

适合动态场景(如玩家死亡后取消某些监听)。

4. 支持多参数传递

事件可以携带数据(如 int damage、string playerName、Vector3 position 等)。

应用场景

1. 游戏逻辑(如敌人死亡、任务完成)

2. UI交互(如按钮点击、数据更新)

3. 场景切换(如清理事件缓存)

实现方式

EventCenter 代码可直接食用,无需挂载在场景中,可供全局使用。

该消息中心设置了一个不限返回数据类型的委托    params object[] msg;

同时将消息名和对应的回调方法以键值对的方式存储在字典中    Dictionary<string, EventHandler>;

消息中心除了在触发相应事件的时候调用相应的回调函数,还能传回不同类型、数量的数据。

using UnityEngine;
using System.Collections.Generic;public static class EventCenter
{// 事件委托定义,用于回调函数,参数为object数组,返回值为空public delegate void EventHandler(params object[] msg);// 消息字典private static Dictionary<string, EventHandler> messageDic = new Dictionary<string, EventHandler>();// 注册消息监听public static void AddListener(string msgName, EventHandler eventHandler){if (messageDic.ContainsKey(msgName)){messageDic[msgName] += eventHandler;}else{messageDic.Add(msgName, eventHandler);}}// 注销消息监听public static void RemoveListener(string msgName, EventHandler eventHandler){if (messageDic.ContainsKey(msgName)){messageDic[msgName] -= eventHandler;if (messageDic[msgName] == null){messageDic.Remove(msgName);}}}// 触发消息public static void TriggerEvent(string msgName, params object[] msg){if (messageDic.TryGetValue(msgName, out EventHandler eventHandler)){eventHandler.Invoke(msg);}else{Debug.Log("消息" + msgName + "未注册");}}// 清空所有消息监听public static void Clear(){messageDic.Clear();}
}

 使用方法

先注册消息,开始监听事件。根据需求注销消息,取消监听事件。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameManager: MonoBehaviour
{private void Start(){// 注册消息EventCenter.AddListener("startGame", StartGame);}private void OnDestroy(){// 注销消息EventCenter.RemoveListener("startGame", StartGame);}// 被监听的事件所对应的方法需要有一个与委托对应的参数类型  object[] args = nullpublic void StartGame(object[] args = null){if (args != null){foreach (var arg in args){Debug.Log(arg);}}Debug.Log("Start Game");}
}

触发消息,触发监听事件。同时,下面设置了三个用例,在触发回调函数的同时还传回相关参数。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test: MonoBehaviour
{private void Update(){if (Input.GetKeyDown(KeyCode.J)){Test1();}if (Input.GetKeyDown(KeyCode.K)){Test2();}if (Input.GetKeyDown(KeyCode.L)){Test3();}}void Test1(){// 触发消息EventCenter.TriggerEvent("startGame");}void Test2(){// 触发消息EventCenter.TriggerEvent("startGame", 1);}void Test3(){// 触发消息EventCenter.TriggerEvent("startGame", 1, "test");}
}

 

http://www.xdnf.cn/news/1166743.html

相关文章:

  • Web3介绍(Web 3.0)(一种基于区块链技术的去中心化互联网范式,旨在通过技术手段实现用户对数据的自主权、隐私保护和价值共享)
  • 算法第26天|贪心算法:用最少数量的箭引爆气球、无重叠区间、划分字母区间
  • solidity从入门到精通 第二章:Solidity初相见
  • AI 音频产品开发模板及流程(二)
  • 数据结构 堆(2)---堆的实现
  • Markdown 转 PDF API 数据接口
  • Android ViewModel 深度解析:原理、使用与最佳实践
  • Redis——Redis进阶命令集详解(下)
  • Docker Compose UI远程访问教程:结合贝锐花生壳实现内网穿透
  • Qt中QObject类的核心作用与使用
  • C++函数 vs Go函数
  • Qt基本控件使用:按钮、标签、文本框等
  • 【打怪升级 - 01】保姆级机器视觉入门指南:硬件选型 + CUDA/cuDNN/Miniconda/PyTorch 安装全流程(附版本匹配秘籍)
  • Kotlin多线程调试
  • freertos关键函数理解 uxListRemove
  • 拼多多视觉算法面试30问全景精解
  • 【AI时代速通QT】第五节:Qt Creator如何引入第三方库,以OpenCV为例
  • 《汇编语言:基于X86处理器》第9章 字符串和数组(2)
  • 库制作与原理
  • Vue 3 面试题全套题库
  • Elasticsearch安装指南
  • 【集群】MySQL的主从复制了解吗?会有延迟吗,原因是什么?
  • AngularJS 动画
  • RabbitMQ--批量处理
  • Linux 内核与底层开发
  • Axios 二次封装
  • 用org.apache.pdfbox 转换 PDF 到 图片格式
  • EMA《2025-2028年药品监管中的数据与AI 1.3版》信息分析
  • OEC 刷机Armbain 25.05后配置说明
  • 扣子Coze智能体实战:自动化拆解抖音对标账号,输出完整分析报告(喂饭级教程)