Unity 6の2DでA/Dキーを使って左右に移動する方法(Input SystemのKeyboard.current)

広告

この記事は「Unity 6 2D移動の総合ガイド」の一部です。前の記事では、オブジェクトを自動で右へ動かしました。今回は、プレイヤーがキーで操作する基本の移動を作ります。

この記事で分かること

  • Input SystemのKeyboard.currentでキー入力を読み取る方法
  • 移動方向を数値(-1、0、1)で表す考え方
  • キーを離したときに停止する仕組み

1. 完成する動き

  • Aキーを押すと左へ移動する
  • Dキーを押すと右へ移動する
  • キーを離すと停止する
A・Dキーで四角いオブジェクトが左右に移動し、キーを離すとその場で止まる動作

2. 前提と準備

共通の準備は総合ガイドの「共通の準備」をご覧ください。この記事では、特に次の2点を確認してください。

  1. Package ManagerでInput Systemがインストールされている
  2. Project Settings → Player → Active Input Handling が「Input System Package (New)」または「Both」になっている

ここが合っていないと、Keyboard.currentの部分でエラーになります。Input Systemの基本はこちらの記事もご覧ください。

このシリーズでは、従来のInput.GetAxis()やInput.GetKey()は使いません。

3. スクリプトを作る

HorizontalMoveという名前でスクリプトを作り、Playerに取り付けます。この記事もTransformを直接動かす方法なので、Rigidbody 2Dは不要です。前の記事のAutoMoveが付いている場合は、取り外してください。

HorizontalMove.cs

using UnityEngine;
using UnityEngine.InputSystem;

public class HorizontalMove : MonoBehaviour
{
    [SerializeField] float speed = 5f;

    void Update()
    {
        float moveX = 0f;

        if (Keyboard.current == null)
            return;

        if (Keyboard.current.aKey.isPressed)
        {
            moveX = -1f;
        }

        if (Keyboard.current.dKey.isPressed)
        {
            moveX = 1f;
        }

        Vector3 movement = new Vector3(moveX, 0, 0);

        transform.position += movement
                            * speed
                            * Time.deltaTime;
    }
}

4. コードの解説

① using UnityEngine.InputSystem;

Input Systemの機能を使うための記述です。これがあると、KeyboardやMouseを使えるようになります。

② float moveX = 0f;

左右どちらに動くかを表す変数です。最初は0(動かない)にしておき、キーが押されたときだけ値を変えます。

この行をUpdateの中に書いている点にも注目してください。毎フレーム最初に0に戻すので、キーを離すと自動的に停止します。

③ if (Keyboard.current == null) return;

キーボードが接続されていないとき、Keyboard.currentはnull(何もない)になります。そのまま使うとエラーになるため、先にチェックして、無い場合は処理を打ち切る(return)ようにしています。

④ Keyboard.current.aKey.isPressed

Aキーが押されている間ずっとtrueになります。押しっぱなしで移動し続けたいときに適しています。

似たプロパティとしてwasPressedThisFrame(押されたフレームだけtrue)があり、ジャンプなどで使います。こちらは後の記事で解説します。

⑤ 移動方向を数値で表す

moveX動作
-1左へ移動
0停止
1右へ移動

このように移動方向を数値で表現することが、ゲームプログラミングの基本です。この値をspeedとTime.deltaTimeに掛けると、前の記事と同じように移動量が決まります。

なお、このサンプルではAとDを同時に押すと、後から判定したDキーが優先されます。

5. よくあるつまずき

症状確認すること
Keyboardでエラーが出るusing UnityEngine.InputSystem;があるか。Input Systemパッケージが入っているか
キーを押しても動かないActive Input Handlingの設定。Gameビューをクリックしてフォーカスを当てているか
勝手に右へ動く前の記事のAutoMoveが取り付いたままになっていないか
動きが速すぎる・遅すぎるInspectorでSpeedを調整する

6. 練習問題

  1. 矢印キー(← →)でも移動できるようにしてみましょう
  2. AとDを同時に押したときは、停止するようにしてみましょう

ヒント

  • 矢印キーはleftArrowKeyとrightArrowKeyです。入力ボックスでKeyboard.current.と打つと、候補が表示されます。
  • 2つ目は、moveX = -1f;のように代入するのではなく、moveX -= 1f;とmoveX += 1f;を使うとどうなりますか。

解答例(まず自分で試してから見ましょう)

void Update()
{
    if (Keyboard.current == null)
        return;

    float moveX = 0f;

    if (Keyboard.current.aKey.isPressed ||
        Keyboard.current.leftArrowKey.isPressed)
    {
        moveX -= 1f;
    }

    if (Keyboard.current.dKey.isPressed ||
        Keyboard.current.rightArrowKey.isPressed)
    {
        moveX += 1f;
    }

    transform.position += new Vector3(moveX, 0, 0)
                        * speed
                        * Time.deltaTime;
}

この書き方では、左右を同時に押すと-1と+1が打ち消し合い、moveXが0になって停止します。

7. まとめ

  • using UnityEngine.InputSystem;を書くと、Keyboard.currentでキー入力を読み取れる
  • isPressedはキーを押している間ずっとtrueになる
  • 移動方向を-1、0、1で表し、speedとTime.deltaTimeを掛けて動かす
  • キーボードがない場合に備えて、nullチェックをする

次の記事では、上下も加えて8方向に移動します。

訪問数 2 回, 今日の訪問数 2回

広告