如何停止 Unity 水平布局组中元素的自动调整大小?
How can I stop the automatic resizing of an Element in a Horizontal Layout Group in Unity?
这是我的问题:
我想让一堆 Text-GameObjects 水平均匀地分布在屏幕上。
所以我拿了一个 Layout-Group 并将它添加到一个 Panel 上,它在屏幕上被拉伸,具有以下设置:
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);
现在我遇到了问题,text-GameObjects 的宽度受我用它们显示的字符串长度的影响。因此,如果一个 text-GameObject 中有一个 3 个字符长的字符串,它比它旁边的一个 text-GameObject 有一个 1 个字符长的字符串更宽。但我需要在文本对象之间“公平地”分配宽度,独立于内部内容。
我希望你能帮助我,谢谢 :D
将我的评论作为答案,因为它回答了您的问题。您有两种选择来解决您的问题。
如果您在编译时知道子对象的数量,我提供的第一个不是健壮的,也不是模块化的。您可以利用 LayoutElement
的字段 minWidth
。通过将此值设置为每个元素均匀填充 space 所需的宽度,文本对象将不小于您给它的值。但是,如果您在运行时或任何其他时间将任何新对象添加到布局组,则需要重新计算这些值,因此这不是一个很好的解决方案。
第二个几乎不需要您做任何工作的解决方案是添加一个空的父对象 RectTransform
来填充文本对象上方的 space。随着布局组强制宽度和高度扩展到容器,每个 RectTransform
将均匀地填充 space,而子文本可以是它需要的任何大小。这是此解决方案的层次结构设置:
这是有效的解决方案:
在示例中,父对象是具有 Image
个组件的面板。我这样做只是为了表明每个对象之间都有你想要的分界线。您可以删除此组件并仍然让对象保留其结构。
这是我的问题: 我想让一堆 Text-GameObjects 水平均匀地分布在屏幕上。 所以我拿了一个 Layout-Group 并将它添加到一个 Panel 上,它在屏幕上被拉伸,具有以下设置: 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);
现在我遇到了问题,text-GameObjects 的宽度受我用它们显示的字符串长度的影响。因此,如果一个 text-GameObject 中有一个 3 个字符长的字符串,它比它旁边的一个 text-GameObject 有一个 1 个字符长的字符串更宽。但我需要在文本对象之间“公平地”分配宽度,独立于内部内容。
我希望你能帮助我,谢谢 :D
将我的评论作为答案,因为它回答了您的问题。您有两种选择来解决您的问题。
如果您在编译时知道子对象的数量,我提供的第一个不是健壮的,也不是模块化的。您可以利用 LayoutElement
的字段 minWidth
。通过将此值设置为每个元素均匀填充 space 所需的宽度,文本对象将不小于您给它的值。但是,如果您在运行时或任何其他时间将任何新对象添加到布局组,则需要重新计算这些值,因此这不是一个很好的解决方案。
第二个几乎不需要您做任何工作的解决方案是添加一个空的父对象 RectTransform
来填充文本对象上方的 space。随着布局组强制宽度和高度扩展到容器,每个 RectTransform
将均匀地填充 space,而子文本可以是它需要的任何大小。这是此解决方案的层次结构设置:
这是有效的解决方案:
在示例中,父对象是具有 Image
个组件的面板。我这样做只是为了表明每个对象之间都有你想要的分界线。您可以删除此组件并仍然让对象保留其结构。