Получите любой ввод с клавиатуры и используйте с оператором Switch на Unity - PullRequest
1 голос
/ 30 мая 2019

Я не хочу использовать оператор if. Для простоты и производительности я хочу использовать регистр переключения и выполнить этот метод. Я хочу, чтобы весь ввод с клавиатуры был обнаружен. Но есть ли способ передать любую информацию о нажатии клавиши? Мой текущий подход:

// Update is called once per frame
void Update()
{
    char a = Input.GetKey();//anything like this method?
    switch (a)
    {
        case 'a':
                //print'';
                break;
        case 'b':
                //print'';
                break;
        default:
            break;
    }

}

Как я могу добиться этого при любом обнаружении нажатия клавиши без оператора if?

Ответы [ 3 ]

1 голос
/ 30 мая 2019
foreach(KeyCode kcode in Enum.GetValues(typeof(KeyCode)))
{
    if (Input.GetKey(kcode))
    Debug.Log("KeyCode down: " + kcode);
}

Также вы можете кэшировать значение Enum.GetValues ​​(typeof (KeyCode)) для оптимизации.

1 голос
/ 30 мая 2019

Я не использовал Unity, однако я понимаю вашу проблему и являюсь разработчиком на C #.

По результатам быстрого поиска я нашел кого-то на форумах Unity с такой же проблемой, как у вас.Вот тема https://answers.unity.com/questions/1520939/check-if-there-is-a-keyboard-input.html.

if (Input.anyKeyDown)
 {
     Event e = Event.current;
     if (e.isKey)
     {
         Debug.Log("Current Key is : " + e.keyCode.ToString());
     }
 }

Приведенный выше код (по ссылке на форуме Unity) позволяет обнаружить input.anyKeyDown (клавиатура и мышь).Затем вы можете отфильтровать обнаружение мыши, проверив, был ли ввод только вводом с клавиатуры с e.isKey

Вот документация для KeyCode .Сюда также входят все доступные ему свойства (многие связанные с клавиатурой свойства, с которыми вы можете проверять).

Например (не проверено):

Event e = Event.current;
if (e.isKey)
{
    Debug.Log("Current Key is : " + e.keyCode.ToString());

    if(e.keyCode == KeyCode.A) //checks if the keycode returned equals the 'A' key
    {
         // Do something
    }
}

РЕДАКТИРОВАТЬ: Как указано вдругой ответ вы можете попробовать Input.inputString .Согласно документации insputString содержит «Только символы ASCII».Так, например, вы могли бы сделать что-то подобное в методе «Обновление», если буквы были тем, что вы только хотели проверить.

void Update()
{
    //get the input
    var input = Input.inputString;

    //ignore null input to avoid unnecessary computation
    if (!string.IsNullOrEmpty(input))
    {
        switch(input)
        {
            case 'a': break;
            case 'b': break;
        }
    }
}

Надеюсь, это поможет.

0 голосов
/ 30 мая 2019

Лучшее решение - использовать Input.inputString

Если вы хотите перехватить ввод как строку, используйте Input.inputString . Он вернет ввод с клавиатуры, введенный в этот кадр в виде строки .

Это самый простой способ, если вы хотите просто получить символ или строку.

void Update()
{
    //get the input
    var input = Input.inputString;
    //ignore null input to avoid unnecessary computation
    if (!string.IsNullOrEmpty(input))
        //logic related to the char pressed
        Debug.Log("Pressed char: " + Input.inputString);
}

Другие решения

* 1016 цикл просмотра * Этот цикл foreach работает, но он менее производительный. Требуется цикл foreach, который каждый раз выделяет память и должен проверять все возможные ключи.

Чтение этого ответа вы также можете увидеть, что вы можете создать интерфейс, используя тот же метод, аналогично Event System .


OnGUI

Вы можете перехватить Event.current (то есть UnityGUI Event ), как объяснено в этого ответа , но при этом вы будете полагаться на OnGUI метод. Этот метод имеет очень низкую производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...