Unity GameFramework Star Force 拆解(一)—— 启动流程
文章目录
- 启动流程:
- ProcedureLaunch:
- ProcedureSplash:
- ProcedureInitResources:
- ProcedurePreload:
- ProcedureChangeScene:
- ProcedureMenu:
- ProcedureMain:
首先,我是个菜鸡,其次,这是我第一次了解GameFramework,这也是我打算写这篇文章的目的,我希望从头到尾了解一遍GameFramework,通过这个小Demo来进一步了解框架和制作流程,这样我就可以做个大Demo了()
万事开头难,先从整体框架来看,这是最简单的,因为每个教你这个框架的人开头都会说,并且都是一样的
这个框架虽然几年没更新,但实际本身已经非常完善,虽然我还没学,不过听说做的很漂亮规范,对于初学者而言,也是一个非常值得学习的开源框架。
启动流程:
GameFrameworkComponent 在 Awake 中向静态类 GameEntry 注册自己(所有组件都放在场景中的预制体里了)
StarForce.GameEntry 在 Start 中将所有已注册的组件缓存到自己身上的静态字段中(方便本项目内的类使用)
GameEntry被分成了三份,Builtin负责缓存框架组件到自身,Custom负责缓存自定义组件到自身,而这两个初始化操作在什么后缀都没有的GameEntry的那份使用Monobehavior的Start函数进行调用
接下来是Procedure的逐步初始化。GameFramework将游戏的整个流程拆解成有限状态机,使得流程明确,逻辑得以分散,即方便阅读,也方便理解。
GameFramework会自动在视图更新所有继承自ProcedureBase的类,因此我们自己继承一个后也会被显示上去。设定哪个流程是开始流程的选项,只需要选择对应的类即可,就像枚举一样。
首先是在场景中的Procedure中就配置的ProcedureLaunch,一切从该状态开始
ProcedureLaunch:
第一步先初始化BuildinData,虽然叫Buildin,不过这个是一个Custom组件,放在了场景中GameFramework的Custom下。这个数据应该是用来进行资源热更新用的,其内部记录了版本号,检查版本和各个平台的资源获取路径。初始化就是将在场景中拖动到该组件上的版本文本资源给解释成C#类,不然代码没法读取其数据
第二步是进行语言的配置,首先从GameEntry.Localization中拿出language,然后将其赋值为GameEntry.Setting中存储的Language(当然是在有的前提下),之后对语言进行,检查,是不支持的语言就默认改成英语,这个操作同样要再同步回GameEntry.Setting
第三步是加载资源包变体,GameFramework不仅允许字体的本地化,同时还支援了资源包的本地化,即不同的语言对应了不同的资源包,更加的自由哇!!!这里是调用GameEntry.Resource的SetCurrentVariant来加载对应变体。
第四步比较简单,是初始化设置音量,直接挨个读取GameEntry.Setting的值,然后设置进GameEntry.Sound就行
ProcedureSplash:
这个状态看了下,说是可以放个闪屏动画,不过通过流程可以看出来,这个是用于分支的状态,在这之后,程序会按照设置走向编辑器,单机,可更新三种状态的其中一个。除了分流外什么也没干
编辑器模式直接走向ProcedurePreload,可更新和单机走向ProcedureCheckVersion和ProcedureInitResources两个不同状态,其中可更新会走向一个很长的更新流程(就是一般资源热更新该做的所有事情),而单机会在下一个状态走向ProcedurePreload,因此现在先忽略可更新,看一下ProcedureInitResources和ProcedurePreload
ProcedureInitResources:
调了俩接口,从UnityGameFrameworkComponent调到GameFrameworkComponent层去了,没下GameFramework,暂时看不到引用(),总之就是UGF层的Resource组件调了个InitResource。
ProcedurePreload:
预加载加载了四大东西:Config,DataTable,Dictionary,Font
看了下都是拼了个路径再调用对应的模块去读取这些配置文件,将其作为C#对象存在了模块中,方便后续读取
预加载结束后,设定下一个场景ID为Menu场景,接着转到下一个场景
ProcedureChangeScene:
在这一层对场景进行异步加载,如果是加载到菜单场景的,就会跳入ProcedureMenu,否则会进入ProcedureMain(扩展自己的项目的时候可以将场景ID写入全局配置使用,再在该流程进行一个切换)
ProcedureMenu:
这一层打开了MenuUI,并且向UI提供了StartGame的函数接口,用于调用,其会将开始游戏的flag设置为true,流程会立刻向后推进,加载Main地图,然后就会进入ProcedureChangeScene,接着在地图加载完后进入ProcedureMain
ProcedureMenu和MenuForm息息相关,ProcedureMenu进入会打开MenuForm,并将自己注入UI中,UI异步打开完成后会缓存ProcedureMenu的引用
同时ProcedureMenu状态离开时也会主动关闭MenuForm
ProcedureMain:
看了下,该进程主要逻辑是控制当前的游戏模式和何时切换回菜单
游戏模式的类是GameBase,其Initialize被ProcedureMain调用,包括了
- 显示玩家飞机到默认位置
- 获取背景图的缓存
SurvivalGame是唯一的游戏模式,继承自GameBase,在Update中新增了随机生成敌人的逻辑