#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;
}
}