我正尝试着创造一个基于网格的移动系统,但我发现了一个漏洞,即当玩家输入多个输入时,他们将移动一个奇怪的数量。是否有一种方法可以检测键盘上有多少个键被按下?
例如:
If(numberOfKeysDown > 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)));
}
如果您真的想获得any的数量直接使用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)
我认为这没有特定的方法。
你也可以使用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