如何使TextMeshPro输入字段根据其文本调整其光线投射区域?

时间:2019-05-11 18:37:34

标签: unity3d unity3d-ui

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

现在就是这样。

enter image description here


我的目标

射线广播接收区域应与文本大小相同。

文本轴应为(0.5,0.5),因为动画会更改其比例。当长文本不围绕中心缩放时,效果不好。射线广播区域不应受缩放比例的影响。


我的尝试

enter image description here

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

它现在可以工作:

enter image description here

选择位置错误,并且文本有时会不可控制地向左飞。输入字段似乎不希望文本和占位符以外的其他元素出现在此处,并且好像它们不存在一样起作用。

确定,然后将分隔符直接放在 input-32 下。但是,行为是完全一样的。

我发现向文本元素添加 Content Size Fitter 时,该字段中断。但是,如何控制它的宽度(取决于光线投射)?也许我不应该调整文本的大小,而应该覆盖其光线投射,但是我不知道该怎么做。


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

1 个答案:

答案 0 :(得分:0)

我像您一样尝试了ContentSizeFitterHorizontalLayoutGroup的几种组合,但效果不佳。我还尝试制作自定义尺寸的钳工。最后,我创建了一个简单的组件,该组件仅调整文本字段的大小以匹配每帧文本的首选大小。可以对其进行一些优化,但是在我的测试中效果很好。我认为从UI的布局系统中移出调整大小可以解决插入符号的问题-插入符号在布局系统中移动并且两件事相互冲突。

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

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

将此脚本添加到您的对象上,并在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
    }
}