【问题标题】:Should I include the Canvas parent GameObject in a UI prefab in Unity我应该在 Unity 的 UI 预制件中包含 Canvas 父游戏对象吗
【发布时间】:2021-02-13 10:26:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: unity3d yaml scene prefab


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-20
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多