如何在 Unity 中覆盖 InputField 中 END 按钮的默认行为?

How to override default behavior of END button in InputField, in Unity?

我正在尝试在 Unity 中创建一个简单的文本编辑器。

现在,我正在尝试覆盖标准 End 键盘键功能。

我正在使用 "new" UI 系统和 InputField 作为文本编辑器。 它启用了多行。通常,当焦点位于 InputField 上时,当您点击 End(在普通物理键盘上)时,插入符号会转到整个 TextField 的末尾。我希望它转到当前行的末尾。基本上,我想要的功能与普通文本编辑器(如 Notepad++)中的功能相同。

到目前为止,我在 InputField 上有一个如下所示的脚本:

public InputField editor; // This is the InputField

void Update() 
{
    if (Input.GetKeyDown(KeyCode.End))
    {
        string code = editor.text;
        int caretPos = editor.caretPosition;

        int newLineIndex = FindEndOfLine(code, caretPos);
        editor.caretPosition = newLineIndex;
    }
}

int FindEndOfLine(string text, int startIndex)
{
    for (int i = startIndex; i < text.Length; i++)
    {
        Debug.Log(text[i]);

        if (text[i] == '\n')
        {
            Debug.Log("FOUND IT: " + i);
            return i;
        }
    }

    return text.Length;
}

如果我将它用于另一个键,例如 KeyCode.Y,那么它会很好用。它找到正确的插入符位置并将插入符移动到那个位置。但是,它随后还会打印字符 Y.

当我使用 KeyCode.End 并按下 End 键时,它只是转到整个 TextField 的末尾。所以我认为我的代码有效,但它在我的脚本执行后执行正常的 End 关键功能。

如何防止这种默认行为?我已经用谷歌搜索了 25 分钟。

请尝试以下解决方案。你应该继承InputFieldclass,覆盖Rebuild方法以保存CaretPosition并覆盖LateUpdate方法来改变的行为结束 键。完成后,将 GameObject 上的 InputField 组件替换为 CustomInputField 脚本。

using UnityEngine;
using UnityEngine.UI;

public class CustomInputField : InputField
{
    private int oldCaretPosition;

    public override void Rebuild(CanvasUpdate update)
    {
        base.Rebuild(update);
        oldCaretPosition = caretPosition;
    }

    protected override void LateUpdate()
    {
        base.LateUpdate();
        if (Input.GetKeyDown(KeyCode.End))
        {
            int newLineIndex = FindEndOfLine(oldCaretPosition);
            caretPosition = newLineIndex;
        }
    }

    private int FindEndOfLine(int startIndex)
    {
        for (int i = startIndex; i < text.Length; i++)
        {
            if (text[i] == '\n')
            {
                return i;
            }
        }
        return text.Length;
    }
}