【问题标题】:How can I stop the automatic resizing of an Element in a Horizontal Layout Group in Unity?如何停止 Unity 水平布局组中元素的自动调整大小?
【发布时间】:2021-11-15 09:15:19
【问题描述】:

这是我的问题: 我想让一堆文本游戏对象水平地均匀分布在屏幕上。 因此,我采用了一个 Layout-Group 并将其添加到一个面板上,该面板在屏幕上伸展,具有以下设置: Panel Settings

(Panel 上的 Layout Element 在这里我认为并不重要,但 Panel 本身是由另一个 Object 控制以在屏幕上伸展的)

现在,我通过脚本添加文本游戏对象。看起来是这样的:

                days[i].transform.SetParent(GameObject.Find("Day Panel").transform);
                days[i].AddComponent<Text>();
                days[i].transform.GetComponent<Text>().font = (Font)Resources.GetBuiltinResource(typeof(Font), "Arial.ttf");
                days[i].transform.GetComponent<Text>().fontSize = 25;
                days[i].transform.GetComponent<Text>().color = Color.black;
                days[i].transform.GetComponent<Text>().alignment = TextAnchor.UpperCenter;
                days[i].transform.GetComponent<Text>().text = shownDates[i].Day.ToString();
                days[i].transform.localScale = new Vector3(1, 1, 1);
                days[i].transform.localPosition = new Vector3(0, 0, 0);

现在我有一个问题,文本游戏对象的宽度受我与它们一起显示的字符串长度的影响。因此,如果一个文本游戏对象中有一个 3 字符长的字符串,它会比它旁边的文本游戏对象和一个 1 字符长的字符串更宽。但我需要在文本对象之间“公平”分配宽度,独立于内部。

希望你能帮助我,谢谢:D

【问题讨论】:

  • 不是一个很好的解决方案,但您可以将LayoutElemenet 附加到每个文本对象,并根据子项的数量给出一个偶数分割的最小宽度。另一个选项不是直接将大小不同的文本对象作为子面板,而是将文本设置为面板的子项。面板将均匀地填充空间,并且这些面板中的文本可以是任意大小。

标签: c# unity3d canvas layout


【解决方案1】:

让我的评论成为答案,因为它回答了您的问题。您有两种选择来解决您的问题。

如果您在编译时知道子对象的数量,我提供的第一个不是那么健壮且不是模块化的。您可以使用LayoutElement 的字段minWidth。通过将此值设置为每个元素均匀填充空间所需的宽度,文本对象将不小于您给它的值。但是,如果您在运行时或任何其他时间向布局组添加任何新对象,则需要重新计算这些值,因此这不是一个很好的解决方案。

第二种几乎不需要您进行任何工作的解决方案是添加一个空父 RectTransform 以填充文本对象上方的空间。随着布局组强制宽度和高度扩展到容器,每个RectTransform 将均匀地填充空间,而子文本可以是它需要的任何大小。这是此解决方案的层次结构设置:

这是有效的解决方案:

在示例中,父对象是具有Image 组件的面板。我这样做只是为了表明每个对象之间存在您想要的鸿沟。您可以移除此组件,但仍让对象保留其结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    相关资源
    最近更新 更多