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

推荐阅读

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

一、前言

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

二、正文

2-1、介绍

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

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

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

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

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

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

2-2、使用说明

事件接收:

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

事件发送:

csharp 复制代码
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方法触发事件,实现游戏对象之间的通信。

csharp 复制代码
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。

csharp 复制代码
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方法注册的事件处理器,当事件触发时,会调用相应的事件处理器。

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

三、后记

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


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

博主主页有联系方式。

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

专栏 方向 简介
Unity3D开发小游戏 小游戏开发教程 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶 入门 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUI UGUI Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据 文件读取 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合 数据集合 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发 虚拟仿真 总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件 插件 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发 日常记录 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG 日常记录 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
相关推荐
懒大王爱吃狼38 分钟前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
秃头佛爷2 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
待磨的钝刨2 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
△曉風殘月〆3 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
XiaoLeisj4 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
励志成为嵌入式工程师5 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
逐·風5 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
捕鲸叉5 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer5 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端