1

Unity 版本: 5.6.5f1 个人版

TextMesh Pro 版本: 1.0.56.0b3

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

垂直布局组检查器

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

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

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

可点击区域叠加演示

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

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

编辑:在这个问题中添加了垂直布局组检查器和对象层次结构作为图像。

4

1 回答 1

0

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

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

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

原始文本检查器

在场景中查看的原始文本

注意 Auto-Size 的使用。问题中提到的问题是文本在分成几个不同的对象时缩放不正确。但是,作为单个对象,Auto-Size 将按预期工作,为每个单独的对象提供所需的目标字体大小。现在,一种方法可以实例化 TextMesh Pro 文本块对象并将它们存储到垂直布局组中。这种情况下的不同之处在于,每个对象都被故意设置为预先确定的字体大小。

实例化文本检查器

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

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

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

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

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

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

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

于 2018-03-22T06:56:09.330 回答