Определение количества нажатых клавиш Unity C#

#c# #visual-studio #unity3d #game-development

#c# #visual-studio #unity3d #разработка игр

Вопрос:

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

Например, что-то вроде:

 If(numberOfKeysDown > 1)
 

или что-то в этом роде?

Я знаю, что вы можете подсчитывать касания, если работаете с мобильными устройствами, но я не уверен насчет клавиш. Спасибо, что уделили мне время!

Комментарии:

1. Хотя это дало мне некоторую новую информацию о событиях, это звучит так, как будто вы просите помощи в обходном пути, а не о реальной проблеме плохого движения. Может быть, мы могли бы помочь вам и с этим тоже? (в другом вопросе).

Ответ №1:

Если вы просто хотите на самом деле проверить то, что вы сказали, этого должно быть достаточно для проверки Input.anyKey

Удерживается ли в данный момент какая-либо клавиша или кнопка мыши

 if(Input.anyKey)
 

Если вы хотите проверить определенные ключи, вы можете использовать Input.GetKey и Linq Count , например, например

 // Fancy queries ;)
using System.Linq;

...

// The keycodes you wan to check
private HashSet<KeyCode> keysToCheck = { KeyCode.W, KeyCode.A, KeyCode.S, KeyCode.D };

int numberOfKeysPressed;

private void Update ()
{
    numberOfKeysPressed = keysToCheck.Count(key => Input.GetKey(key));
    // This basically equals doing 
    // var numberOfKeysPressed = 0;
    // foreach(var key in KeyToCheck)
    //{
    //    if(Input.GetKey(key)) numberOfKeysPressed  ;
    //}
}
 

Или вы могли бы использовать Input.GetKeyDown и Input.GetKeyUp и сделать что-то вроде

 private HashSet<KeyCode> keysToCheck = { KeyCode.W, KeyCode.A, KeyCode.S, KeyCode.D };

int numberOfKeysPressed;

private void Update ()
{
    foreach (var key in KeyToCheck)
    {
        if(Input.GetKeyDown(key)) numberOfKeysPressed  ;

        if(Input.GetKeyUp(key)) numberOfKeysPressed--;
    }
}
 

Если вам нужны все KeyCode значения, которые вы могли бы использовать

 private void Awake ()
{
    keysToCheck = new HashSet<KeyCode>((KeyCode[])Enum.GetValues(typeof(KeyCode)));
}
 

Если вы действительно хотите получить количество нажатий любых клавиш на клавиатуре, вероятно, было бы более эффективно напрямую использовать Event.current и делать что-то вроде

 HashSet<string> currentlyPressedKeys = new HashSet<string>();

void OnGUI () 
{
    Event e = Event.current;
    switch(e.type)
    {
        case EventType.KeyDown:
            var key = e.keyCode.ToString();
            if(!currentlyPressedKeys.Contains(key)) currentlypressedKeys.Add(key);
            break;

        case EventType.KeyUp:
            var key = e.keyCode.ToString();
            if(currentlyPressedKeys.Contains(key)) currentlypressedKeys.Remove(key);
            break;
    }
}
 

Теперь везде, где вам нужно знать, вы можете сделать, например,

 if(currentlyPressedKeys.Count > XY)
 

Ответ №2:

Я не думаю, что для этого есть конкретный метод.

Однако вы можете написать свой собственный метод счетчика, используя Input.GetKeyDown .

Вот так

 int GetKeysDownCount() {
    var keysDown = 0;
    if(Input.GetKeyDown(KeyCode.W)
        keysDown  ;
    if(Input.GetKeyDown(KeyCode.A)
        keysDown  ;
    if(Input.GetKeyDown(KeyCode.S)
        keysDown  ;
    if(Input.GetKeyDown(KeyCode.D)
        keysDown  ;
    return keysDown;
}
 

https://docs.unity3d.com/ScriptReference/Input .GetKeyDown.html

Комментарии:

1. Что, если на клавиатуре больше клавиш, чем только WASD? ^^

2. Хорошо сыграно, ваше решение намного превосходит мое XD