【Unity】搭建泛型事件框架,可广泛应用于中小型的游戏项目!!!

1.前言

1.1 普通的事件框架的缺陷

普通的事件框架,通常是创建一个EventHandler脚本文件,在里面定义大量的事件和对应的激活方法,然后再在对应的脚本当中编写监听方法,例如:

//EventHandler.cs
public static event Action OnSceneLoad;
public static void CallOnSceneLoad()
{OnSceneLoad?.Invoke();
}

然后,对应的脚本对事件进行订阅

//比如,这是某个脚本要监听这个事件
private void OnEnable()
{//订阅事件EventHandler.OnSceneLoad+=OnSceneLoad;
}
​
private void OnDisable()
{//取消订阅事件EventHandler.OnSceneLoad-=OnSceneLoad;
}
​
private void OnSceneLoad()
{//要执行的内容
}

这样无论是在代码中还是在Inspector窗口中,都十分的不直观,而且这样框架下,事件系统在后续的维护会很麻烦,因此,需要考虑到开发一套泛型开发框架,能够在Inspector窗口中快捷的修改事件订阅。

1.2 泛型事件框架的设计思路

对于泛型事件的框架,需要利用面向对象的思想来实现。

事件框架分为“事件广播者”和“事件监听者”。

  1. 事件广播者:负责广播事件,存储着事件广播的信息,需要一个泛型委托和一个广播函数组成,泛型委托用于存储订阅者,广播函数用于激活泛型委托

  2. 事件监听者:负责监听来自事件广播者的事件,需要确定监听的广播者,并定义Unity事件用于在接收到广播之后执行相应的方法

2.泛型事件框架的实现

下面是基本的泛型事件实现案例,可以根据个人的项目需求进行调整

2.1 创建事件广播者基类(SO)

这里可以将事件广播者继承ScriptableObject,但是不要写[CreateAssetMenu]标注,这个留给子类来写

using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// 事件SO基类
/// </summary>
public class BaseEventSO<T> : ScriptableObject
{[Header("事件描述")][TextArea]public string description;
​public UnityAction<T> OnEventRaised;
​public string lastSender; //最后一个发送广播的对象(可选)/// <summary>/// 广播事件/// </summary>/// <param name="value">要广播的值</param>/// <param name="sender">广播发送者(可选)</param>public void RaiseEvent(T value,object sender){OnEventRaised?.Invoke(value);lastSender = sender.ToString();}
}

2.2 创建事件监听者基类

事件监听者默认继承MonoBehavior即可,需要写上要监听的事件广播者,同时定义一个UnityEvent类型用于绑定接收到事件之后需要执行的函数

using System;
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// 事件监听器基类
/// </summary>
public class BaseEventListener<T> : MonoBehaviour
{/// <summary>/// 要监听的事件广播者/// </summary>public BaseEventSO<T> eventSO;/// <summary>/// 当eventSO中的事件被激活的之后,///  执行response中订阅的方法/// </summary>public UnityEvent<T> response; private void OnEnable(){if (eventSO != null){//订阅事件eventSO.OnEventRaised += OnEventRaised;}}
​private void OnDisable(){if (eventSO != null){//注销事件eventSO.OnEventRaised -= OnEventRaised;}}/// <summary>/// 接收到事件广播/// </summary>/// <param name="value"></param>private void OnEventRaised(T value){response.Invoke(value); //执行接收到事件后要执行的函数}
}

2.3 创建事件广播者的子类(SO)

这里这个子类就用来广播来自object类型的数据,继承其事件广播者的基类

using UnityEngine;
​
[CreateAssetMenu(fileName = "ObjectEventSO",menuName = "Events/ObjectEventSO")]
public class ObjectEventSO : BaseEventSO<object>
{}

2.4 创建事件监听者的子类

继承事件监听者的基类

using UnityEngine;
​
public class ObjectEventListener : BaseEventListener<object>
{}

2.5 创建事件广播者的SO文件

有了上述的框架基础之后,我们就可以实现这样的可视化操作:

  1. 在project窗口中创建多个事件的SO文件,以用于定义多个不同的事件

  2. 在指定对象的Inpector窗口中添加多个事件监听者,通过可视化的方式管理要监听的事件(引用SO文件)以及事件激活后要执行的方法。

2.6 订阅事件

将事件监听者子类的脚本挂载到场景中要监听事件的对象上,同时,根据自身项目需求,给事件监听者挂载要监听的事件广播者,并为该事件订阅单个或多个方法。

由于事件监听者已经独立化,所以你可以为一个对象添加多个事件监听者脚本,以方便监听多个事件。

2.7 广播事件

在需要发送广播的对象的脚本中,定义变量来引用指定的事件广播者(引用事件广播者的SO文件),然后在合适的时机广播事件即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17781.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 创建API key 首先进入DeepSeek官网,https://www.deepseek.com/ 点击左侧“API Keys”,创建API key,输出名称为“AI” 点击“创建",将API key保存,复制在其它地方。 在PyCharm中下载Continue插件 安装 下载中 下载完成后,点击OK 配…

鸿蒙开发:了解@Builder装饰器

前言 本文代码案例基于Api13&#xff0c;温馨提示&#xff1a;内容相对来说比较简单&#xff0c;如果您已掌握&#xff0c;略过即可。 如果说一个页面中组件有很多&#xff0c;我们都统一写到build函数中&#xff0c;显而易见&#xff0c;会导致build函数代码非常冗余&#xff…

一文深入了解DeepSeek-R1:模型架构

本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型&#xff0c;以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 &#x1f4dd; 1. 输入上下文长度 DeepSeek-R1的输入上下文长…

Linux进程管理

一、进程查看 1、进程 进程 process 计算机执行任务的最小单位 2、进程查看 ps auxa&#xff1a;all u&#xff1a;user x&#xff1a;所有终端 所有用户所有终端的所有进程 COMMAND&#xff1a; 进程名称 USER&#xff1a; 启动进程的用户&…

(5/100)每日小游戏平台系列

新增一个数字迷宫游戏&#xff01; 数字迷宫游戏是一款基于迷宫探索的益智游戏。玩家从迷宫的起点出发&#xff0c;必须根据迷宫中的数字指示&#xff0c;选择正确的方向&#xff0c;通过迷宫最终到达终点。游戏的目标是尽快找到并到达终点。 游戏规则 起点与终点&#xff1a;…

latex二重闭合积分显示

latex二重闭合积分显示 环境 texlive2024texstdio4.8.6 解决 添加宏包 \usepackage{esint} % 在导言区加载宏包符号 \oiint测试 documentclass[12pt]{article} \usepackage{esint} % 在导言区加载宏包 \title{Hello} \author{Houor}\begin{document}\maketitleHello, \L…

WebP2P+自研回音消除:视频通话SDK嵌入式EasyRTC构建高交互性音视频应用

随着移动互联网时代的到来&#xff0c;手机端的扬声器大多采用外置设计&#xff0c;且音量较大。在这种情况下&#xff0c;扬声器播放的声音更容易被麦克风捕捉&#xff0c;从而导致回声问题显著加剧。这种设计虽然方便用户在免提模式下使用&#xff0c;但也带来了更复杂的音频…

二分查找sql时间盲注,布尔盲注

目录 一&#xff1a;基础知识引导 数据库&#xff1a;information_schema里面记录着数据库的所有元信息 二&#xff0c;布尔盲注&#xff0c;时间盲注 &#xff08;1&#xff09;布尔盲注案例&#xff08;以sqli-labs第八关为例&#xff09;&#xff1a; &#xff08;2&am…

机器学习 - 理论和定理

在机器学习中&#xff0c;有一些非常有名的理论或定理&#xff0c;对理解机器学习的内在特性非常有帮助。本文列出机器学习中常用的理论和定理&#xff0c;并举出对应的举例子加以深化理解&#xff0c;有些理论比较抽象&#xff0c;我们可以先记录下来&#xff0c;慢慢啃&#…

Linux Mem -- ARM8.5-A Memory Tagging Extension

目录 1 介绍 2 威胁模型 3 MTE的内存安全 4 架构细节 5 在ARMv8-A架构&#xff0c;MTE添加了如下指令&#xff0c;可根据策略分为三种&#xff1a; 6 大量部署MTE 7 MTE的硬件层部署 8 MTE的软件层部署 8.1 Heap Tagging 8.2 Stack Tagging 9 MTE优化 近期在深入了解A…

深入剖析推理模型:从DeepSeek R1看LLM推理能力构建与优化

著名 AI 研究者和博主 Sebastian Raschka 又更新博客了。原文地址&#xff1a;https://sebastianraschka.com/blog/2025/understanding-reasoning-llms.html。这一次&#xff0c;他将立足于 DeepSeek 技术报告&#xff0c;介绍用于构建推理模型的四种主要方法&#xff0c;也就是…

如何保持 mysql 和 redis 中数据的一致性?PegaDB 给出答案

MySQL 与 Redis 数据保持一致性是一个常见且复杂的问题&#xff0c;一般来说需要结合多种策略来平衡性能与一致性。 传统的解决策略是先读缓存&#xff0c;未命中则读数据库并回填缓存&#xff0c;但方式这种维护成本较高。 随着云数据库技术的发展&#xff0c;目前国内云厂商…

Vue 入门到实战 十

第10章 Vue Router​​​​​​​ 目录 10.1 什么是路由 10.2 Vue Router的安装 10.2.1 本地独立版本方法 10.2.2 CDN方法 10.2.3 NPM方法 10.2.4 命令行工具&#xff08;Vue CLI&#xff09;方法 10.3 Vue Router的基本用法 10.3.1 跳转与传参 10.3.2 配置路由 10.…

Java并发中的CAS机制:原理、应用与挑战(通俗易懂版)

上一期文章内容&#xff1a;Java并发中的乐观锁与悲观锁&#xff0c; 本期文章我们来讲一下Java并发中的CAS机制 一、从银行账户案例理解CAS CAS 是一种乐观锁机制&#xff0c;用于在不使用锁的情况下实现多线程对共享资源的并发访问。 它包含三个操作数&#xff1a;内存位置&a…

SpringBoot自动配置-以Mybatis配置为例

SpringBoot自动配置 无基础的直接看链接内容&#xff0c;有基础就直接顺着往下看就可以 Spring底层&#xff08;自动配置&#xff09; 自动配置就是EnableXXX封装Improt&#xff08;ImportSelector的实现类&#xff09;对应方法selectImoprt返回字符串数组为类名会注册为bean…

2025 docker可视化管理面板DPanel的安装

1.什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&#xff1a;提供直观的用户界面&#…

DeepSeek从入门到精通(清华大学)

​ DeepSeek是一款融合自然语言处理与深度学习技术的全能型AI助手&#xff0c;具备知识问答、数据分析、编程辅助、创意生成等多项核心能力。作为多模态智能系统&#xff0c;它不仅支持文本交互&#xff0c;还可处理文件、图像、代码等多种格式输入&#xff0c;其知识库更新至2…

Word 里面嵌入DeepSeek

目录 一、问题描述 二、解决方法 三、代码 四、注意事项 五、总结 一、问题描述 如何在Word里面嵌入DeepSeek? 二、解决方法 1、新建文档&#xff0c;按 AltF11&#xff0c;进入VB界面。 2、选中文档&#xff0c;右键->插入->模块。 3、进入模块&#xff0c;粘入…

java面试题-集合篇

Collection 1.Collection有哪些类&#xff1f; Java集合框架中的Collection接口是所有集合类的基础接口&#xff0c;定义了一些基本的集合操作&#xff0c;如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。 List List接口定义了按照索引…

国内 网络安全沙箱

CSRF攻击 CSRF攻击概述&#xff1a; CSRF&#xff08;Cross Site Request Forgery, 跨站域请求伪造&#xff09;是一种网络的攻击方式&#xff0c;它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患&#xff0c;比如 SQL 脚本注入&#xff0c;跨站域脚本攻击等在近…