【GameFramework框架内置模块】7、事件(Event)

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

【GameFramework框架】系列教程目录:
https://blog.csdn.net/q764424567/article/details/135831551

二、正文

2-1、介绍

事件(Event)是一个实现游戏逻辑监听、抛出事件的机制。

GameFramework的很多模块都会在完成操作后抛出内置事件,这些监听事件可以大大改善游戏逻辑之间的耦合。

除了GameFramework内置事件外,使用者也可以自定义自己的游戏监听事件,只需要继承于GameEventArgs类即可,事情框架都帮我们做好了。

事件对象使用了引用池技术,避免使用事件过程中频繁的内存分配。

GameFramework的事件系统,使用了观察者设计模式,允许游戏对象之间的松耦合通信和交互。采用了面向对象的注册方法,让代码结构性更强,耦合性降低。

下面就来看一下GameFramework事件系统如何使用吧。

2-2、使用说明

事件接收:

public virtual void Initialize()
{//绑定事件,Id由EventArgs提供静态只读的EventIdGameEntry.Event.Subscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
}
//事件回调
protected virtual void OnShowEntitySuccess(object sender, GameEventArgs e)
{ShowEntitySuccessEventArgs ne = (ShowEntitySuccessEventArgs)e;//接收EventArgs数据
}

事件发送:

namespace UnityGameFramework.Runtime
{/// 实体组件。public sealed partial class EntityComponent : GameFrameworkComponent{//实体创建成功,发送广播private void OnShowEntitySuccess(object sender, GameFramework.Entity.ShowEntitySuccessEventArgs e){m_EventComponent.Fire(this, ShowEntitySuccessEventArgs.Create(e));}}
}

2-3、实现及代码分析

GameFramework中的事件系统主要由三部分组成:
在这里插入图片描述

EventManager.cs
EventManager负责事件的注册、取消和触发,以及事件的分发和响应。

通过Subscribe订阅时间,Fire方法触发事件,实现游戏对象之间的通信。

namespace GameFramework.Event
{/// 事件管理器。internal sealed class EventManager : GameFrameworkModule, IEventManager{//使用事件池存储事件private readonly EventPool<GameEventArgs> m_EventPool;/// 订阅事件处理函数。public void Subscribe(int id, EventHandler<GameEventArgs> handler){m_EventPool.Subscribe(id, handler);}/// 取消订阅事件处理函数。public void Unsubscribe(int id, EventHandler<GameEventArgs> handler){m_EventPool.Unsubscribe(id, handler);}/// 抛出事件,这个操作是线程安全的,即使不在主线程中抛出,也可保证在主线程中回调事件处理函数,但事件会在抛出后的下一帧分发。public void Fire(object sender, GameEventArgs e){m_EventPool.Fire(sender, e);}}

GameEventArgs.cs
GameEventArgs表示一个事件包含的数据类,可以自定义数据类型。

事件被触发时,会将事件包含的数据传递给响应的事件处理函数。

事件ID是通过获取类的HashCode,省去自定义EventId。

namespace GameFramework
{/// 事件基类。public class GameEventArgs : BaseEventArgs {/// 显示实体成功事件编号。public static readonly int EventId = typeof(xxxxEventArgs).GetHashCode();/// 获取类型Id。public int Id{get{return EventId;}}}
}

EventHandler.cs
EventHandler是响应事件的函数,注册事件主要自己定义一个需要响应的事件。

通过Subscribe方法注册的事件处理器,当事件触发时,会调用相应的事件处理器。

namespace System
{/// <summary>表示当事件提供数据时将处理该事件的方法public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
}

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

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

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

相关文章

ADG切换脚本

--查看主备库的切换状态 set linesize 200 select name,log_mode,open_mode,database_role,protection_mode,switchover_status from v$database; --查看归档日志 archive log list; select thread#,sequence#,first_time,next_time,applied from v$archived_log where th…

ChatGPT与音乐领域的新篇章

### ChatGPT与音乐领域的新篇章 随着人工智能技术的日趋成熟&#xff0c;ChatGPT等先进的语言模型已经开始在音乐领域展示其独特的影响力和潜力。ChatGPT不仅改变了音乐创作、分析和教学的方式&#xff0c;而且还为音乐爱好者和专业人士提供了全新的交互体验。本文将探讨ChatG…

windows/linux下其他位置调用指定nodejs脚本报错Error: Cannot find module ‘esm’

问题&#xff1a; 有一个nodejs脚本名为html2word,同目录下还有它对应的package.json&#xff0c;正常在html2word所在目录下执行脚本没问题&#xff0c;但是在其他目录执行时报错&#xff1a;Error: Cannot find module ‘esm’ 原因&#xff1a; 在其他位置执行node脚本时…

【Vue】路由

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 目录 路由 单页应用程序 总结&#xff1a; VueRouter 核心步骤&#xff1a; 组件存放目录的问题 路由的封装 声明式导航 声明式导航 - 导航链…

Go语言必知必会100问题-11 使用选项模式

使用选项模式 在设计API时&#xff0c;可能会遇到一个问题&#xff1a;如何处理可选配置&#xff1f;有效的解决可选配置问题可以提高API的灵活性。本文通过一个具体示例说明处理可选配置的一些方法。该示例的要求是设计一个对外提供创建HTTP服务器的库函数。函数定义如下&…

记一次服务间调用失败的bug

1. 服务环境描述 1.所有服务都注册到Consul上&#xff0c;服务间调用采用的是服务名&#xff1b; 2.所有服务用docker容器化部署&#xff0c;用docker swarm管理服务集群&#xff1b; 3.docker compose编排文件里的所有服务的端口均未映射出来&#xff0c;即没有加 ports: -…

服了,阿里云服务器和腾讯云服务器价格差不多怎么选择?

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器62元一年&#xff0c;2核2G3M、2核4G、4核8G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配置价格表…

高级语言期末2011级B卷(计算机学院)

1.编写函数&#xff0c;实现按照如下公式计算的功能&#xff0c;其中n为自然数 #include <stdio.h>int fac(int n) {if(n0)return 1;elsereturn n*fac(n-1); }float fun(int n) {float flag;float sum0;for(int i0; i<n; i) {flagi/((i1)*fac(i2));sumflag;}return su…

重推请求之curl和fiddler

在实际的项目中会有出现问题&#xff0c;想重现的场景&#xff0c;比较重新调用一个服务&#xff0c;那么如何进行快速的重推请求呢&#xff0c;记录下来&#xff0c;方便备查。 主要有curl和fiddler两种方式&#xff0c;下面详细说。 方式一、curl 命令 curl 是一个利用URL规…

黑猫详解【UFS M-PHY】第1篇:MIPI M-PHY基础知识

本文依据Unipro1.8/M-PHY4.1/UFSHCI3.0协议及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,已加入原创维权,禁止私自转载。 文章所在专栏:《黑猫带你学:UFS协议栈详解》——UFS Unipro/M-PHY/HCI协议栈 兄弟专栏:《黑猫带你学:UFS协议详解》——…

云上攻防-云服务篇弹性计算服务器云数据库实例元数据控制角色AK控制台接管

知识点: 1、云服务-弹性计算服务器-元数据&SSRF&AK 2、云服务-云数据库-外部连接&权限提升 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&am…

租赁小程序|租赁系统|租赁软件开发带来高效运营

随着社会的不断发展和科技的不断进步&#xff0c;越来越多的企业开始关注设备租赁业务。设备租赁作为一种短期使用设备的方式&#xff0c;为企业提供了灵活和成本节约的优势。针对设备租赁业务的管理和提升企业竞争力的需求&#xff0c;很多企业选择定制开发设备租赁系统。本文…

【大数据】-- maxcompute/odps 存储优化之小文件合并

1、背景 在 flink 写入 odps 表时,发现抛出了异常。经过查询知道原因是该 odps table 表的小文件过多,超过了最大数量,导致写入失败。 2、小文件的定义 分布式文件系统按块(Block)存放数据,文件大小比块大小(64MB)小的文件称为小文件。分布式系统不可避免会产生小文件…

js 面试 1判断变量是否是数组 2 检测数据类型方法

1 是否是数组 1) typeof 检测数据类型运算符 优点&#xff1a;使用简单 缺点&#xff1a;只能检测基本类型&#xff08;除null外&#xff09; console.log(typeof(10)) //Number console.log(typeof(false)) //boolean console.log(typeof(hello)) //string console.log(typeof…

【Python】requests库的介绍及用法

目录 1、应用场景 2、requests-三方库 1、应用场景 Python中的requests库被广泛应用在需要发送HTTP请求的场景中。以下列举了一些主要的应用场景&#xff1a; API调用&#xff1a; 许多服务提供了API接口&#xff0c;我们可以使用requests库发送GET、POST、PUT、DELETE等请…

vue使用gitshot生成gif

vue使用gitshot生成gif 问题背景 本文将介绍vue中使用gitshot生成gif。 问题分析 解决思路&#xff1a; 使用input组件上传一个视频&#xff0c;获取视频文件后用一个video组件进行播放&#xff0c;播放过程进行截图生成图片数组。 demo演示上传一个视频&#xff0c;然后生…

如何使用Docker部署IT-Tools并结合内网穿透实现公网访问本地工具箱服务

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…

C++之数组

1&#xff0c;概述 所谓数组&#xff0c;就是一个集合&#xff0c;里面存放了相同类型的数据元素 特点1&#xff1a;数组中没干过数据元素都是相同的数据类型 特点2&#xff1a;数组都是连续存放位置组成的 2&#xff0c;一维数组 2.1 一维数组的定义 一维数组定义有三种…

Leetcode583. 两个字符串的删除操作 -代码随想录

题目&#xff1a; 代码(首刷自解 2024年2月29日&#xff09;&#xff1a; class Solution { public:// 动态规划 好像和找最长公共子序列一样&#xff1f;int minDistance(string word1, string word2) {int sz1 word1.size();int sz2 word2.size();// dp initvector<vec…

SD-WAN技术:优化国内外服务器访问的关键

在全球化的商业环境中&#xff0c;企业经常需要在国内访问国外的服务器。然而&#xff0c;由于地理位置和网络架构的限制&#xff0c;这种跨国访问往往会遇到速度慢、延迟高等问题。SD-WAN&#xff08;软件定义广域网&#xff09;技术的兴起&#xff0c;为企业提供了一种新的解…