繁体   English   中英

统一获得两个键的输入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM