yo_s1124
@yo_s1124

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Unityでキーを同時入力した際の挙動について

最近、Unityで2Dゲームの制作を始めました。簡単なものを1つ完成させ、2本目の制作に着手したのですが、移動の為にキーを複数同時入力した際、以下の条件でプレイヤーを動かしたかったのですが、1作目と同じ方法である if(Input.GetKey()) による移動を用いると条件が満たせないことに気付きました。自力ではどうしても解決手段が思いつきませんでしたので知恵をお貸しいただけませんでしょうか?

【条件】
・複数の移動キーを同時入力した際、先に入力されていたキーを無効化して後に入力されたキーの移動のみを有効化する
・↑の条件で後に入力されたキーを離した時、先に入力されたキーの移動を再度有効化する

0

2Answer

以下のようなやり方はいかがでしょうか?
課題の解釈の誤りやご不明な点などあればお尋ねください。

課題

  • 押されたキーに優先順位を付けて、一度にひとつだけを有効にする
  • 後から押されたキーほど優先順位が高い
  • キーが押され続けていれば順位に残り、押されなくなったら順位から消える

構想

  • キーが押されたらリストにキーを加える
    • キーダウンをトリガーにする
  • 押されなくなったらリストからキーを消す
    • キーアップをトリガーにする
  • リストには、押され続けているキーが、押されたのが古いものから順に並ぶ
  • リストの最後が、最優先のキーになる
1Like

質問に回答いただきありがとうございます!
課題はその解釈で合っています。頂いた構想を元にスクリプトを作成したところ、想定通りの動作をすることができました。本当にありがとうございました。
後学の為に作成したスクリプトを記載します。拙いですが同じ悩みを抱えた方の解決の手助けになれば幸いです。

PlayerController
public class PlayerController : MonoBehaviour
{
    List<string> KeyInputList = new List<string>(); //リストを初期化
    
    
    void Start()
    {
        //リストが空の時、[KeyInputList.Count - 1]で値が-になるためダミーの値を追加
        KeyInputList.Add("None"); 
    }
    void Update()
    {
        //押されたキーをリストに追加
        if(Input.GetKeyDown(KeyCode.RightArrow))
        {
            KeyInputList.Add("Right");
        }
        if(Input.GetKeyDown(KeyCode.LeftArrow))
        {
            KeyInputList.Add("Left");
        }
        if(Input.GetKeyDown(KeyCode.UpArrow))
        {
            KeyInputList.Add("Up");
        }
        if(Input.GetKeyDown(KeyCode.DownArrow))
        {
            KeyInputList.Add("Down");
        }

        //離されたキーをリストから削除
        if(Input.GetKeyUp(KeyCode.RightArrow))
        {
            KeyInputList.Remove("Right");
        }
        if(Input.GetKeyUp(KeyCode.LeftArrow))
        {
            KeyInputList.Remove("Left");
        }
        if(Input.GetKeyUp(KeyCode.UpArrow))
        {
            KeyInputList.Remove("Up");
        }
        if(Input.GetKeyUp(KeyCode.DownArrow))
        {
            KeyInputList.Remove("Down");
        }

        string latestKey = KeyInputList[KeyInputList.Count - 1]; //リストの末尾の要素を取得

        //リストから取得した要素に応じてキー入力を実行する
        if(latestKey == "Right") 
        {
            transform.Translate(0.1f,0,0);
        }
        else if(latestKey == "Left")
        {
            transform.Translate(-0.1f,0,0);
        }
        else if(latestKey == "Up")
        {
            transform.Translate(0,0.1f,0);
        }
        else if(latestKey == "Down")
        {
            transform.Translate(0,-0.1f,0);
        }

    }
}
1Like

Your answer might help someone💌