【发布时间】:2018-03-21 17:05:58
【问题描述】:
在我的代码中,我试图检测一个键(例如“A”)是单独按下还是组合按下。我对每个都有不同的 if 语句。但是当我把它们压在一起时,会发生一些奇怪的事情。我认为问题与Input.Getkey 有关,当我尝试使用Input.GeyKeyDown 时,几乎不可能同时按下它们。如何改进我的代码?
这似乎是一个常见问题,但我无法理解。我希望我的变换在仅按下 A 时移动到不同的位置,并在按下 A 和 W 或 S 时移动到另一个不同的位置。我想要的结果在图像中。当我单击 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);
}
}
【问题讨论】:
-
注意:if/else 语句选择第一个匹配选项,而不是最佳匹配选项。它总是在有机会匹配 S&&A 或 S&&D 之前匹配 S。
-
关闭对话框中的模糊:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example。