学习StarForce项目
游戏启动流程
类型Module可包含本类型的多个Component
将所有流程全塞进一个状态机中?
这个也是继承状态机的步骤类
游戏启动流程图
理解框架的关键结点
Unity <—-> UnityGameFramework <—-> GameFramework
Unity Scene <—-> BaseComponent.cs <—-> GameFrameworkEntry.cs
Unity GameObject <—-> GameFrameworkConponent <—-> GameFrameworkModule
BaseComponent:UGF与Unity的交互组件,游戏内容代码通过这个与GF框架进行数据交流
一个框架Component对于一个框架Module
如ConfigComponent:
将IConfigManager.cs与ConfigManage.cs关联起来
BaseComponent.Update() -> GameFrameworkEntry.Update(xxx) : 所有游戏框架模块轮询,让所有模块模拟Unity的Update更新
游戏流程控制器ProcedureComponent
StarForce.ProcedureLaunch.cs <—-> StarForce.ProcedureBase.cs <—-> GameFramework.Procedure.ProcedureBase <—-> FsmState
解析框架组件
每个组件都是继承GameFrameworkComponent,会在Unity3D.Awake()里激活
ConfigComponent:游戏配置,如打包流程、初始语言等
DataNodeComponent:数据结点组件,将任意类型的数据以树状结构的形式进行保存,用于管理游戏运行时的各种数据
某些使用次数的少的数据,找个地方定义又很多余,使用DataNode用完就可以删了,还有一些情况可以防止定义数据类后耦合
用于存储(记录)运行时的数据,便于跨组件交流数据
DataTableComponent:数据表组件,可以将游戏数据以表格(如 Excel)的形式进行配置后,使用此模块使用这些数据表。数据表的格式是可以自定义的。
打包流程
打包配置文件
文件存放路径:Assets/GameMain/Configs/*.xml
BuildSetings.xml
<?xml version="1.0" encoding="UTF-8"?>
<UnityGameFramework>
<BuildSettings>
<DefaultScenes>
<!--初始场景的Asset路径-->
<DefaultScene Name="Assets/StarForce Launcher.unity" />
</DefaultScenes>
<SearchScenePaths>
<!--搜索Scene的开始目录,如果不需要插件里的scene,可以从工程目录开始,比如Asssets/GameMain-->
<SearchScenePath Path="Assets" />
</SearchScenePaths>
</BuildSettings>
</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 : 记录了版本文件的校验码,在做资源更新服务的时候会用到这些值。
打包流程总结
- 需要先将BuildSetting中的构建场景配置为启动场景。这个很关键,如果不配置那么会导致打包后的初始场景为空。
- 一些预加载资源需要自己在ProcedurePreload.cs中添加,比如公用字体、公用图集等等。框架并不提供SpriteAtlas的加载模式,需自行添加。
- 场景Scene如果是AB资源,是可以同AB加载进来。而在编辑器模式下通过SceneManager.LoadSceneAsync加载则必须添加进Build Settings->Scenes In Build
通过AB资源切换场景的堆栈列表
Package模式下的资源加载流程解析
TaskPool.ProcessRunningTasks()
使用中的QA
使用GameEntry.Event.Fire(object sender, GameEventArgs e)
时,GameEventArgs
在哪释放?
会在EventPool.cs中的HandleEvent(object sender, T e)
处理事件后就释放。
对象池问题,当实例化数量过多时,会一直等待剩余实例化操作?
是的,会一直等待,直到创建过程全部结束。