04.事件中心模块

一、事件中心模块的作用:

降低程序耦合性,减小程序复杂度。

二、什么是观察者设计模式

观察者设计模式(Observer Design Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系:当一个对象(被观察者)的状态发生变化时,所有依赖它的对象(观察者)会自动收到通知并更新。

这种模式的核心思想是解耦被观察者和观察者,让它们可以独立变化,同时保持联动。

三、简单的事件中心模块代码

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// 事件中心 单例模式对象
/// </summary>
public class EventCenter : BaseManager<EventCenter>
{
    private Dictionary<string, UnityAction<object>> eventDic = new Dictionary<string, UnityAction<object>>();
    //key :事件的名字
    //value: 监听这个事件的对应的委托函数们

    /// <summary>
    /// 添加事件监听
    /// </summary>
    /// <param name="name">事件的名字</param>
    /// <param name="action">准备用来处理事件的委托函数</param>
    public void AddEventLisner(string name,UnityAction<object> action)
    {
        if(eventDic.ContainsKey (name))
        {
            eventDic[name] += action;//委托的基本用法
        }
        else
        {
            eventDic.Add(name, action);
        }
    }
    /// <summary>
    /// 移除对应的事件监听,若监听事件的对象被销毁而没有移除事件监听
    /// 会导致内存泄露(无法触发垃圾回收)
    /// </summary>
    /// <param name="name">事件的名字</param>
    /// <param name="action">对应之前添加的委托函数</param>
    public void RemovaEventLisner(string name,UnityAction<object> action)//在 OnDestroy()生命周期函数中调用
    {
        if(eventDic.ContainsKey (name))
        {
            eventDic[name] -= action;
        }
    }

    /// <summary>
    /// 事件触发
    /// </summary>
    /// <param name="name">哪个事件触发了(名字)</param>
    public void EventTrigger(string name,object info)
    {
        if(eventDic.ContainsKey (name))
        {
            //eventDic[name]();//另一种写法
            eventDic[name].Invoke(info);//执行这个委托监听的所有委托函数
        }
    }

    /// <summary>
    /// 清空事件中心,主要用在场景切换时
    /// 防止有监听函数没有被移除
    /// </summary>
    public void Clear()
    {
        eventDic.Clear();
    }
}
相关推荐
心易行者10 分钟前
Python自动化测试7步落地法:用python在线运行省掉90%环境配置时间
java·开发语言·人工智能·python·log4j·ai编程
后台模板学习31 分钟前
从0到1用Vite构建电商订单系统前端性能优化方案
前端
Wang's Blog31 分钟前
Vibe Coding一人即团队系列58: HTML演示文稿自动生成
前端·人工智能·html
tedcloud12342 分钟前
OpenLogi 怎么搭建?用 Rust 打造一个轻量的 Logitech 外设管理工具
linux·运维·服务器·开发语言·后端·rust·开源
FoldWinCard1 小时前
基于k8s高可用web集群
前端·容器·kubernetes
神探小白牙1 小时前
海康视频在vue2.0中的使用
前端·音视频
Tanjia_kiki1 小时前
谷歌浏览器中F12编辑并重发请求
开发语言·前端·javascript
程序猿编码1 小时前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
honkun61 小时前
vue 表格组件 vxe-table 实现拖拽列字段自动生成透视表汇总
前端·javascript·vue.js
新中地GIS开发老师1 小时前
WebGIS开发入门 | 从 Web 开发到地图开发,差别在哪儿?
前端·vue·webgis