输入只存储两个值?

时间:2016-08-11 19:48:43

标签: c# unity3d input visual-studio-2015 keycode

当按两个键然后按第三个键时,所有都没有释放,Input.GetKeyDown不知道第三个键已被按下。

这是我的代码:

public class Keys
    {
        internal bool leftPressed = false;
        internal bool rightPressed = false;
        internal bool upPressed = false;
        internal bool downPressed = false;
    }

    public Keys keys = new Keys();

    void Start () {
    }

    void Update ()
    {
        updateButton(KeyCode.LeftArrow);
        updateButton(KeyCode.RightArrow);
        updateButton(KeyCode.UpArrow);
        updateButton(KeyCode.DownArrow);
    }

    void updateButton(KeyCode key)
    {
        if (Input.GetKeyDown(key))
        {
            if (key == KeyCode.LeftArrow)
                keys.leftPressed = true;
            if (key == KeyCode.RightArrow)
                keys.rightPressed = true;
            if (key == KeyCode.UpArrow)
                keys.upPressed = true;
            if (key == KeyCode.DownArrow)
                keys.downPressed = true;
        }
        else if (Input.GetKeyUp(key))
        {
            if (key == KeyCode.LeftArrow)
                keys.leftPressed = false;
            if (key == KeyCode.RightArrow)
                keys.rightPressed = false;
            if (key == KeyCode.UpArrow)
                keys.upPressed = false;
            if (key == KeyCode.DownArrow)
                keys.downPressed = false;
        }
    }

我想要做的就是让一个玩家类在按下按键时移动游戏对象。如果两个方向都被按下,他们将相互取消并将玩家的速度设置为0。

同时向左和向右击打,但尝试向上或向下按下并不会改变此时的向上或向下值。好像Input.GetKeyDown只包含2个值而不是整个键盘键状态?

注意:即使按下键盘上的两个随机键,也会因更改值而向左,向下,向上或向右停止。

有没有人对我的代码有任何建议或解决方法? 谢谢,

2 个答案:

答案 0 :(得分:4)

除非我遗漏了某些内容,否则您最好使用built in axes system. 此外,您的键盘可能不会同时支持两个以上的键。 如果密钥关闭,GetKeyDown也不会返回,如果它在最后一帧被按下则会返回:https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html

如果您不想使用轴系统,您希望Input.GetKey获取当前状态键。

答案 1 :(得分:0)

void Start() 
{
    StartCoroutine(crMoveIt());
}

private IEnumerator crMoveIt() 
{
    while(true) // have a bool var for this
    {
        if(Input.GetKeyDown(KeyCode.A)) 
        {
            // Move object here
        }
        yield return null;
    }
}

要移动对象的位置,请参阅此

https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html

或者,如果您使用的是刚体,请阅读

https://docs.unity3d.com/ScriptReference/Rigidbody.html

不是传入一个键码来检查每一帧,只需要一个协程处理输入,然后在每帧之后调用一些东西。协程将执行与更新相同的操作,但您可以使用其中一些运行而不只是一个Update()方法。

我会为对象的移动编写更多代码,但是在示例中没有提供对任何GameObject的引用。我不久前回答了一个问题,它显示了如何以不同的方式移动对象,而不使用Vector3.MoveTowards()这里

Unity; Random Object Movement

希望这会有所帮助。编辑,忘记了什么。 =)