这一篇是流程的第二个部分,主要内容是通过拆解官方Demo-StarForce中的所有流程脚本来绘制流程图串联,并对每个流程的内容和作用进行解释。
游戏启动流程,进行初始的构建和配置
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();
}
闪屏流程,在开始时会先进行三种判断,根据当前模式的不同进行对应的资源初始化操作,并切换到所对应的流程:
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);
}
}
}
资源初始化流程,该流程逻辑较为简单,在刚进入时调用资源组件中的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);
}
资源预加载流程,市面上的游戏基本上都有这样的一个逻辑,在游戏开始时一般有Loading页面来加载游戏进度,其中就包含资源预加载的流程,该流程主要是做的是PreloadResources
函数里的内容
csharp private void PreloadResources()
{
//加载基础配置Config
LoadConfig("DefaultConfig");
//加载所有配置表DataTable
foreach (string dataTableName in DataTableNames)
{
LoadDataTable(dataTableName);
}
//加载资源字典 Key对应的Asset
LoadDictionary("Default");
//加载字体
LoadFont("MainFont");
//TODO:
//加载别的
}
版本检查流程,流程刚进入时注册两个了事件,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
请求成功
NeedUpdateVersion
这个字段来判断是否需要版更新,如果需要,进入ProcedureUpdateVersion
流程,不需要则进入ProcedureVerifyResources
流程ProcedureUpdateVersion
流程。OnWebRequestFailure
请求失败
剩余三个流程,分别是ProcedureUpdateVersion
,ProcedureVerifyResources
,ProcedureCheckResources
,可以参考阅读花桑的博客,他对这三个流程有更为详尽的解释
Game流程其实就是真正进入游戏开始后的逻辑了,我在流程图中提供了部分可能会存在的自定义流程,其实这里完全就是由框架的使用者自行决定添加来进行补充。
本文作者:xuxuxuJS
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!