GameFramework源码学习

Posted terruig

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GameFramework源码学习相关的知识,希望对你有一定的参考价值。

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模块的剩余部分留在下一篇章进行说明.

GameFramework教程✨(二十五)声音

哈喽艾薇巴蒂,你的橙哥突然出现~

本系列博客地址:传送门


GF的声音是以 Audio Mixer 为基础的,橙哥去整理了Audio Mixer的教程,

还未学习的同学可以先去了解一下该功能的方法:传送门



一、Audio Mixer的拓展知识

我们在《Audio Mixer教程》中看到,滑动条控制声音改变,是控制的三个不同的 Audio Mixer。
下面我们来看看这种做法是否还有提升空间。

1、不同AudioMixer控制不同声音组的局限

《Audio Mixer教程》将对话组、音乐组用两个 Audio Mixer 控制,再加一个 MasterMixer,控制这两个 声音组。

而代码只能一个Audio Mixer一个Audio Mixer的控制,而不能通过一个Audio Mixer控制另一个Audio Mixer,配置配置多个就比较繁琐。

这样的配置还是有些繁琐,它还是可以简化的。

我们希望简化到控制一个 Audio Mixer 

以上是关于GameFramework源码学习的主要内容,如果未能解决你的问题,请参考以下文章

GameFramework框架 StarForceDemo导入GF源码

GameFramework框架 StarForceDemo导入GF源码

Unity-GameFramework导表工具使用

Unity GameFramework✨(二十七)AB包打包问题集合

Unity GameFramework✨(三十三)福利:教你从程序外部加载Excel文件

Unity3d+Gameframework:entity实体代码分析,基于StarForce