0

我正在为我的游戏创建 UI。我已经创建了简单的元素,例如动画按钮和多选项开关,但是我在输入字段方面遇到了问题。

这就是它现在的样子。

在此处输入图像描述


我的目标

Raycast 接收区域应与文本大小相同。

文本轴应该是 (0.5, 0.5),因为动画改变了它的比例。当长文本不在中心缩放时,这并不好。Raycast 区域不应受比例影响。


我的尝试

在此处输入图像描述

input-32有一个灵活宽度设置为 1 的布局元素,因此它应该填充所有可用空间。文本区域有一个水平布局组(见图)。里面有一个“灵活宽度”设置为 1 的垫片、一个占位符和一个文本。

它现在可以工作:

在此处输入图像描述

选择在错误的位置,文本有时会不受控制地向左飞。似乎输入字段不希望文本和占位符以外的元素出现在这里并且就像它们不存在一样工作。

OK,那就直接把垫片放在input-32下面。但是,行为完全相同。

当我将Content Size Fitter添加到文本元素时,我发现该字段中断。但是如何控制它的宽度,取决于哪个光线投射?可能我不应该调整文本的大小而是覆盖它的光线投射,但我不知道如何。


我不得不承认,我不明白 TextMeshPro 输入字段在低级别是如何工作的,这就是我的尝试失败的原因。你能帮我或至少给个提示吗?

4

1 回答 1

0

我像你一样尝试了几个ContentSizeFitter和的组合HorizontalLayoutGroup,但效果不佳。我还尝试制作定制尺寸的钳工。最后,我创建了一个简单的组件,它只调整文本字段的大小以匹配每帧文本的首选大小。它可以进行一些优化,但在我的测试中效果很好。我认为从 UI 的布局系统中调整大小可以解决插入符号的问题 - 因为插入符号在布局系统中移动并且这两件事相互争斗。

我注意到这种方法的唯一问题是输入末尾的空格不会影响文本的“首选大小”(不完全确定原因),因此文本字段不会扩展以显示这一点。

您还应该删除RectMask2D“文本区域”游戏对象上的组件,因为将其留在那里会切断插入符号的一半(在您的情况下不需要)。

使用 on将此脚本添加到您的对象中TMP_InputField

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
    }
}
于 2019-05-11T19:18:53.383 回答