从两个键统一获取输入

时间:2018-03-21 06:19:20

标签: c# unity3d input

在我的代码中,我试图检测一个密钥,例如A' A'单独按压或按组合按压。我对每个都有不同的if语句。但当我把它们压在一起时,会发生奇怪的事情。我认为问题与XmlDocument doc = new XmlDocument(); doc.LoadXml(str); doc.Save("HL7.xml"); 有关,当我尝试使用Input.Getkey时,几乎不可能同时按下它们。如何改进我的代码?

这似乎是一个常见问题,但我无法理解。我希望我的变换在仅按A时移动到不同的位置,并且当A与W或S组合按下时,移动到另一个不同的位置。我想要的结果是在图像中。当我点击&& w然后在如下范围内生成随机Vector3:

Input.GeyKeyDown

生成随机位置非常有效,但唯一的问题是当我尝试按组合键时,首先运行

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;
    }

而我只希望最后一个运行。 我希望只有这个代码才能在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;
    }

enter image description here

这是完整的方法:

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;
        }

4 个答案:

答案 0 :(得分:1)

我假设这个函数将在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;
}

答案 1 :(得分:1)

问题不在于

  

if(Input.GetKey(KeyCode.W)&& Input.GetKey(KeyCode.A))

因为这对你想做的事情来说非常好。

问题在于你使用了很多if-else语句。

您的代码正在按顺序运行,这意味着从上到下。如果您同时按下A和W键,它将通过您的代码,它将找到的第一个匹配将是

  

else 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,但我不推荐这种方法。

你也不必返回活动的pos。只需使用= new Vector3进行设置就可以了!

如果帖子的格式有点混乱,请在移动设备上快速输入,这表示道歉!

答案 2 :(得分:0)

您可以尝试在每次按键时设置一个值,因此当您按下a键时,它会设置bool a = true。之后您可以查看if (a && d)或类似内容。

答案 3 :(得分:0)

试试这个:

if ((Input.GetKey(KeyCode.S) && Input.GetKeyUp(KeyCode.Q)) || (Input.GetKey(KeyCode.Q) && Input.GetKeyUp(KeyCode.S)))
{
    DoCode();
}