Saya mencoba membuat editor teks sederhana di Unity.

Saat ini, saya mencoba mengganti fungsi tombol keyboard End standar.

Saya menggunakan sistem UI "baru" dan InputField sebagai editor teks. Ini memiliki multi-line diaktifkan. Biasanya saat Anda menekan End (pada keyboard fisik normal) saat fokus berada di InputField, tanda sisipan akan berakhir di seluruh TextField. Saya ingin pergi ke akhir baris saat ini. Pada dasarnya saya ingin fungsi yang sama dengan yang Anda miliki di editor teks biasa seperti Notepad++.

Sejauh ini, saya memiliki skrip di InputField yang berbunyi seperti ini:

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;
}

Jika saya menggunakan ini untuk kunci lain, seperti KeyCode.Y, maka itu berfungsi dengan baik. Ia menemukan posisi tanda sisipan yang benar dan memindahkan tanda sisipan ke tempat itu. Namun, kemudian juga mencetak karakter Y.

Saat saya menggunakan KeyCode.End dan menekan tombol End, itu hanya akan berakhir di seluruh TextField. Jadi saya pikir kode saya berfungsi, tetapi kode itu menjalankan fungsi kunci End normal setelah skrip saya dieksekusi.

Bagaimana cara mencegah perilaku default ini? Saya sudah googling selama 25 menit.

1
Einar 21 Maret 2019, 21:15

1 menjawab

Jawaban Terbaik

Silakan coba solusi berikut. Anda harus mewarisi kelas InputField, mengganti metode Rebuild untuk menyimpan CaretPosition dan mengganti metode LateUpdate untuk mengubah perilaku kunci End. Setelah selesai, ganti komponen InputField pada GameObject Anda dengan skrip CustomInputField Anda.

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;
    }
}
0
Paviel Kraskoŭski 21 Maret 2019, 19:58