让世界在构建时成型: 自动化场景组装与资源裁剪管线
引言
自动化构建管线 允许在项目构建过程中执行一些自定义操作。创作者可以借此自动化处理构建过程中的重复性任务,例如程序化资源生成、资源清理、或是场景编辑等。这有助于在开发、调试和迭代过程中节省时间和精力。
在 虚拟形象 制作过程中,模块化虚拟形象 (Modular Avatars) 就是一个很好的例子。它可以在构建过程中自动生成并合并骨骼、动画器、表情菜单、参数列表等资源。另一个例子是 Anatawa12 的 Avatar Optimizer,它可以在构建过程中自动删除不需要的网格,并生成优化后的纹理资源等。
在 世界 制作过程中,自动化构建管线同样很实用。例如,可以在构建过程中根据预设配置自动编辑场景、生成资源、清理资源等。
本文档介绍以下组件,这些组件可以帮助创作者在构建过程中自动化处理一些常见的任务:
RemoveOnBuild: 在构建过程中根据目标平台自动删除组件。InactivateOnBuild: 在构建过程中根据目标平台自动禁用组件。LTCGIBuildTargetConfig: 在构建过程中根据目标平台自动管理 LTCGI 组件。ClearFontAtlasOnBuild: 在构建过程中自动清理字体图集资源,以节省构建体积。ScenePart: 在构建过程中自动组装多个场景部件。
安装
- 下载
Xuan25-VRC-Common-Utilities组件包,并将其导入到你的 Unity 项目中。该组件包包含UdonTelemetry组件以及一系列相关依赖组件。你可以使用 Git 将其clone到项目的 Packages 目录下,或者直接下载压缩包并将其解压到该目录中。
使用方法
RemoveOnBuild
本组件允许创作者在构建过程中根据预设配置自动删除一些不需要的组件,以支持多种目标平台。创作者可以通过在组件上添加 RemoveOnBuild 组件,并设置目标平台对应的选项,来指定在哪些平台上删除该组件。
这通常用于在构建过程中删除一些仅在编辑器中使用的组件,或者一些仅在特定平台上使用的组件,以节省构建产物体积并提高性能。
InactivateOnBuild
本组件允许创作者在构建过程中根据预设配置自动禁用一些不需要的组件,以支持多种目标平台。创作者可以通过在组件上添加 InactivateOnBuild 组件,并设置目标平台对应的选项,来指定在哪些平台上禁用该组件。
这通常用于在构建过程中自动禁用一些在编辑器中启用的组件。这些组件可能需要在游戏中默认为禁用状态,但在编辑器中保持启用,以便于编辑。
LTCGIBuildTargetConfig
本组件允许创作者在构建过程中根据预设配置自动管理 LTCGI 组件配置,以支持多种目标平台。创作者可以通过在 LTCGI Screen 组件上添加 LTCGIBuildTargetConfig 组件,并为每个目标平台设置该组件是否在编辑和构建过程中激活,以及是否在构建过程中删除。
通常来说,对于烘焙用的代理 LTCGI Screen 组件,需要在编辑过程中激活,并在构建过程中移除。对于仅在桌面端使用的 LTCGI Screen 组件,需要在构建目标为移动端时禁用并移除。
ClearFontAtlasOnBuild
本组件允许创作者在构建过程中自动清理动态 TextMeshPro 字体图集资源,以节省构建产物体积。这是一个全局组件,创作者可以通过在场景中的任意物件上添加 ClearFontAtlasOnBuild 组件来启用该功能。
ScenePart
本组件允许创作者在构建过程中自动组装多个场景部件。创作者可以为场景中作为场景部件根节点的物件添加 ScenePart 组件。
在构建过程中,这些根物件会被自动对齐到世界坐标系原点,并根据 Primary 参数决定是否默认启用该场景部件。勾选了 Primary 的场景部件会在构建产物中默认启用,否则会在构建产物中默认禁用。
StaticBatchingGroup
本组件用于配合 ScenePart 组件使用。Static Batching 是 Unity 引擎的一个内置功能,可以将一组静态物件合批成一个着色批次,以提高图形计算性能。
然而,这个功能与场景部件的组装功能存在一些冲突。它会将场景部件中的物件合批成一个无法被编辑的静态批次,导致在构建过程中无法正确组装场景部件。
为了解决这个问题,StaticBatchingGroup 组件会在构建过程中,于场景部件组装完成后,以其所附加的物件为根节点,自动将该根节点下的所有物件重新合批为一个静态批次,以确保场景部件能够被正确组装,并保持渲染性能。
使用案例
为了烘焙一个场景的三个光照版本(明亮、中等、暗淡),可以将该场景的三个变体放置在场景树中的不同空间位置,并分别进行烘焙。这样,就可以得到同一场景的多个烘焙版本。
为了在构建过程中自动对齐这些场景变体以便切换,可以在每个场景变体的根节点上添加 ScenePart 组件,并勾选明亮版本的 Primary 选项。这样,在构建过程中,三个场景变体会被自动对齐到世界坐标系原点;明亮版本会在构建产物中默认启用,另外两个版本则会默认禁用。
为了进一步优化性能,可以将 StaticBatchingGroup 组件添加到每个场景变体的根节点上,以确保这些场景变体中的物件能够在构建过程中被正确合批为静态批次,从而提高渲染性能。
由于场景中包含一个动态加载的播放列表,其中有大量 TextMeshPro 文本,而这些文本内容是从网络拉取的,因此在编辑器中自动预先生成的字体图集资源并没有实际意义,但仍然会占用构建产物的体积。可以在场景中的任意空物件上添加 ClearFontAtlasOnBuild 组件,使其在构建过程中自动清理这些动态 TextMeshPro 字体图集资源,从而节省构建产物体积。
在上述场景中,包含两个播放器屏幕,它们上面添加了 LTCGI Screen 组件,用于实现动态光照效果。为了对三个场景变体都进行 LTCGI 辐照范围的烘焙,场景中额外添加了四个供烘焙使用的 LTCGI 发光代理,并为这些代理添加了 LTCGI Screen 组件。
然而,四个供烘焙使用的 LTCGI 发光代理上的 LTCGI Screen 组件需要在构建过程中被移除。因此,可以将 LTCGIBuildTargetConfig 组件添加到这些 LTCGI Screen 组件上,并设置为在编辑过程中激活、在构建过程中移除。同时,这些代理网格物件也需要在构建过程中被移除,因此也需要在这些代理网格物件上添加 RemoveOnBuild 组件,并设置为在构建过程中移除。
由于 LTCGI 组件在移动端的性能较差,因此移动端最多只允许保留一个 LTCGI Screen 组件。目前的场景配置在构建完成后会包含两个 LTCGI Screen 组件,这会阻止 LTCGI 在移动端正常运行。因此,LTCGIBuildTargetConfig 组件也被添加到了另外两个 LTCGI Screen 组件上,其中一个被设置为在构建目标为移动端时禁用并移除,另一个则被设置为在任何构建目标上都保持启用。

No comments to display
No comments to display