【问题标题】:Input only stores two values?输入只存储两个值?
【发布时间】:2016-08-11 19:48:43
【问题描述】:

当按下两个键然后再按下第三个键时,都没有释放,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 个值而不是整个键盘键状态?

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

有人对我的代码有建议或修复吗? 谢谢,

【问题讨论】:

  • 我知道代码没有优化,我将其作为一个小的副项目来做,以便在我进行时进行优化和优化。

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


【解决方案1】:

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

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

【讨论】:

  • 实际上,我似乎可以按向左,向右然后向下按,但不能向上。这让我很困惑。
  • 这正是我想知道的。谢谢你。现在,如果您知道一种应对重影键的方法,那将非常有帮助,但从简短的阅读来看,不幸的是它在硬件方面并且有软件方面的修复,对吗?
  • 至少,您的链接是我认为正在发生的事情的原因。 (键盘重影)
  • 我不确定它是否是为了对抗键重影,但轴系统是为统一控制运动而设计的,所以我会尝试一下。这是一些用于控制 Rigidbody2D 的示例代码,如果它有帮助的话void FixedUpdate() { Vector2 newvel; newvel = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")); if (newvel.magnitude > 1.0f) { newvel = newvel.normalized; } newvel *= moveSpeed; GetComponent<Rigidbody2D>().velocity = newvel; }
【解决方案2】:
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 执行相同的操作,但您可以运行其中的几个而不是仅运行一个 Update() 方法。

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

Unity; Random Object Movement

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

【讨论】:

  • 1. 这将冻结 Unity/Game,除非将 yield return null; 添加到 while 循环中。 2.这不回答问题。我想你应该再读一遍。它说明了在多次按键时丢弃结果.....
  • 大声笑,如果您阅读了我的回答,我提到我没有将代码放在那里,因为没有对对象的引用。此外,我想我确实回答了这个问题。老实说,他处理这件事的方式太过分了。他不需要那里的一半东西。此外,它是一个测试项目。让它冻结,让他找出原因。从错误中学习是最好的。最后,你的主要观点是我遗漏了一个收益声明,因为我在没有 Unity 的情况下做了这件事,很重要。如果处理方式不同,他就不需要丢弃结果。只是我的观点。 =)
  • 大不了?是的,这个答案将冻结 Unity。无论如何,我建议你再读一遍这个问题。如果按下多个键,他不想移动东西。只需阅读它,然后修正你的答案。
  • 我想在按左、右、上或下时移动游戏对象。我遇到的问题是,当我同时按下左、右和上时,统一只能理解为好像我按下了左和右。 Unity不明白我也按下了。我认为应该这样做。
  • 只是一个想法,而不是追求别人的答案,你为什么不提供自己的答案?我建议你再读一遍,包括我的回答。如果他不想要多个输入,他只需要一个关键字。 msdn.microsoft.com/en-us/library/923ahwt1.aspx 我想我可以在他的代码中使用该关键字,但我认为另一种方法会更好。无论如何,祝你有美好的一天=)如果你真的认为我的回答很糟糕,那么只需删除它或投反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2018-05-02
  • 2014-05-23
  • 2016-07-23
  • 1970-01-01
  • 2017-10-12
相关资源
最近更新 更多