GameFramework的(烟雨迷离半世殇)B站解析

学习StarForce项目

游戏启动流程

学习笔记 - 图1学习笔记 - 图2

类型Module可包含本类型的多个Component

学习笔记 - 图3

学习笔记 - 图4

将所有流程全塞进一个状态机中?

学习笔记 - 图5

这个也是继承状态机的步骤类

学习笔记 - 图6

游戏启动流程图

画板

理解框架的关键结点

Unity <—-> UnityGameFramework <—-> GameFramework

Unity Scene <—-> BaseComponent.cs <—-> GameFrameworkEntry.cs

Unity GameObject <—-> GameFrameworkConponent <—-> GameFrameworkModule

BaseComponent:UGF与Unity的交互组件,游戏内容代码通过这个与GF框架进行数据交流

学习笔记 - 图8

一个框架Component对于一个框架Module

如ConfigComponent:

学习笔记 - 图9

学习笔记 - 图10

将IConfigManager.cs与ConfigManage.cs关联起来

学习笔记 - 图11

BaseComponent.Update() -> GameFrameworkEntry.Update(xxx) : 所有游戏框架模块轮询,让所有模块模拟Unity的Update更新

游戏流程控制器ProcedureComponent

StarForce.ProcedureLaunch.cs <—-> StarForce.ProcedureBase.cs <—-> GameFramework.Procedure.ProcedureBase <—-> FsmState

解析框架组件

每个组件都是继承GameFrameworkComponent,会在Unity3D.Awake()里激活

ConfigComponent:游戏配置,如打包流程、初始语言等

画板

DataNodeComponent:数据结点组件,将任意类型的数据以树状结构的形式进行保存,用于管理游戏运行时的各种数据

某些使用次数的少的数据,找个地方定义又很多余,使用DataNode用完就可以删了,还有一些情况可以防止定义数据类后耦合

用于存储(记录)运行时的数据,便于跨组件交流数据

学习笔记 - 图13

DataTableComponent:数据表组件,可以将游戏数据以表格(如 Excel)的形式进行配置后,使用此模块使用这些数据表。数据表的格式是可以自定义的。

学习笔记 - 图14

打包流程

打包配置文件

文件存放路径:Assets/GameMain/Configs/*.xml

BuildSetings.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <UnityGameFramework>
  3. <BuildSettings>
  4. <DefaultScenes>
  5. <!--初始场景的Asset路径-->
  6. <DefaultScene Name="Assets/StarForce Launcher.unity" />
  7. </DefaultScenes>
  8. <SearchScenePaths>
  9. <!--搜索Scene的开始目录,如果不需要插件里的scene,可以从工程目录开始,比如Asssets/GameMain-->
  10. <SearchScenePath Path="Assets" />
  11. </SearchScenePaths>
  12. </BuildSettings>
  13. </UnityGameFramework>

ResourceEditor.xml:Game Framwork->Resources Tools->Resource Editor

<?xml version="1.0" encoding="UTF-8"?>
<UnityGameFramework>
    <ResourceEditor>
        <Settings>
            <!--SourceAssetRootPath 配置资源搜索的根目录,默认是从 Assets 开始进行全部查找,
            由于经常在 Assets 下放一些 Unity 插件,故也可以以某一级子目录(如 Asset/GameMain)作为根目录进行资源查找-->
            <SourceAssetRootPath>Assets</SourceAssetRootPath>
            <!--SourceAssetSearchPaths 配置资源搜索的子目录(相对于根目录的路径),每个子目录填写一行 SourceAssetSearchPath,若不填则搜索所有子目录。-->
            <SourceAssetSearchPaths>
                <SourceAssetSearchPath RelativePath="GameMain" />
            </SourceAssetSearchPaths>
            <!--SourceAssetUnionTypeFilter 要筛选并包含的资源类型-->
            <SourceAssetUnionTypeFilter>t:Scene t:Prefab t:Shader t:Model t:Material t:Texture t:AudioClip t:AnimationClip t:AnimatorController t:Font t:TextAsset t:ScriptableObject</SourceAssetUnionTypeFilter>
            <!--SourceAssetUnionLabelFilter 要筛选并包含的标签类型-->
            <SourceAssetUnionLabelFilter>l:ResourceInclusive</SourceAssetUnionLabelFilter>
            <!--SourceAssetExceptTypeFilter 要筛选并排除的资源类型-->
            <SourceAssetExceptTypeFilter>t:Script</SourceAssetExceptTypeFilter>
            <!--SourceAssetExceptLabelFilter 要筛选并排除的标签类型-->
            <SourceAssetExceptLabelFilter>l:ResourceExclusive</SourceAssetExceptLabelFilter>
            <!--AssetSorter 编辑器内资源列表排序顺序,可以是 Name(资源文件名)、Path(资源全路径)或者 Guid(资源GUID)。-->
            <AssetSorter>Path</AssetSorter>
        </Settings>
    </ResourceEditor>
</UnityGameFramework>

ResourceCollection.xml : ResourceEditor中保存的信息

<?xml version="1.0" encoding="UTF-8"?>
<UnityGameFramework>
  <ResourceCollection>
    <Resources>
    </Resources>
    <Assets>
    </Assets>
  </ResourceCollection>
</UnityGameFramework>

ResourceBuilder.xml:Game Framwork->Resources Tools->Resource Builder

<?xml version="1.0" encoding="UTF-8"?>
<UnityGameFramework>
  <ResourceBuilder>
    <Settings>
      <!--资源版本号-->
      <InternalResourceVersion>1</InternalResourceVersion>
      <!--打包平台-->
      <Platforms>32</Platforms>
      <!--资源压缩模式-->
      <AssetBundleCompression>0</AssetBundleCompression>
      <!--使用的压缩脚本-->
      <CompressionHelperTypeName>UnityGameFramework.Runtime.DefaultCompressionHelper</CompressionHelperTypeName>
      <!---->
      <AdditionalCompressionSelected>True</AdditionalCompressionSelected>
      <!--是否需要重构全部资源-->
      <ForceRebuildAssetBundleSelected>True</ForceRebuildAssetBundleSelected>
      <!--用于指定追加构建资源包前后的行为,在实现 IBuildEvent 接口之后,即可在此处选择。例如可以在构建资源包后自动将资源拷贝到指定目录。-->
      <BuildEventHandlerTypeName>StarForce.Editor.StarForceBuildEventHandler</BuildEventHandlerTypeName>
      <!--打包资源导出文件夹路径-->
      <OutputDirectory>F:/TestProjects/GameFrameworkStudy/ExportAB</OutputDirectory>
      <!--为单机模式生成的文件的所在目录,若游戏是单机游戏,生成结束后将此目录中对应平台的文件拷贝至 StreamingAssets 后构建 App 即可-->
      <OutputPackageSelected>True</OutputPackageSelected>
      <!--为可更新模式生成的完整文件包的所在目录,若游戏是网络游戏,生成结束后应将此目录上传至资源服务器,供玩家下载用。-->
      <OutputFullSelected>True</OutputFullSelected>
      <!--为可更新模式生成的文件的所在目录,若游戏是网络游戏,生成结束后将此目录中对应平台的文件拷贝至 StreamingAssets 后构建 App 即可。
            一个 AssetBundle 是否会生成到 Output Packed Path,取决与这个 AssetBundle 是否在 AssetBundle 编辑工具中被标记为 Packed。-->
      <OutputPackedSelected>True</OutputPackedSelected>
    </Settings>
  </ResourceBuilder>
</UnityGameFramework>
  • Working Path : 目录建议原封不动的保留,下次构建 AssetBundle 时,Unity 会自动识别其中的数据,并实施增量生成 AssetBundle,以加快生成速度。
  • Build Report Path : 目录中记录了生成日志,若生成过程中出现错误,也可以查询此目录中的日志。
  • GameResourceVersion_x_x_x.xml : 记录了版本文件的校验码,在做资源更新服务的时候会用到这些值。
只要把 Package(单机模式)或 Packed(可更新模式)中对应版本(如 0_1_0_1)、对应平台的内容(如 windows),完整拷贝至 Unity 工程的 Assets/StreamingAssets 中,即可构建 App 用于发布游戏了。

打包流程总结

  1. 需要先将BuildSetting中的构建场景配置为启动场景。这个很关键,如果不配置那么会导致打包后的初始场景为空。
  2. 一些预加载资源需要自己在ProcedurePreload.cs中添加,比如公用字体、公用图集等等。框架并不提供SpriteAtlas的加载模式,需自行添加。
  3. 场景Scene如果是AB资源,是可以同AB加载进来。而在编辑器模式下通过SceneManager.LoadSceneAsync加载则必须添加进Build Settings->Scenes In Build

通过AB资源切换场景的堆栈列表

学习笔记 - 图15

学习笔记 - 图16

Package模式下的资源加载流程解析

TaskPool.ProcessRunningTasks()

使用中的QA

使用GameEntry.Event.Fire(object sender, GameEventArgs e)时,GameEventArgs在哪释放?

会在EventPool.cs中的HandleEvent(object sender, T e)处理事件后就释放。

学习笔记 - 图17

对象池问题,当实例化数量过多时,会一直等待剩余实例化操作?

是的,会一直等待,直到创建过程全部结束。