GameFramework源码学习(一)

本文介绍了GameFramework游戏框架的基础,重点关注了框架入口GameFrameworkEntry类,其包含的Update和Shutdown方法,以及UI模块的初步理解,包括UIManager类的功能和模块间通信。通过学习这些,读者可以快速上手并理解框架结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GameFramework源码学习(一)


一、GameFramework是什么?

       GameFramework 是一个基于 Unity 引擎的游戏框架,主要对游戏开发过程中常用模块进行了封装,很大程度地规范开发过程、加快开发速度并保证产品质量。里面封装了界面,流程,网络服务,声音,有限状态机等等模块,是一个非常值得学习的开发框架.

       本篇文章主要来介绍GameFramework框架中的入口与UI界面模块.

二、框架学习

1.框架入口

在打开该框架之后,我们能看到的是非常多的文件夹,对于该框架的入口是在Base文件夹下的GameFrameworkEntry类中,如图

 在该类中,首先我们能见到的是一个该框架自定义的链表GameFrameworkLinkedList<GameFrameworkModule> s_GameFrameworkModules

具体规范了该链表存储的是抽象模块类,也就是说存储是各个模块的管理类,下文将用UI模块进一步说明.

在该类的第二部分则是五个静态方法(版本不同,可能方法数量也不同),第一个是Update轮询方法,了解过Unity的读者对该方法都不会陌生,在Unity中该方法是在继承Mono后能够每一帧执行一次的轮询方法,而在该类中是使用一个foreach遍历上述的链表中的每一个模块的Update方法,从而驱动每个模块.

 第二个方法是Shutdown方法,是一个能够调用每个模块的结束方法的一个接口,采用for循环遍历每个模块执行对应的Shutdown方法,接着清空掉模块链表与引用池(此处指ReferencePool),释放缓存并设置空对象

 第三个与第四个便是获取到链表中的对应模块的方法,其中泛型方法是一个public方法另外一个是private方法,两个方法之间有着调用与被调用关系,具体则是,泛型方法在检查参数的正确与能够获取到对应的模块之后调用私有方法来使用foreach获取对应的模块并返回,值得注意的是在私有方法中如果不存在对应的模块将调用接下来将要介绍的第五个方法,创建模块方法.

在泛型方法中获取对应的模块类采用了Type类,使用typeof方法来获取对应的Type类,参数则是泛型方法中传递来的模块类

 第五个方法,也是该入口类的私有方法,是用来创建对应的模块,也是上一方法中在最后没有找到对应模块后的下一执行调用.

创建时采用Activator.CreateInstance反射的方式来创建,参数则是该私有类中传递来的Type类,之后使用强制转型的方式生成对应的模块类,并做了是否为空的判断.

之后则是如何将新获取到的模块链接进入模块链表,采用的方法是使用while循环获取该链表的每一节点并判断该节点的优先级是否小于新模块的优先级,是则装入在该节点的前一节点,最后返回获取到的新模块.

2.UI模块初步了解

在首先接触Unity后,我们所做的第一个案例大多都是简单的UI互动游戏,所以我们首先将要介绍的则是GameFramework中的UI模块,笔者对于Unity所内置的Ugui源码也有一些自己的了解与学习,在下一篇文章中将着重介绍与对比GameFramework与Ugui的源码与功能,在此篇则简单的说明该框架的UI模块中类之间的关系,以提供读者自学该框架的思路.

由于该框架是采用模块化编程的思路,那必然存在着与外界其他模块相通信与调用的管理类,在UI模块以及其他模块中皆是对应Manager类来管理,也就是说UI模块最重要的是UIManager这一个类.

在该类中我们首先能看到的是众多字段里面包含了后续该类中方法将要调用的其他模块类的接口,还有着以HashSet与Dictionary来存储管理UI组以及哪些UI是被加载的,最后五条字段则是规定了对应EventArgs的事件,用于界面调用关闭以及成功与失败的触发.

该类接下来的内容是对该众多字段的属性封装

在属性封装之后则是对UI组的各种管理(打开,关闭,添加与删除)

我们以打开界面的方法为例,

第一次接触到该类时我们可能会被该类中众多的方法给冲晕了头,不过这这些方法中大多数是有着重载的关系的,如图所示

可以看到上述众多方法都在调用其他一个方法,也就是参数最多的UI打开方法,那么多的方法只是为用户进行默认参数的封装,起到方便用户的调用的作用,那么我们将学习的重点就可以放到参数最多的那么方法上面了,如图

对于该模块我们另外一个重点学习的地方则是接口的灵活使用与方法的封装,在UI文件夹中我们可以看到十几个类,他们中近一半是接口,其中IUIForm是对具体UI的方法接口,IUIGroup是UI组的方法接口,我们看到IUIFormHelper这个方法是没有具体实现的,对于这个接口,它是用于连接Unity端的一个接口,是在该框架的Unity方面中具体实现

因此对于学习该模块时我们可以采用先去了解各个类的接口中的方法(GameFramework对每一个方法都做出了中文的注释),之后利用VS或者其他工具来跳转该接口的具体实现是在哪里,之后重点学习模块的管理类,对每个方法的调用关系进行梳理,最后该模块是怎样与Unity端进行联系的.

对于UI模块的剩余部分留在下一篇章进行说明.

UnityGameFramework案例源码,包括: 主要对游戏开发过程中常用模块进行了封装,很大程度地规范开发过程、加快开发速度并保证产品质量,是个重度化的Unity游戏框架。 在最新的 Game Framework 版本中,包含以下 17 个内置模块,后续还将开发更多的扩展模块供开发者使用。 数据结点 (Data Node) – 将任意类型的数据以树状结构的形式进行保存,用于管理游戏运行时的各种数据。 数据表 (Data Table) – 可以将游戏数据以表格(如 Microsoft Excel)的形式进行配置后,使用此模块使用这些数据表。数据表的格式是可以自定义的。 调试器 (Debugger) – 当游戏在 Unity 编辑器中运行或者以 Development 方式发布运行时,将出现调试器窗口,便于查看运行时日志、调试信息等。用户还可以方便地将自己的功能注册到调试器窗口上并使用。 下载 (Download) – 提供下载文件的功能,支持断点续传,并可指定允许几个下载器进行同时下载。更新资源时会主动调用此模块。 实体 (Entity) – 我们将游戏场景中,动态创建的切物体定义为实体。此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另个实体)等。实体使用结束后可以不立刻销毁,从而等待下次重新使用。 事件 (Event) – 游戏逻辑监听、抛出事件的机制。Game Framework 中的很多模块在完成操作后都会抛出内置事件,监听这些事件将大大解除游戏逻辑之间的耦合。用户也可以定义自己的游戏逻辑事件。 有限状态机 (FSM) – 提供创建、使用和销毁有限状态机的功能,些适用于有限状态机机制的游戏逻辑,使用此模块将是个不错的选择。 本地化 (Localization) – 提供本地化功能,也就是我们平时所说的多语言。Game Framework 在本地化方面,不但支持文本的本地化,还支持任意资源的本地化,比如游戏中释放烟花特效也可以做出几个多国语言的版本,使得中文版里是“新年好”字样的特效,而英文版里是“Happy New Year”字样的特效。 网络 (Network) – 提供使用 Socket 长连接的功能,当前我们支持 TCP 协议,同时兼容 IPv4 和 IPv6 两个版本。用户可以同时建立多个连接与多个服务器同时进行通信,比如除了连接常规的游戏服务器,还可以连接语音聊天服务器。如果想接入 ProtoBuf 之类的协议库,只要派生自 Packet 类并实现自己的消息包类即可使用。 对象池 (Object Pool) – 提供对象缓存池的功能,避免频繁地创建和销毁各种游戏对象,提高游戏性能。除了 Game Framework 自身使用了对象池,用户还可以很方便地创建和管理自己的对象池。 流程 (Procedure) – 是贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是个非常好的习惯。对于网络游戏,你可能需要如检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用。 资源 (Resource) – 为了保证玩家的体验,我们不推荐再使用同步的方式加载资源,由于 Game Framework 自身使用了套完整的异步加载资源体系,因此只提供了异步加载资源的接口。不论简单的数据表、本地化字典,还是复杂的实体、场景、界面,我们都将使用异步加载。同时,Game Framework 提供了默认的内存管理策略(当然,你也可以定义自己的内存管理策略)。多数情况下,在使用 GameObject 的过程中,你甚至可以不需要自行进行 Instantiate 或者是 Destroy 操作。 场景 (Scene) – 提供场景管理的功能,可以同时加载多个场景,也可以随时卸载任何个场景,从而很容易地实现场景的分部加载。 配置 (Setting) – 以键值对的形式存储玩家数据,对 UnityEngine.PlayerPrefs 进行封装。 声音 (Sound) – 提供管理声音和声音组的功能,用户可以自定义个声音的音量、是2D声音还是3D声音,甚至是直接绑定到某个实体上跟随实体移动。 界面 (UI) – 提供管理界面和界面组的功能,如显示隐藏界面、激活界面、改变界面层级等。不论是 Unity 内置的 uGUI 还是其它类型的 UI 插件(如 NGUI),只要派生自 UIFormLogic 类并实现自己的界面类即可使用。界面使用结束后可以不立刻销毁,从而等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值