我应该在Unity的UI预制中包含Canvas父级GameObject吗?

问题描述

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

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

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

hierarchy

解决方法

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

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

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

overrides

outside reference

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...