首页 > 解决方案 > 我应该在 Unity 的 UI 预制件中包含 Canvas 父游戏对象吗

问题描述

我的 Unity 场景中有四种不同的 Canvas 元素。这按关注点组织它们,但也提高了性能,因为如果我“弄脏”其中一个元素,我不必重建所有元素。我想创建每个预制件,这样我就可以在整个游戏中重复使用它们,而且我的场景文件中的元素也更少(我还没有弄清楚为什么 Unity 不重新组织 YAML 以匹配场景顺序和层次结构. 目前我看不出任何原因,这让源代码管理变得非常痛苦)。

所以,我的问题是:我应该在预制件中包含 Canvas 作为父游戏对象,还是应该让第一个孩子成为预制件(见图)?我看到两个观点:

  1. 一方面,扫描场景根中的元素列表并查看蓝色对象并知道它们在场景中自动复制是很好的。另外,存储在预制件中的对象越多,对我的 YAML 文件的污染就越少。
  2. 另一方面,在父级上使用 Canvas Scalar 脚本时,每次更改分辨率/平台时,预制件内的尺寸都会更新,并且我读过总是在预制件模式之外更新它们并不好。另一个问题是 UI 元素通常有很多外部引用来更新文本等。

等级制度

标签: unity3dyamlsceneprefab

解决方案


经过更多的研究,我得出了一些关于答案的结论:

  1. 正如在 Unite 2017 上的演讲中所述,通过关注点隔离 UI 元素“孤岛”以及它们的更新频率将防止 UI 影响性能。该视频还指出,可以其他 Canvas 中使用多个 Canvas 来实现此目标。
  2. 如果您添加一个预制件,其值是从预制件外部更新的,它们将显示为该预制件的“覆盖”。这包括如果您从预制件内部链接到预制件之外的元素,反之亦然(见图)。重要的是,不可能将这些覆盖应用于预制件,这就是重点。Unity 接受这些变化将会发生,这就是它在不破坏预制件或场景的情况下处理它们的方式。

所以答案是肯定的,在 prefab 中包含 Canvas 父级是没有问题的,你甚至可以在其他 Canvas 中组织它,以便它们都继承相同的设置。此外,由于存储在预制件中的代码越多,.unity YAML 文件中额外的(无组织的)相同代码(在我的例子中从 17,000 行减少到不到 5000 行!)所以这是推荐的方法。

覆盖

外部参考


推荐阅读