搜索 Unity

2022.2的预制件(Prefab)有什么新内容?

2022年11月22日 类别 Engine & platform | 10 分 阅读
What’s new for Prefabs in 2022.2? | Hero image, version 2
What’s new for Prefabs in 2022.2? | Hero image, version 2
分享

Is this article helpful for you?

Thank you for your feedback!

自上次的Scene Management团队发布预制件更新已经有一段时间了。在前几次发布期间,我们修复了大家上报的许多bug(谢谢!),并自那以后又对预制件系统做了几次改进。我们来逐一看看这些2022.2里的改进及其带来的帮助。新版引擎目前已进入beta测试。

替换预制件实例的预制件资产

你现在可以替换预制件实例的预制件资产,无论这个预制件实例是场景里的还是嵌套在其他预制件里的。预制件实例将保留自己在场景内的位置、转向和尺寸,仅接受新的资产内容,并依据名称匹配(默认方式)尽可能地保留选项覆盖和引用。更具体地说:

  • 预制件实例在Inspector 窗口现在有一个新的对象字段用于替换预制件资产。
  • Hiearchy 窗口右键菜单中也新添了替换预制件实例的预制件资产的选项。
  • 最后,普通GameObject(游戏对象)也能用层级视图的右键菜单,或通过按住Ctrl/Cmd键再拖放的操作转化成预制件实例。
Prefab Asset Object Field
用预制件实例替换掉普通对象。
Replace a plain GameObject with a Prefab instance.
用预制件实例替换掉普通对象。
Replace the Prefab Asset for a Prefab instance.
用预制件实例替换此预制件资产。

该功能的使用并不是只体现在UI中,和我们开发的其他功能一样,也有可以调用的API供开发者管理对象的匹配方式和覆盖的处置方式。详细请查看PrefabUtility.ReplacePrefabAssetOfPrefabInstancePrefabUtility.ConvertToPrefabInstance

此内容由第三方提供商托管,该第三方提供商不允许在未接受“Targeting Cookies”的情况下观看视频。如果想观看来自这些提供商的视频,请将“Targeting Cookies”的 Cookie 首选项设置为“是”。

在2022.2里替换预制件实例。

渲染新加入的游戏对象及组件

一个呼声很高的改进是重新排序新加的游戏对象和组件。“新加的游戏对象和组件”指的是原先不属于预制件实例,而在之后在场景中添加到预制件实例或添加到预制件变体嵌套预制件的对象和组件。在2022.1,你可以通过拖拽来重新排序新添的游戏对象,既能在这些新添的游戏对象间排序,也能在原来预制件实例的对象间排序。为了实现这个功能,我们对Undo(撤销)系统做了重大翻新。

如果你想用一个编辑器脚本来重新排序新添的游戏对象,可以直接在对象的Transform组件上重新设定sibling index(兄弟节点索引)。2022.2还新加了在检视器内重新排序新添组件的功能。组件的重新排序并没有公开API可用。

从预制件实例上删去游戏对象

要实现游戏对象和组件的功能完全对等,最后一个功能是将预制件实例删去游戏对象当作一种覆盖。删除游戏对象的覆盖已经在2022.2中可用,该选项能让你在删去游戏对象后同样能将此次修改撤回/应用到预制件资产上。

在编辑器脚本里,你可以用Object.DestroyImmediate来摧毁实例,并在场景文件内将摧毁操作记录为一次覆盖。

重新排序新添的游戏对象及组件

检查预制件变体的关系

用户们经常想了解特定预制件资产的变体继承树是什么样的。在2022.2,我们为检视器添加了Prefab Family(预制件亲族)弹窗。弹窗会显示Project Browser(项目窗口)内选中预制件资产的亲族关系。选中一个预制件资产并打开Prefab Family弹窗,编辑器将列出当前预制件的所有亲代,以及直接关联的子代。

Prefab Family pop-up
Prefab Family弹窗
Prefab Variants(预制件变体)总览

改进后的覆盖工具

除了访问继承树,用户还经常希望抛弃哪些用不到却又碰不到(因为属性已经从脚本上被移除)的覆盖。最极端的情况下,这些属性所引用的资产会被打包到最终版本里,占用多余的磁盘和内存空间。

以下覆盖现在将被标记为不再使用:

  • 空目标对象
  • 未知属性路径(不包含FormerlySerializedAsAttribute的使用)
  • 被移除的组件
  • 被移除的游戏对象
  • 修改后的阵列大小(例如材质阵列)

现在,当你在层级视图中选择一个或多个预制件实例,再打开Overrides下拉菜单,编辑器会标出是否有不再使用的覆盖。这时你可以用新的Unused Overrides(未使用的覆盖)下拉选项来移除这些覆盖。

Unused Overrides drop-down
Unused Overrides下拉菜单

另外,你可以用层级视图的场景右键菜单或任意一些实例的右键菜单来移除场景内所有未使用的覆盖。

Remove unused Overrides
移除未使用的覆盖。

我们不会自动移除这些覆盖。毕竟,我们不知道它们出现的原因。类似移除脚本属性或删去某项资产的覆盖不能被自动移除,因为用户可能需要撤销这些改动、恢复原本的覆盖。

如果你很奇怪:“为什么我按了‘Apply All’后实例上依旧有覆盖?” 这是因为这些覆盖无法被应用到预制件资产上。最常见的有,覆盖应用了场景内的其他对象,而预制件无法引用这些对象。这些无法应用的覆盖现在将在检视器内以深蓝色标示出来。它们无法被应用。只能被撤销

移除未使用的覆盖概览

熟悉其他改进

你现在可以修改Prefab Mode(预制件模式)的打开方式,从In Context(现场打开)改为In Isolation(单独打开)。这项改动可在Editor Preferences > General > Default Prefab Mode里完成

Default Prefab Mode in Editor Preferences
Editor Preferences下的Default Prefab Mode

在2022.2,撤销在推出Prefab Mode时会被记录成一个单次操作。一旦离开Prefab Mode,所有对预制件的修改都能一次撤销完成。

在过去几次发布期间,场景加载(和Prefab Mode加载预制件)时的错误处理和汇报有了较大的改进,报告将指明错误出在哪些预制件上,并且/或者提供缺失预制件的GUID。实际上,我们处理预制件资产缺失的方式要比以往更加安全、稳定。

为了进一步改善错误的处理,避免将坏数据导入到项目中,我们还新添了Broken Prefab Asset Type(损坏预制件资产类型),Prefab Importer(预制件导入器)在遇到无法纠正的错误时便会将资产归为这一新类。

它最常见的用处是区分那些缺少了父预制件(可能已被删除)的预制件变体。这时,预制件变体也将不复存在,导入器便会创建一个损坏预制件资产。该资产被选中时会在检视器内展示错误信息。如果的确是父预制件不见了,则它会列出缺失预制件的GUID(全局唯一标识符)。或者,如果一条预制件变体系列被打乱,你可以到 Inspector 窗口向上溯源,直到找到丢失了父对象的变体。

Prefab Variant Asset showing up as Broken Prefab due to lost parent Prefab
预制件变体资产由于丢失了父预制件而变成了损坏预制件

Disconnected Prefab(分离预制件)实例在2022.1里不复存在。我们依然支持加载Disconnected Prefab实例,但编辑器在加载场景时会剥离所有这些实例的预制件信息,将其变成普通游戏对象 introduction of our improved Prefabs.

前面有提到,我们团队还修复了一系列大家提交的bug。部分bug从原版预制件系统衍生而来,但有许多是针对改进后的预制件系统的。

今天,我们敢自信地说,最新预制件系统已经非常稳定。希望它能为你带来流畅和高效的使用体验。

还有更多关于预制件的疑问和意见?那就来论坛分享你的反馈吧。

2022年11月22日 类别 Engine & platform | 10 分 阅读

Is this article helpful for you?

Thank you for your feedback!

相关文章