[英]Get input from two keys in unity
在我的代码中,我试图检测是单独按下键还是按下组合键,例如“ A”。 对于每个我都有不同的if语句。 但是当我将它们压在一起时,会发生一些奇怪的事情。 我认为问题与Input.Getkey
有关,当我尝试使用Input.GeyKeyDown
时,几乎无法同时按下它们。 如何改善我的代码?
这似乎是一个普遍的问题,但我无法理解。 我希望我的变换在仅按下A时移动到不同的位置,而在结合W或S按下A时移动到另一个不同的位置。我想要的结果在图像中。 当我单击a && w时,会在这样的范围之间生成一个随机Vector3:
new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(4.5f, 6f));
生成随机位置效果很好,但是唯一的问题是当我尝试按组合键时,首先运行
if (Input.GetKeyUp(KeyCode.W))
{
activePos = new Vector3(Random.Range(0.95f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
然后这个
if (Input.GetKey(KeyCode.A) || (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.A)))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(2f, 4.5f));
return activePos;
}
和这个
if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
而我只希望最后一个运行。 我只想在w && a按下时运行此代码
if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
这是完整的方法:
public static Vector3 GetTargetPosition()
{
/*
* near z = 1 - 2.5, key = s
* center z = 2 - 4.5, key = q
* far z = 4.5 - 6, key = w
* very far possibly outside z = 6 - 7.5
* left x = (-2.7) to -0.95, key = a
* center x = -0.95 to 0.95, key = q
* right x = 0.95 to 2.7, key = d
*/
if (Input.GetKeyUp(KeyCode.S))
{
activePos = new Vector3(Random.Range(0.95f, -0.95f), 0, Random.Range(1f, 2.5f));
return activePos;
}
else if (Input.GetKeyUp(KeyCode.W))
{
activePos = new Vector3(Random.Range(0.95f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
else if (Input.GetKeyUp(KeyCode.Q))
{
activePos = new Vector3(Random.Range(0.95f, -0.95f), 0, Random.Range(2f, 4.5f));
return activePos;
}
else if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.A))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(1f, 2.5f));
return activePos;
}
else if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.D))
{
activePos = new Vector3(Random.Range(0.95f, 2.7f), 0, Random.Range(1f, 2.5f));
return activePos;
}
else if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
else if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.D))
{
activePos = new Vector3(Random.Range(0.95f, 2.7f), 0, Random.Range(4.5f, 6f));
return activePos;
}
else if (Input.GetKey(KeyCode.A) || (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.A)))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(2f, 4.5f));
return activePos;
}
else if (Input.GetKey(KeyCode.D) || (Input.GetKey(KeyCode.Q) && Input.GetKey(KeyCode.D)))
{
activePos = new Vector3(Random.Range(0.95f, 2.7f), 0, Random.Range(2f, 4.5f));
return activePos;
}
else
{
return new Vector3(0, 0, 0);
}
}
我假设将在每帧执行的Update()函数中调用此函数。
当同时按下两个键时,您不必使用逻辑和A && B,只需分别定义A和B的情况,当两者都被调用时,更改将被顺序地应用,但速度非常快,因此快速,没有人能够检测到这样的序列,可以满足您的要求。
if (Input.GetKeyUp(KeyCode.A)) {...}
if (Input.GetKeyUp(KeyCode.B)) {...}
// if (Input.GetKeyUp(KeyCode.A) && Input.GetKeyUp(KeyCode.A)) {...} //Avoid this!
更新:
if (Input.GetKeyUp(KeyCode.A)) {
activePos += ... //Let activePos to be class level variable, no need to return;
}
问题不在于
如果(Input.GetKey(KeyCode.W)&& Input.GetKey(KeyCode.A))
因为这对您尝试做的事情是完全好的。
问题在于您正在使用许多if-else语句。
您的代码按顺序运行,即从上到下。 如果您同时按下A和W键,它将遍历您的代码,并且找到的第一个匹配项将是
否则if(Input.GetKeyUp(KeyCode.W)){activePos = new Vector3(Random.Range(0.95f,-0.95f),0,Random.Range(4.5f,6f));
return activePos; }
因为您确实按了W,所以它将在if语句中执行代码,并打破所有其他情况。 永不到达
else if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
activePos = new Vector3(Random.Range(-2.7f, -0.95f), 0, Random.Range(4.5f, 6f));
return activePos;
}
您可以通过多种方法解决此问题,每种方法各有利弊。
我个人可能会做的就是嵌套您的if语句。 这意味着您将首先检查是否按下了键A,并且在if语句中可以再次检查是否也按下了W,例如:
if(Input.GetKey(KeyCode.A)) { //some logic goes here for when A is pressed if(Input.GetKey(KeyCode.W)) { //some logic for when both A and W are pressed } }
这样做的好处是,您可以在同一if语句中同时进行A和W检查。
或者您可以执行以下操作:
if(Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))
{
//logic for both A And W pressed
}
if(Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.A))
{
//by checking if A is NOT pressed you will prevent this code from
//running if you press both A and W
//Logic for just W pressed
}
简而言之; 放弃整个if-else结构,并坚持使用if,如果出于某种原因,您真的想坚持使用if-else结构,则可以颠倒您检查所有内容的顺序(例如,检查是否按了两次按键)首先,然后按下单个键,因为在第一个肯定的命中之后您退出了if-else),但我不建议您使用这种方法。
您也不必返回活动位置。 只需将其设置为= new Vector3就可以了!
抱歉,如果帖子的格式有点乱,请从手机快速输入!
您可以尝试在每次按键时设置一个值,因此当您按下a键时,它会设置bool a = true
。 然后,您可以检查if (a && d)
还是类似的东西。
试试这个:
if ((Input.GetKey(KeyCode.S) && Input.GetKeyUp(KeyCode.Q)) || (Input.GetKey(KeyCode.Q) && Input.GetKeyUp(KeyCode.S)))
{
DoCode();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.