如何均匀缩放垂直布局组中的单个 TextMesh Pro 文本对象?
How do I scale individual TextMesh Pro Text Objects in a Vertical Layout Group evenly?
Unity 版本: 5.6.5f1 个人版
TextMesh 专业版: 1.0.56.0b3
我正在尝试创建存储在垂直布局组 UI 元素中的动态 TextMesh Pro 文本块。每个文本块都存储在自己的游戏对象中,所有游戏对象都是 Vertical Layout Group 的子对象。所有 TextMesh Pro 对象都使用相同的字体并启用 "Auto-Sizing" 标志,以便它们在 Vertical Layout Group 的范围内缩放。理想情况下,所有文本块在缩放时都应具有相同的字体大小。查看当前的垂直布局组检查器,其中包含组和子 TextMesh Pro 文本块的层次结构。
Vertical Layout Group Inspector
问题是,如果一个文本块由两行组成,而另一个文本块由三行组成,那么这两个块将占据垂直布局组的大约一半。但是,第一个块的字体大小约为第二个块的字体大小的 2/3。在实践中,我偶尔也会看到两行文本块跨越三行,字体大小更大。有关详细信息,请参见下面的图片 link。
Output In Practice vs. Desired Outcome
这里的目标不是以任何方式修改垂直布局组。内容必须符合组的固定位置和固定大小。为了定义可点击区域,文本块必须是单独的对象。每个区域跨越整个文本块,并会随着文本的变化而调整大小。
Clickable Region Overlay Demonstration
管理垂直布局组的 Monobehaviour 背后的代码维护一个字符串数组,其中包含上述所有文本块的文本。对该数组的添加、编辑和删除等更改显示为对垂直布局分组的更改。在这一点上,我非常确定我需要实现在发生更改时操纵文本框的功能,而不是依赖 TextMesh Pro 的自动调整大小,但在这一点上,我被卡住了。
如何以编程方式或其他方式实现期望的结果,即在添加到垂直布局组的所有文本框中保持相同的字体大小,同时在文本中分配组的 space不同内容的盒子,以便我尽可能多地利用垂直布局组?
编辑: 添加了垂直布局组检查器和对象层次结构作为此问题的图像。
正如 Ian H. 所说,Auto-Size 缩放 font-size 以将文本内容适合对象的矩形。虽然各个 TextMesh Pro 块必须是不同的对象,但垂直布局组被视为具有 "fixed-position and fixed-size." 的对象的一部分。解决此问题的方法是在 TextMesh Pro 文本块中使用 Auto-Sizing与垂直布局组相同的大小来确定所有子对象的 font-size,然后为每个子对象使用那个 font-size,知道适合是有保证的。首先,让我们从建议的层次结构开始:
Hierarchy with Raw Text and Vertical Layout Group
具有单个 TextMesh Pro 文本块的新游戏对象使用与 Vertical Layout Group 相同的 RectTransform 值来模拟文本应如何相对于其包含的区域进行缩放。如问题中所述,几个段落条目存储在维护它们的数组中。每个字符串元素都输出到原始文本块,由 System.Environment.Newline 个字符分隔。
Raw Text Inspector
Raw Text Viewed In Scene
注意 Auto-Size 的用法。问题中提到的问题是文本在分成几个不同的对象时缩放不当。但是,作为单个对象,Auto-Size 将按预期工作,为每个单独的对象提供所需的目标 font-size。现在,一个方法可以实例化 TextMesh Pro 文本块对象并将它们存储到 Vertical Layout Group 中。这种情况下的不同之处在于,每个对象都被故意设置为预先确定的font-size。
Instantiated Text Inspector
出于可视化目的,每个实例化文本对象都包含 TextMesh Pro 文本块,以及作为包含文本块边界的子对象添加的颜色框。如果没有颜色框,这仍将按预期运行。原始文本覆盖实例化文本的结果对比如下图所示,原始文本为红色,实例化文本为黑色。
Comparison: Raw vs. Instantiated Text
文本本身不会在每一点都完美重叠。这是因为原始文本块的居中产生的效果与多个实例化文本块的居中效果不同,每个实例化文本块都有自己的中心。但是,对于由文本定义的可点击区域列表而言,此行为比原始文本输出提供的更接近最终目标。从可见性中删除原始文本,这是最终结果。
Result: Instantiated Text Viewed in Scene
进一步测试表明,此行为可以用任意数量的文本复制。此外,用户可以通过在原始文本 Auto-Size 属性中定义最小和最大字体大小来对实例化文本块施加 font-size 限制。在下面,您可以看到 font-size 中的变化,因为一些元素被删除,以及当文本量减少到两个条目时强加的最大值 font-size。
Four Entries - Increased Font Size / Maximum Font Size Not Reached
Two Entries - Maximum Font Size Reached / Padding Increased
Unity 版本: 5.6.5f1 个人版
TextMesh 专业版: 1.0.56.0b3
我正在尝试创建存储在垂直布局组 UI 元素中的动态 TextMesh Pro 文本块。每个文本块都存储在自己的游戏对象中,所有游戏对象都是 Vertical Layout Group 的子对象。所有 TextMesh Pro 对象都使用相同的字体并启用 "Auto-Sizing" 标志,以便它们在 Vertical Layout Group 的范围内缩放。理想情况下,所有文本块在缩放时都应具有相同的字体大小。查看当前的垂直布局组检查器,其中包含组和子 TextMesh Pro 文本块的层次结构。
Vertical Layout Group Inspector
问题是,如果一个文本块由两行组成,而另一个文本块由三行组成,那么这两个块将占据垂直布局组的大约一半。但是,第一个块的字体大小约为第二个块的字体大小的 2/3。在实践中,我偶尔也会看到两行文本块跨越三行,字体大小更大。有关详细信息,请参见下面的图片 link。
Output In Practice vs. Desired Outcome
这里的目标不是以任何方式修改垂直布局组。内容必须符合组的固定位置和固定大小。为了定义可点击区域,文本块必须是单独的对象。每个区域跨越整个文本块,并会随着文本的变化而调整大小。
Clickable Region Overlay Demonstration
管理垂直布局组的 Monobehaviour 背后的代码维护一个字符串数组,其中包含上述所有文本块的文本。对该数组的添加、编辑和删除等更改显示为对垂直布局分组的更改。在这一点上,我非常确定我需要实现在发生更改时操纵文本框的功能,而不是依赖 TextMesh Pro 的自动调整大小,但在这一点上,我被卡住了。
如何以编程方式或其他方式实现期望的结果,即在添加到垂直布局组的所有文本框中保持相同的字体大小,同时在文本中分配组的 space不同内容的盒子,以便我尽可能多地利用垂直布局组?
编辑: 添加了垂直布局组检查器和对象层次结构作为此问题的图像。
正如 Ian H. 所说,Auto-Size 缩放 font-size 以将文本内容适合对象的矩形。虽然各个 TextMesh Pro 块必须是不同的对象,但垂直布局组被视为具有 "fixed-position and fixed-size." 的对象的一部分。解决此问题的方法是在 TextMesh Pro 文本块中使用 Auto-Sizing与垂直布局组相同的大小来确定所有子对象的 font-size,然后为每个子对象使用那个 font-size,知道适合是有保证的。首先,让我们从建议的层次结构开始:
Hierarchy with Raw Text and Vertical Layout Group
具有单个 TextMesh Pro 文本块的新游戏对象使用与 Vertical Layout Group 相同的 RectTransform 值来模拟文本应如何相对于其包含的区域进行缩放。如问题中所述,几个段落条目存储在维护它们的数组中。每个字符串元素都输出到原始文本块,由 System.Environment.Newline 个字符分隔。
Raw Text Inspector
Raw Text Viewed In Scene
注意 Auto-Size 的用法。问题中提到的问题是文本在分成几个不同的对象时缩放不当。但是,作为单个对象,Auto-Size 将按预期工作,为每个单独的对象提供所需的目标 font-size。现在,一个方法可以实例化 TextMesh Pro 文本块对象并将它们存储到 Vertical Layout Group 中。这种情况下的不同之处在于,每个对象都被故意设置为预先确定的font-size。
Instantiated Text Inspector
出于可视化目的,每个实例化文本对象都包含 TextMesh Pro 文本块,以及作为包含文本块边界的子对象添加的颜色框。如果没有颜色框,这仍将按预期运行。原始文本覆盖实例化文本的结果对比如下图所示,原始文本为红色,实例化文本为黑色。
Comparison: Raw vs. Instantiated Text
文本本身不会在每一点都完美重叠。这是因为原始文本块的居中产生的效果与多个实例化文本块的居中效果不同,每个实例化文本块都有自己的中心。但是,对于由文本定义的可点击区域列表而言,此行为比原始文本输出提供的更接近最终目标。从可见性中删除原始文本,这是最终结果。
Result: Instantiated Text Viewed in Scene
进一步测试表明,此行为可以用任意数量的文本复制。此外,用户可以通过在原始文本 Auto-Size 属性中定义最小和最大字体大小来对实例化文本块施加 font-size 限制。在下面,您可以看到 font-size 中的变化,因为一些元素被删除,以及当文本量减少到两个条目时强加的最大值 font-size。
Four Entries - Increased Font Size / Maximum Font Size Not Reached
Two Entries - Maximum Font Size Reached / Padding Increased