2016-08-11 9 views
1

2つのキーを押してから3番目のキーを押すと、すべて解放されずに、Input.GetKeyDownは3番目のキーが押されたことを認識しません。入力には2つの値しか格納されませんか?

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

私はこのコードが最適化されていないことを知っています。私は楽しく最適化するための小さなプロジェクトとしてこれをやっています。 – Alox

答えて

4

私はそれはそう何かが欠けている場合を除き、使用したほうが良いでしょうのようbuilt in axes system. またキーボードがダウンして一度に二つ以上のキーをサポートしていない可能性があります。 https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html

あなたは軸のシステムを使用しない場合Input.GetKeyキー現在の状態を取得したい:キーは、それが最後のフレーム押し下げられた場合、それが返すダウンしている場合 またGetKeyDownは戻りません。あなたがオブジェクトを移動したい

+0

実際には、私は左、右を押してから、作品を押しても上を向けることはできないようです。それは私にとって非常に混乱しています。 – Alox

+1

おそらく、これは役に立ちます:https://www.microsoft.com/appliedsciences/antighostingexplained.mspx –

+0

これは私が知りたかったものです。ありがとうございました。 ゴースト鍵に対抗する方法が分かっていれば、それは助けになるだろうが、その簡単な説明から、残念ながらハードウェア側にあり、ソフトウェア側の修正権があるのだろうか? – Alox

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

それとも、剛体を使用している場合は代わりにAに渡すの

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

をお読みくださいを参照してくださいキーコードを使用して各フレームをチェックし、コルーチンが入力を処理してから、各フレームの後に何かを呼び出します。コルーチンはこれをUpdateと同じように行いますが、これらのうちのいくつかを、Update()メソッドと対比して1つだけ持つことができます。

私はオブジェクトの移動のためのコードを書いていましたが、あなたの例ではGameObjectへの参照はありませんでした。私はオブジェクトにここVector3.MoveTowardsを(使用していない別の方法)

Unity; Random Object Movement

このことができます希望を移動する方法を示していないとずっと前の質問に答えました。編集、何かを忘れました。 =)

+0

1.' yield return null;が 'while'ループに追加されない限り、Unity/Gameをフリーズします。 2.これは質問に答えません。私はあなたがもう一度それを読むべきだと思います。 .....複数のキーを押すと結果が破棄されるというメッセージが表示されます..... – Programmer

+0

Lol、私の答えを読むと、オブジェクトへの参照がないため、そこにコードを置いていませんでした。さらに、私はその質問に答えると思う。正直なところ、彼がこれに近づく方法はトップです。彼はそこに半分のものは必要ない。さらに、そのテストプロジェクトです。それを凍らせて、彼に理由を見つけさせてください。間違って学習するのがベストです。最後に、あなたのここでの主なポイントは、ここでUnityを使わずに私の頭の上からこれをやってしまったので、私は歩留まり声明を出さなかったことです。そして、もしこれが異なって扱われれば、彼は結果を捨てる必要はないでしょう。ちょうど私の意見。 =) – TheNoob

+0

ビッグディール?はい、その答えはUnityをフリーズします。とにかく、もう一度質問を読むことをお勧めします。複数のキーが押された場合、彼はものを動かしたくありません。それを読んで答えを修正してください。 – Programmer

関連する問題