#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