Как переопределить поведение по умолчанию кнопки END в InputField, в Unity? - PullRequest
1 голос
/ 21 марта 2019

Я пытаюсь создать простой текстовый редактор в Unity.

Сейчас я пытаюсь переопределить стандартную End функциональность клавиш клавиатуры.

Я использую «новую» систему пользовательского интерфейса и InputField в качестве текстового редактора.Он имеет многострочный доступ.Обычно, когда вы нажимаете Конец (на обычной физической клавиатуре), когда фокус находится на InputField, каретка идет до конца всего 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 минут.

1 Ответ

1 голос
/ 21 марта 2019

Пожалуйста, попробуйте следующее решение. Вы должны наследовать InputField класс, переопределить метод Rebuild, чтобы сохранить CaretPosition, и переопределить LateUpdate метод, чтобы изменить поведение клавиши End . Когда вы закончите, замените компонент InputField на вашем GameObject сценарием 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;
    }
}
...