GameFramework框架详解之(二)框架启动

一.游戏启动

先打开Assets根目录下的StarForce Launcher场景
场景节点目录如下:
在这里插入图片描述

二.GameEntry

在根节点Game Framework上有个组件:GameEntry,是游戏的启动入口,GameEntry使用关键字partial被拆分成了3个文件,分别是:

GameEntry
GameEntry-Buildin
GameEntry-Cunstom

GameEntry类,是项目主入口

InitBuiltinComponents();
InitCustomComponents();

GameEntry-Buildin类,用于启动UGF框架的所有自带模块

private static void InitBuiltinComponents()
{
      Base = UnityGameFramework.Runtime.GameEntry.GetComponent<BaseComponent>();
      Config = UnityGameFramework.Runtime.GameEntry.GetComponent<ConfigComponent>();
      DataNode = UnityGameFramework.Runtime.GameEntry.GetComponent<DataNodeComponent>();
      DataTable = UnityGameFramework.Runtime.GameEntry.GetComponent<DataTableComponent>();
      Debugger = UnityGameFramework.Runtime.GameEntry.GetComponent<DebuggerComponent>();
      Download = UnityGameFramework.Runtime.GameEntry.GetComponent<DownloadComponent>();
      Entity = UnityGameFramework.Runtime.GameEntry.GetComponent<EntityComponent>();
      Event = UnityGameFramework.Runtime.GameEntry.GetComponent<EventComponent>();
      FileSystem = UnityGameFramework.Runtime.GameEntry.GetComponent<FileSystemComponent>();
      Fsm = UnityGameFramework.Runtime.GameEntry.GetComponent<FsmComponent>();
      Localization = UnityGameFramework.Runtime.GameEntry.GetComponent<LocalizationComponent>();
      Network = UnityGameFramework.Runtime.GameEntry.GetComponent<NetworkComponent>();
      ObjectPool = UnityGameFramework.Runtime.GameEntry.GetComponent<ObjectPoolComponent>();
      Procedure = UnityGameFramework.Runtime.GameEntry.GetComponent<ProcedureComponent>();
      Resource = UnityGameFramework.Runtime.GameEntry.GetComponent<ResourceComponent>();
      Scene = UnityGameFramework.Runtime.GameEntry.GetComponent<SceneComponent>();
      Setting = UnityGameFramework.Runtime.GameEntry.GetComponent<SettingComponent>();
      Sound = UnityGameFramework.Runtime.GameEntry.GetComponent<SoundComponent>();
      UI = UnityGameFramework.Runtime.GameEntry.GetComponent<UIComponent>();
      WebRequest = UnityGameFramework.Runtime.GameEntry.GetComponent<WebRequestComponent>();
}

GameEntry-Cunstom类,用于启动自定义项目的自定义模块

private static void InitCustomComponents()
{
	BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>();
	HPBar = UnityGameFramework.Runtime.GameEntry.GetComponent<HPBarComponent>();
}

除了可以看到的GameEntry组件类

其实在UGF框架中GameEntry作为静态类,还有几个静态方法。主要是作为框架的门面,方便我们注册和获取框架中的各个模块。

public static class GameEntry
{
	RegisterComponent(){}
	GetComponent(){}
	Shutdown(){}
}

三.Components模块初始化

接下来就是所有的Component组件的初始化了
在这里插入图片描述

子节点上面的所有的Component都是继承自MonoBehavior,方便我们在面板上看他们的属性信息。
比如像这样:
在这里插入图片描述

每一个Component组件,都是UGF框架中对应的各个模块对GF中的各个模块Manager的封装,很多方法都是直接调用xxxManager.xxx,而xxxManager中真正去处理数据的方法都定义在UGF的各个Provider和Helper中。

所以每一个Component组件的初始化工作,都是Awake中获取GF中的xxxManager管理器,绑定回调函数,然后,Start中设置xxxProvider和xxxHelper等。

此时每一个模块(除了ProcedureComponent)其实都只是一种Ready状态,并没有真正Loading或者Loaded。所有的Load都要等到Procedure启动后。

四.ProcedureComponent启动

Procedure在框架中可以被理解为是流程场景,我们可以把游戏的运行和场景切换,划分为若干个流程来理解。
在这里插入图片描述

Procedure模块使用的有限状态机模型来实现,各个状态可以理解为是一种场景状态,作者之所以这么设计,就是想让游戏流程可控性更强,更容易理解,也是大项目框架必备的模块。

下面是Procedure状态机的启动顺序流程,这里详细列举了各个Procedure的功能和切换条件,咱们先来看一下。

Procedure名称描述切换条件
ProcedureLaunch构建版本信息,多语言配置,变体配置,声音配置,加载默认字典文件运行一帧即切换到 ProcedureSplash 展示流程
ProcedureSplash播放Splash动画,选择资源模式(编辑器模式,单机模式,可更新模式)1.编辑器模式->ProcedurePreload ;2.单机模式->ProcedureInitResources ; 3.可更新模式->ProcedureCheckVersion
ProcedurePreload预加载资源(DataTable,Dictionary,Font)预加载完成->ChangeScene:Menu
ProcedureInitResources初始化AssetBundle资源初始化完毕->ProcedurePreload
ProcedureCheckVersion向服务器请求版本信息,解析版本信息,设置资源更新下载地址1.需要更新->ProcedureUpdateVersion;2.不需要更新->ProcedureCheckResources
ProcedureUpdateVersion更新资源列表更新完成->ProcedureCheckResources
ProcedureCheckResources检查资源更新1.有更新->ProcedureUpdateResources;2.无更新->ProcedurePreload
ProcedureUpdateResources开始更新资源更新完成->ProcedurePreload
ProcedureChangeScene卸载旧场景(停止声音,隐藏实体),加载新场景1.进入Menu->ProcedureMenu;2.进入Main:ProcedureMain
ProcedureMenu展示MenuForm点击开始游戏->ProcedureMenu
ProcedureMain加载Game配置,加载SurvivalGame点击退出游戏->ProcedureMain

大家注意看,我们的资源真正加载时在不同的procedure流程中的。比如多语言,声音等的加载在ProcedureLaunch中。然后AssetBundle的加载,是在ProcedureSplash启动完游戏之后,而配置表和预制体的加载,是在ProcedurePreload流程中,这个ProcedurePreload流程其实就是一个(Loading场景+预加载+卸载旧资源)的一个过程。对于资源的控制非常的重要,是一个承上启下的流程。

总体来说,框架的各个模块,是在不同的Procedure流程中进行启动,加载和使用的。所以要想理解我们的框架,必须要从Procedure先入手。

大家在多个Procedure之间跳转一下,体会一下状态机的魅力。
本章就到这里,希望这篇文章能够对你有所帮助。

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值