前言
这一篇是流程的第二个部分,主要内容是通过拆解官方Demo-StarForce中的所有流程脚本来绘制流程图串联,并对每个流程的内容和作用进行解释。
Procedure:
ProcedureLaunch
游戏启动流程,进行初始的构建和配置
/// <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
闪屏流程,在开始时会先进行三种判断,根据当前模式的不同进行对应的资源初始化操作,并切换到所对应的流程:
/// <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
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."); } }
public void InitResources(InitResourcesCompleteCallback initResourcesCompleteCallback) { m_ResourceManager.InitResources(initResourcesCompleteCallback); }
ProcedurePreload
资源预加载流程,市面上的游戏基本上都有这样的一个逻辑,在游戏开始时一般有Loading页面来加载游戏进度,其中就包含资源预加载的流程,该流程主要是做的是PreloadResources
函数里的内容
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
)
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
请求成功- 服务器响应,请求成功,将服务器返回的版本数据进行解析转换为字符串,如何字符串为空则判定为解析失败,逻辑直接返回,认定为版本需要更新;
- 字符串不为空,包含版本构建的信息,输出版本数据,然后判断应用是否需要强制更新,检查版本数据是否一致,检查完毕,根据
NeedUpdateVersion
这个字段来判断是否需要版更新,如果需要,进入ProcedureUpdateVersion
流程,不需要则进入ProcedureVerifyResources
流程 - 在判断中如存在:文件读取失败,文件中版本号字段解析失败,版本号与服务器最新版本号不相等,都认为是需要更新版本,进入
ProcedureUpdateVersion
流程。
OnWebRequestFailure
请求失败- 直接返回,输出版本错误信息
剩余三个流程,分别是ProcedureUpdateVersion
,ProcedureVerifyResources
,ProcedureCheckResources
,可以参考阅读花桑的博客,他对这三个流程有更为详尽的解释
Game
Game流程其实就是真正进入游戏开始后的逻辑了,我在流程图中提供了部分可能会存在的自定义流程,其实这里完全就是由框架的使用者自行决定添加来进行补充。
本文由 xuxuxujs 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。
博主太厉害了!