Unity3D Преобразование ключевого события в обычный текст

Я реализую виртуальную консоль для своей игры, и я передаю события Key up через канал событий (Observable Subject) и обрабатываю их на стороне виртуальной консоли с помощью

public void ReceiveInput (Event e)
{
    Debug.Log ("ReceiveInput: " + e.ToString ());
    if (e.keyCode == KeyCode.Backspace) {
        if (ConsoleInputLine.LineText.Length > 2)
            ConsoleInputLine.RemoveLastChar ();
        return;
    }
    if (e.keyCode == KeyCode.Return || e.keyCode == KeyCode.KeypadEnter) {
        ConsoleInputLine.LineText = "$ ";
        return;
    }
    var chr = e.keyCode.ToString ();
    if (e.capsLock || e.shift)
        chr = chr.ToUpper ();
    else
        chr = chr.ToLower ();
    ConsoleInputLine.AppendText ("" + chr);
}

Хотя это работает для простых букв A-Z и az, когда вы доберетесь до цифр и других символов, я получу имя необработанного ключа, например «Alpha1» для горизонтальной клавиши «1» над клавишей «Q», «Alpha2» для «2» над «W» и т. д.

Есть ли способ легко получить «рендеринговый» текст из ключевых событий без создания переключателя всех возможных результатов кода клавиши?

PS: я забыл упомянуть, что Shift+Alpha1 это "!" в US Querty shift+Alpha2 — это «@» и т. д., но они будут отличаться в клавиатурах разных стран, и невозможно сделать операторы переключения для каждой клавиатуры в мире.


person Joao Carlos    schedule 21.10.2015    source источник
comment
Я не думаю, что в Unity есть способ делать то, что вы хотите, — он просто не знает о локализованных раскладках. Они реализовали аналогичный оператор switch в своем собственном коде пользовательского интерфейса, и вы можете видеть, как они добавляют текст в поле ввода, начиная со строки 844 bitbucket.org/Unity-Technologies/ui/src/< /а>   -  person peterept    schedule 21.10.2015
comment
В строке 972 они фактически получают из нее символ. Но у меня почему-то всегда пусто.   -  person Joao Carlos    schedule 21.10.2015


Ответы (1)


Это неправильный ответ!!!

Оставить его здесь, чтобы помочь в дальнейших исследованиях или помочь кому-то выйти из затруднительного положения.

Только для клавиатур US Querty это пока работает, пока кто-нибудь не ответит правильным ответом:

public static char ToChar (this Event e)
{
    var key = e.keyCode;
    char c = '\0';
    if ((key >= KeyCode.A) && (key <= KeyCode.Z)) 
        return (char)((int)((e.shift || e.capsLock) ? 'A' : 'a') + (int)(key - KeyCode.A));
    if ((key >= KeyCode.Alpha0) && (key <= KeyCode.Alpha9)) {
        if (e.shift) {
            var specials = new char[] {'!', '@', '#', '$', '%', '^', '&', '*', '(', ')'};
            return specials [(int)(key - KeyCode.Alpha0)];
        }
        return (char)((int)'0' + (int)(key - KeyCode.Alpha0));
    }
    if (key == KeyCode.Space)
        return ' ';
    if (key == KeyCode.Quote)
        return (e.shift) ? '"' : '\'';
    if (key == KeyCode.LeftBracket)
        return (e.shift) ? '{' : '[';
    if (key == KeyCode.RightBracket)
        return (e.shift) ? '}' : ']';
    if (key == KeyCode.BackQuote)
        return (e.shift) ? '~' : '`';
    if (key == KeyCode.Backslash)
        return (e.shift) ? '|' : '\\';
    if (key == KeyCode.Equals)
        return (e.shift) ? '+' : '=';
    if (key == KeyCode.Minus)
        return (e.shift) ? '_' : '-';
    if (key == KeyCode.Semicolon)
        return (e.shift) ? ':' : ';';


    if (key == KeyCode.Comma)
        return (e.shift) ? '<' : ',';
    if (key == KeyCode.Period)
        return (e.shift) ? '>' : '.';
    if (key == KeyCode.Slash)
        return (e.shift) ? '?' : '/';


    // implement more
    return c;
}
person Joao Carlos    schedule 21.10.2015
comment
Alpha0 должен сопоставляться с ')'. { ')', '!', '@', '#', '$', '%', '^', '&', '*', '(' } - person NTj; 12.07.2021