2D Unity: развернуть элемент пользовательского интерфейса на основе текста до нижней части

#unity3d #gameobject

#unity3d #gameobject

Вопрос:

У меня есть игровой объект (информационный блок) с ..

  • Вертикальная группа компоновки (отступ 20 со всех сторон, активен элемент управления высотой дочернего размера)
  • изображение
  • настройка размера содержимого (вертикальная подгонка устанавливается на предпочтительный размер, горизонтальная не ограничена)

Внутри этого информационного блока находится текстовый элемент, и каждый раз, когда я обновляю текст, я хочу, чтобы информационный блок расширялся или сворачивался, но только до самого низа. Прямо сейчас мой информационный ящик всегда расширяется или сворачивается как сверху, так и снизу, но я не хочу, чтобы это произошло. Как я могу этого добиться? Я добавил несколько скриншотов, чтобы лучше это визуализировать.

Это мои настройки для информационного блока:

Настройки информационного блока

И это мои настройки для текста:

Настройки текста

И это то, что происходит, когда я использую, например, меньше текста, поле сворачивается снизу и сверху, но я хочу, чтобы оно оставалось фиксированным вверху (на той же строке, что и зеленое поле рядом с ним) и сворачивается только внизу:

Как это не должно быть

Любая помощь действительно ценится!

Ответ №1:

Похоже, что вы используете a ContentSizeFitter также для родительского объекта. Таким образом, это зависит от того, как этот родительский объект выровнен с соответствующим родительским объектом.

Это предложение звучит странно, я знаю, но то, что вы сделали, в основном перекладывает ответственность за выравнивание на родительский элемент.

=> Выровняйте элемент пользовательского интерфейса по верху и увеличьте его вниз.

Все, что вам нужно сделать для этого, это либо установить

  • Привязки минимум у -> 1
  • Привязки не более y -> 1
  • Поворот y -> 1

или просто перейдите в RectTransform Инспектор, откройте инструмент выравнивания и, удерживая Shift Alt, нажмите на выравнивание сверху:

введите описание изображения здесь


Во-вторых, вместо использования ContentSizeFitter я предпочитаю иметь свой собственный скрипт, который делает только то, что должен, и ничего больше.

Вы можете получить preferredHeight именно то значение, которое вы ищете.

Следующий сценарий просто всегда применяет предпочтительную высоту к прямоугольнику текста. Использование [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;
    }
}
  

введите описание изображения здесь