如何均匀缩放垂直布局组中的各个 TextMesh Pro 文本对象



Unity 版本:5.6.5f1 个人

文本网格专业版:1.0.56.0b3

我正在尝试创建存储在垂直布局组 UI 元素中的动态 TextMesh Pro 文本块。每个文本块都存储在其自己的游戏对象中,并且所有游戏对象都是垂直布局组的子项。所有 TextMesh Pro 对象都使用相同的字体,并启用了"自动调整大小"标志,以便它们在垂直布局组的边界内缩放。理想情况下,缩放时所有文本块应具有相同的字体大小。请参阅当前的垂直布局组检查器,其中包含组和子 TextMesh Pro 文本块的层次结构。

垂直布局组检查器

问题是,如果一个文本块由两行组成,而另一个文本块由三行组成,则这两个块将占据垂直布局组的大约一半。但是,第一个块的字体大小约为第二个块字体大小的 2/3。在实践中,我偶尔也会看到两行文本块跨越三行,字体大小要大得多。有关详细信息,请参阅下面的图像链接。

实践中的产出与期望的结果

此处的目标不是以任何方式修改垂直布局组。内容必须适合组的固定位置和固定大小。文本块必须是单独的对象,以便定义可单击区域。每个区域跨越整个文本块,并将随着文本的更改而调整大小。

可点击区域叠加演示

管理垂直布局组的 Monobehavior 背后的代码维护一个字符串数组,其中包含上述所有文本块的文本。对此阵列的更改(如添加、编辑和删除)按扩展名显示为对垂直布局组的更改。在这一点上,我很确定我需要实现功能来在发生更改时操作文本框,而不是依赖于 TextMesh Pro 的自动调整大小,但正是在这一点上,我卡住了。

如何以编程方式或其他方式实现所需的结果,即在添加到垂直布局组的所有文本框中保持相同的字体大小,同时在不同内容的文本框之间分配组的空间,以便尽可能多地利用垂直布局组?

编辑:将垂直布局组检查器和对象层次结构作为图像添加到此问题。

正如 Ian H. 所说,Auto-Size 会缩放字体大小,以使文本内容适合对象的矩形。虽然各个 TextMesh Pro 块必须是不同的对象,但垂直布局组被视为具有"固定位置和固定大小"的对象的一部分。此问题的解决方案是通过在与垂直布局组大小相同的 TextMesh Pro 文本块中使用自动调整大小来确定所有子对象的字体大小,然后为每个子对象使用该字体大小,知道适合是有保证的。首先,让我们从建议的层次结构开始:

具有原始文本和垂直布局组的层次结构

具有单个 TextMesh Pro 文本块的新游戏对象使用与垂直布局组相同的 RectTransform 值,用于模拟文本相对于其所包含区域应如何缩放。如问题中所述,几个段落条目被存储到维护它们的数组中。每个字符串元素都输出到 Raw Text 块,由 System.Environment.换行符分隔。

原始文本检查器

在场景中查看的原始文本

请注意使用自动调整大小。问题中提到的问题是,当文本分解为几个不同的对象时,文本缩放不正确。但是,作为单个对象,自动调整大小将按预期工作,为每个对象提供所需的目标字体大小。现在,一种方法可以实例化 TextMesh Pro 文本块对象,并将其存储到垂直布局组中。这种情况的区别在于,每个对象都故意设置为事先确定的字体大小。

实例化的文本检查器

出于可视化目的,每个实例化文本对象都由 TextMesh Pro 文本块以及作为包含文本块边界的子对象添加的颜色框组成。这仍将在没有颜色框的情况下按预期运行。下图显示了覆盖实例化文本的原始文本结果之间的比较,其中原始文本为红色,实例化文本为黑色。

比较:原始文本与实例化文本

文本本身不会在每个点上都完美重叠。这是因为原始文本块的居中与多个实例化文本块的居中产生不同的效果,每个块都有自己的中心。但是,对于由文本定义的可单击区域列表,此行为比原始文本输出提供的更接近最终目标。从可见性中删除原始文本,这是最终结果。

结果:在场景中查看的实例化文本

进一步的测试表明,可以使用任意数量的文本复制此行为。此外,用户可以通过在原始文本自动调整大小属性中定义最小和最大字体大小来对实例化文本块施加字体大小限制。下面,您可以看到删除某些元素时字体大小的变化,以及当文本量减少到两个条目时施加的最大字体大小。

四个条目 - 未达到增加的字体大小/未达到最大字体大小

两个条目 - 达到最大字体大小/填充增加

最新更新