概要
ゲームとプレイヤーを繋ぐ最も重要なインターフェースが「入力」です。キーボードのキーが押されたこと、マウスがクリックされたこと、ゲームパッドのスティックが倒されたことを検知して、キャラクターを動かしたり、アクションを実行したりします。Unityには、これらの入力を簡単に扱うための仕組みが用意されています。
この記事では、Unityで古くから使われている標準のInput Managerを使った入力処理の方法を中心に、キーボード、マウス、そしてゲームパッドからの入力を受け取る具体的な方法を解説します。また、より高度で柔軟な入力管理を可能にする新しいInput Systemパッケージについても触れます。
Input Managerの基本
Unityの標準入力システムであるInput Managerは、Edit > Project Settings > Input Managerから設定を確認・変更できます。ここには、Horizontal, Vertical, Jump, Fire1といった、予め定義された「仮想軸(Virtual Axes)」がリストされています。
例えば、Horizontal軸には、キーボードのaとd、そして左右の矢印キーが割り当てられています。これにより、Input.GetAxis("Horizontal")という一つの命令で、これらのどのキーが押されても対応できるようになっています。この抽象化された軸を使うことで、プレイヤーがキーバインドを自由に変更できるような設定画面も作りやすくなります。
キーボード入力の取得
キーボードからの入力は、Inputクラスの様々なメソッドを使って取得します。
| メソッド | 説明 |
|---|---|
Input.GetKeyDown(KeyCode) | 指定したキーが押された瞬間にtrueを返す。ジャンプや射撃など、単発のアクションに最適。 |
Input.GetKey(KeyCode) | 指定したキーが押されている間、ずっとtrueを返す。押し続けることで加速するような移動処理に使う。 |
Input.GetKeyUp(KeyCode) | 指定したキーが離された瞬間にtrueを返す。溜め撃ちの解放などに使う。 |
KeyCodeは、キーボードの各キーを定義した列挙型です。(例: KeyCode.Space, KeyCode.W, KeyCode.Return)
using UnityEngine;
public class KeyboardInputExample : MonoBehaviour
{
void Update()
{
// スペースキーが押された瞬間にジャンプ
if (Input.GetKeyDown(KeyCode.Space))
{
Debug.Log("ジャンプ!");
}
// Rキーが押されている間、リロード中
if (Input.GetKey(KeyCode.R))
{
Debug.Log("リロード中...");
}
// Escapeキーが離された瞬間にポーズメニューを閉じる
if (Input.GetKeyUp(KeyCode.Escape))
{
Debug.Log("ポーズメニューを閉じる");
}
}
}
仮想軸による入力取得
特定のキーに縛られず、より柔軟な入力を扱うには仮想軸を使います。
Input.GetAxis(string axisName): 指定された軸の現在の値を返します。値は-1.0から1.0の間でスムーズに変化します。キーボードの場合は即座に-1, 0, 1のいずれかになりますが、ゲームパッドのスティックの場合は倒し具合によって中間値が返されます。Input.GetAxisRaw(string axisName):GetAxisと似ていますが、値をスムーズに変化させず、即座に-1, 0, 1のいずれかを返します。キビキビとした動きを実装したい場合に適しています。
using UnityEngine;
public class AxisInputExample : MonoBehaviour
{
public float speed = 10f;
void Update()
{
// "Horizontal"軸(A/Dキー、左右矢印キー)の値を取得
float horizontalInput = Input.GetAxis("Horizontal");
// 取得した入力値を使って左右に移動
transform.Translate(Vector3.right * horizontalInput * speed * Time.deltaTime);
}
}
マウス入力の取 得
マウスのクリックや位置もInputクラスで取得できます。
Input.GetMouseButtonDown(int button): マウスボタンが押された瞬間。0は左クリック、1は右クリック、2は中クリック。Input.GetMouseButton(int button): マウスボタンが押されている間。Input.GetMouseButtonUp(int button): マウスボタンが離された瞬間。Input.mousePosition: マウスカーソルのスクリーン座標(ピクセル単位)をVector3で返す。Z座標は常に0。
using UnityEngine;
public class MouseInputExample : MonoBehaviour
{
void Update()
{
// 左クリックされたら
if (Input.GetMouseButtonDown(0))
{
// マウスのスクリーン座標を取得
Vector3 mousePos = Input.mousePosition;
Debug.Log("左クリック! 座標: " + mousePos);
// スクリーン座標からRayを飛ばして3Dオブジェクトをクリックする処理などもここから行う
}
}
}
新しいInput Systemについて
ここまで紹介してきたInputクラスを使う方法は、直感的で分かりやすい反面、いくつかの欠点も抱えています。
- 入力処理のロジックが
Update関数内に散らばりやすい。 - 複数のデバイス(キーボード、ゲームパッド、タッチ)にまたがる複雑な入力を管理するのが難しい。
- プレイヤーが実行時(ゲームプレイ中)にキーバインドを変更する機能を実装するのが大変。
これらの問題を解決するために、Unityは新しいInput Systemパッケージを開発しました。これはPackage Managerからインストー ルして使用します。Input Systemはイベントベースのアプローチを採用しており、PlayerInputコンポーネントとInputActionアセットを使って、より構造化された形で入力を管理できます。
初心者にとっては少し学習コストが高いかもしれませんが、本格的なゲーム開発、特にマルチプラットフォーム対応や複雑な入力設定を必要とするプロジェクトでは、Input Systemの導入を検討する価値は非常に高いです。
まとめ
入力処理は、プレイヤーとゲーム世界を繋ぐ重要な要素です。
Input.GetKeyDown: キーが押された瞬間を検知。単発のアクションに。Input.GetKey: キーが押されている間を検知。継続的なアクションに。Input.GetAxis: 仮想軸からの入力を取得。キーボードとゲームパッドの両方に対応しやすい。Input.GetMouseButtonDown: マウスクリックを検知。
まずは標準のInput Managerを使って、キャラクターを動かしたり、アクションを起こしたりする基本的な実装に慣れることから始めましょう。そして、プロジェクトが複雑になってきたら、新しいInput Systemへの移行を考えてみるのが良いステップアップとしておすすめです。