Как сделать так, чтобы поле ввода TextMeshPro корректировало область своего лучевого вещания на основе его текста? - PullRequest
0 голосов
/ 11 мая 2019

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

Вот так это выглядит сейчас.

enter image description here


Моя цель

Область приема Raycast должна быть такого же размера, что и текст.

Поворот текста должен быть (0,5, 0,5), потому что анимация меняет своюмасштаб.Неприятно, когда длинный текст масштабируется не по центру.Область радиопередачи не должна зависеть от масштаба.


Мои попытки

enter image description here

input-32 имеет элемент макета с Flexible Width , установленным в 1, поэтому он должен заполнить все доступное пространство. Текстовая область имеет Горизонтальную группу макетов (см. Рисунок).Внутри есть разделитель с Flexible Width , установленным на 1, заполнитель и текст.

Теперь он работает:

enter image description here

Выделение в неправильном месте, и текст иногда неуправляемо летит влево.Похоже, что поле ввода не ожидает, что здесь будут присутствовать элементы, кроме текста и заполнителя, и работает так, как если бы их не было.

ОК, затем поместите проставку непосредственно под input-32 .Тем не менее, поведение точно такое же.

Я понял, что разрывы полей, когда я добавляю Content Size Fitter к текстовому элементу.Но как контролировать его ширину, от которой зависит лучевое вещание?Возможно, мне не следует изменять размер текста, но переопределить его лучевое вещание, но я не знаю как.


Я должен признать, я не понимаю, как поля ввода TextMeshPro работают на низком уровне, и поэтомумои попытки терпят неудачу.Можете ли вы мне помочь или хотя бы дать подсказку?

1 Ответ

0 голосов
/ 11 мая 2019

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

Единственная проблема, которую я заметил при таком подходе, состоит в том, что пробел в конце ввода не влияет на «предпочтительный размер» текста (не совсем понятно, почему), поэтому текстовое поле не расширяется, чтобы показать это.

Вам также, вероятно, следует удалить компонент RectMask2D в игровом объекте "Текстовая область", так как оставив его, вы обрежете половину каретки (и не требуется в вашем случае).

Добавьте этот скрипт к вашему объекту с TMP_InputField on:

using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class ResizeInputToMatchText : MonoBehaviour
{
    private RectTransform m_Rect;
    private RectTransform m_inputFieldRect;

    private RectTransform rectTransform
    {
        get
        {
            if (m_Rect == null)
                m_Rect = GetComponent<RectTransform>();
            return m_Rect;
        }
    }

    private RectTransform inputFieldTextRectTransform
    {
        get
        {
            if (m_inputFieldRect == null)
                m_inputFieldRect = GetComponent<TMP_InputField>().textComponent.rectTransform;
            return m_inputFieldRect;
        }
    }

    private void Update()
    {
        rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, LayoutUtility.GetPreferredSize(inputFieldTextRectTransform, 0));
        inputFieldTextRectTransform.localPosition = Vector3.zero; // stops the text scrolling sideways - it doesn't need to
    }
}
...