2024-10-04
框架
00

目录

前言
Procedure:
ProcedureLaunch
ProcedureSplash
ProcedureInitResources
ProcedureCheckVersion
Game

前言

这一篇是流程的第二个部分,主要内容是通过拆解官方Demo-StarForce中的所有流程脚本来绘制流程图串联,并对每个流程的内容和作用进行解释。

Procedure:

Procedure.drawio

ProcedureLaunch

游戏启动流程,进行初始的构建和配置

csharp
/// <summary> /// 启动流程,配置游戏基础信息 /// </summary> public class ProcedureLaunch : ProcedureBase { protected override void OnEnter(ProcedureOwner procedureOwner) { // 设置英文环境,否则有些国家地区读表错误 System.Globalization.CultureInfo.DefaultThreadCurrentCulture = new System.Globalization.CultureInfo("en-US"); AwaitableExtensions.SubscribeEvent(); EntityExtension.SubscribeEvent(); Debug.Log("------------注册完成---->>>>启动流程"); base.OnEnter(procedureOwner); // 构建信息:发布版本时,把一些数据以 Json 的格式写入 Assets/GameMain/Configs/BuildInfo.txt,供游戏逻辑读取 GameEntry.BuiltinData.InitBuildInfo(); // 语言配置:设置当前使用的语言,如果不设置,则默认使用操作系统语言 InitLanguageSettings(); // 变体配置:根据使用的语言,通知底层加载对应的资源变体 InitCurrentVariant(); // 声音配置:根据用户配置数据,设置即将使用的声音选项 InitSoundSettings(); // 默认字典:加载默认字典文件 Assets/GameMain/Configs/DefaultDictionary.xml // 此字典文件记录了资源更新前使用的各种语言的字符串,会随 App 一起发布,故不可更新 GameEntry.BuiltinData.InitDefaultDictionary(); }

ProcedureSplash

闪屏流程,在开始时会先进行三种判断,根据当前模式的不同进行对应的资源初始化操作,并切换到所对应的流程:

csharp
/// <summary> /// 编辑器模式下,直接进入预加载流程;否则,检测一下版本是否需要热更新 /// </summary> public class ProcedureSplash : ProcedureBase { protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds) { base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds); // TODO: 这里可以播放一个 Splash 动画 // ... if (GameEntry.Base.EditorResourceMode) { // 编辑器模式 Log.Info("Editor resource mode detected."); ChangeState<ProcedurePreload>(procedureOwner); } else if (GameEntry.Resource.ResourceMode == ResourceMode.Package) { // 单机模式 Log.Info("Package resource mode detected."); ChangeState<ProcedureInitResources>(procedureOwner); } else { // 可更新模式 Log.Info("Updatable resource mode detected."); ChangeState<ProcedureCheckVersion>(procedureOwner); } } }

ProcedureInitResources

资源初始化流程,该流程逻辑较为简单,在刚进入时调用资源组件中的InitResources​函数,该函数的内部调用了ResourceManager​加载所有的资源进行解析并初始化,完成后提供一个回调函数(见第二段代码),OnUpdate​在不断的检查是否初始化完毕,完成后进入下一个流程ProcedurePreload

  • csharp
    public class ProcedureInitResources : ProcedureBase { protected override void OnEnter(ProcedureOwner procedureOwner) { base.OnEnter(procedureOwner); m_InitResourcesComplete = false; GameEntry.Resource.InitResources(OnInitResourcesComplete); } protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds) { base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds); if (!m_InitResourcesComplete) { // 初始化资源未完成则继续等待 return; } ChangeState<ProcedurePreload>(procedureOwner); } private void OnInitResourcesComplete() { m_InitResourcesComplete = true; Log.Info("Init resources complete."); } }
  • csharp
    public void InitResources(InitResourcesCompleteCallback initResourcesCompleteCallback) { m_ResourceManager.InitResources(initResourcesCompleteCallback); }

ProcedurePreload

资源预加载流程,市面上的游戏基本上都有这样的一个逻辑,在游戏开始时一般有Loading页面来加载游戏进度,其中就包含资源预加载的流程,该流程主要是做的是PreloadResources​函数里的内容

csharp
private void PreloadResources() { //加载基础配置Config LoadConfig("DefaultConfig"); //加载所有配置表DataTable foreach (string dataTableName in DataTableNames) { LoadDataTable(dataTableName); } //加载资源字典 Key对应的Asset LoadDictionary("Default"); //加载字体 LoadFont("MainFont"); //TODO: //加载别的 }

ProcedureCheckVersion

版本检查流程,流程刚进入时注册两个了事件,Web请求成功和失败事件,注册后向服务器请求版本信息,传入两个参数,第一个本地版本的构建信息,第二个获取当前的平台(Windows​,MacOS​,IOS​,Android​)

csharp
protected override void OnEnter(ProcedureOwner procedureOwner) { base.OnEnter(procedureOwner); m_CheckVersionComplete = false; m_NeedUpdateVersion = false; m_VersionInfo = null; GameEntry.Event.Subscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess); GameEntry.Event.Subscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure); // 向服务器请求版本信息 GameEntry.WebRequest.AddWebRequest(Utility.Text.Format(GameEntry.BuiltinData.BuildInfo.CheckVersionUrl, GetPlatformPath()), this); }
  • OnWebRequestSuccess​ 请求成功

    1. 服务器响应,请求成功,将服务器返回的版本数据进行解析转换为字符串,如何字符串为空则判定为解析失败,逻辑直接返回,认定为版本需要更新;
    2. 字符串不为空,包含版本构建的信息,输出版本数据,然后判断应用是否需要强制更新,检查版本数据是否一致,检查完毕,根据NeedUpdateVersion​这个字段来判断是否需要版更新,如果需要,进入ProcedureUpdateVersion​流程,不需要则进入ProcedureVerifyResources​流程
    3. 在判断中如存在:文件读取失败,文件中版本号字段解析失败,版本号与服务器最新版本号不相等,都认为是需要更新版本,进入ProcedureUpdateVersion​流程。
  • OnWebRequestFailure​请求失败

    1. 直接返回,输出版本错误信息

剩余三个流程,分别是ProcedureUpdateVersion​,ProcedureVerifyResources​,ProcedureCheckResources​,可以参考阅读花桑的博客,他对这三个流程有更为详尽的解释

Game

Game流程其实就是真正进入游戏开始后的逻辑了,我在流程图中提供了部分可能会存在的自定义流程,其实这里完全就是由框架的使用者自行决定添加来进行补充。

本文作者:xuxuxuJS

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!