2D Unity:将基于文本的UI元素扩展到底部

问题描述

我有一个带有..的游戏对象(InfoBox)。

  • 垂直布局组(四边各占20,有效控制子尺寸大小)
  • 图片
  • 内容大小适合者(垂直拟合设置为首选大小,水平不受限制)

此InfoBox内是一个Text-Element,每次我更新文本时,我都希望InfoBox展开或折叠,但只能扩展到底部。现在,我的InfoBox始终会在顶部和底部同时展开或折叠,但是我不希望这种情况发生。我该如何实现?我添加了一些屏幕截图,以更好地形象化这一点。

这些是我对信息框的设置:

InfoBox Settings

这些是我对文本的设置:

Text Settings

例如,这是当我使用较少的文本,框从底部和顶部折叠时发生的情况,但是我希望它固定在顶部(与旁边的绿色框位于同一行)并且仅折叠在底部:

How it should not be

任何帮助都非常感谢!

解决方法

您的主要问题似乎是在父对象上也使用了ContentSizeFitter。因此,这取决于此父对象与其相应父对象的对齐方式。

我知道这句话听起来很奇怪,但是您所做的基本上是将对齐责任移交给了父母。

=>使您的UI元素与顶部对齐并向下增长。

您只需为此设置

  • 锚点最小-> 1
  • 最大锚点y-> 1
  • 枢轴y-> 1

或直接转到RectTransform检查器,打开对齐工具并按住 Shift + Alt 并单击顶部对齐:

enter image description here


第二步,而不是使用ContentSizeFitter,我更喜欢拥有自己的脚本,该脚本仅执行应做的事情,而已。

您可以获得preferredHeight,它正是您想要的值。

以下脚本仅始终将首选高度应用于文本rect。使用[ExecuteAlways]也可以在编辑模式下使用。只需将其与GameObject组件安装在同一UI.Text

[ExecuteAlways]
[RequireComponent(typeof(Text))]
[RequireComponent(typeof(RectTransform))]
public class TextHeightFitter : MonoBehaviour
{
    [SerializeField] private RectTransform _rectTransform;
    [SerializeField] private Text _text;

    private void Update()
    {
        if (!_text) _text = GetComponent<Text>();
        if (!_rectTransform) _rectTransform = GetComponent<RectTransform>();

        var desiredHeight = _text.preferredHeight;
        var size = _rectTransform.sizeDelta;
        size.y = desiredHeight;
        _rectTransform.sizeDelta = size;
    }
}

enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...