Unity 6の2DでA/Dキーを使って左右に移動する方法(Input SystemのKeyboard.current)
この記事は「Unity 6 2D移動の総合ガイド」の一部です。前の記事では、オブジェクトを自動で右へ動かしました。今回は、プレイヤーがキーで操作する基本の移動を作ります。
この記事で分かること
- Input Systemの
Keyboard.currentでキー入力を読み取る方法 - 移動方向を数値(-1、0、1)で表す考え方
- キーを離したときに停止する仕組み
1. 完成する動き
- Aキーを押すと左へ移動する
- Dキーを押すと右へ移動する
- キーを離すと停止する
2. 前提と準備
共通の準備は総合ガイドの「共通の準備」をご覧ください。この記事では、特に次の2点を確認してください。
- Package Managerで
Input Systemがインストールされている - 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. 練習問題
- 矢印キー(← →)でも移動できるようにしてみましょう
- 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方向に移動します。











ディスカッション
コメント一覧
まだ、コメントがありません