GameFramework03_2_Procedure流程剖析
in 技术 with 1 comment
GameFramework03_2_Procedure流程剖析
in 技术 with 1 comment

20240331192541

前言

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

Procedure:

Procedure.drawio

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

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);
        }

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

Game

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

Responses
  1. 博主太厉害了!

    Reply