Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

Unityでキーボードによるゲーム操作

Input.GetKey

ほとんどのプログラミング例にはこのInput.GetKeyが使われてます。
たとえばこんな感じ。

float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical");

WASDと↑←↓→キー両方どちらの入力も取得してくれてます。
これはHorizontalが水平、つまり左右。
Verticalが上下の入力ですね。

問題点

2DSTGを作ろうとしてて気づいたのが、入力が貯まるということ。
テストプレイをして、自機が滑るような、あるいは慣性がついているような?キーを離したのにまだ少し動くという現象がありました。
Rigidbodyのせいかとも思ったのですが、最終的にRigidbodyを外してもやはり滑る。
そこでキー入力自体を検証していたら、キーボードの入力がある程度貯まるということに気が付きました。
キーボードを押しっぱなしにしている間に連射のように入力が蓄積されていくんですね。

解決

キーが下がった時とキーが上がった時をきちんと判定したら問題なく滑らなくなりました。

        if((Input.GetKeyDown(KeyCode.A)) || (Input.GetKeyDown(KeyCode.LeftArrow)))
        {
            x1 =  -1;
        }
        if ((Input.GetKeyDown(KeyCode.D)) || (Input.GetKeyDown(KeyCode.RightArrow)))
        {
            x2 =  1;
        }
        if ((Input.GetKeyDown(KeyCode.W)) || (Input.GetKeyDown(KeyCode.UpArrow)))
        {
            y1 = 1;
        }
        if ((Input.GetKeyDown(KeyCode.S)) || (Input.GetKeyDown(KeyCode.DownArrow)))
        {
            y2 = -1;
        }

        if ((Input.GetKeyUp(KeyCode.A)) || (Input.GetKeyUp(KeyCode.LeftArrow)))
        {
            x1 = 0;
        }
        if ((Input.GetKeyUp(KeyCode.D)) || (Input.GetKeyUp(KeyCode.RightArrow)))
        {
            x2 = 0;
        }
        if ((Input.GetKeyUp(KeyCode.W)) || (Input.GetKeyUp(KeyCode.UpArrow)))
        {
            y1 = 0;
        }
        if ((Input.GetKeyUp(KeyCode.S)) || (Input.GetKeyUp(KeyCode.DownArrow)))
        {
            y2 = 0;
        }


        float x = x1 + x2;
        float y = y1 + y2;

もっとうまい書き方もあるかと思いますが、こういう理屈なのだということが参考になればと思います。
(移動の左右切り替えのときに引っかかるような感じがした(おそらく右キーを離すのと左キーを押すのがほぼ同時の時に判定がおかしくなる)ので、コードの例を修正しました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?