キーボードとマウス
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 44/56。
Input System は各デバイスにオブジェクトを提供します。Keyboard.current はキーボードで、その各キーは名前を持つコントロールです。たとえば、spaceKey、aKey、upArrowKey、または任意のキーを Key の値で指定する Keyboard.current[Key.Space] です。Mouse.current はマウスで、leftButton、rightButton、position を持ちます。コントロールの isPressed は押し続けているすべてのフレームで true になり、Input.GetKey と同じ動作です。この潜水艦は矢印キーで潜水と浮上を行い、マウスボタンを押している間はサーチライトを点灯します。
using UnityEngine;
using UnityEngine.InputSystem;
public class Submarine : MonoBehaviour
{
public float diveSpeed = 2f;
public Light searchlight;
void Update()
{
Keyboard keyboard = Keyboard.current;
if (keyboard == null) return; // キーボードが接続されていない
if (keyboard.downArrowKey.isPressed)
transform.position += Vector3.down * diveSpeed * Time.deltaTime;
if (keyboard.upArrowKey.isPressed)
transform.position += Vector3.up * diveSpeed * Time.deltaTime;
searchlight.enabled = Mouse.current != null && Mouse.current.leftButton.isPressed;
}
}current は最後に使用されたデバイスを指し、デバイスがない場合は null になります。スマートフォンやコンソールにはキーボードがない場合があり、null チェックによってそのような環境でもスクリプトが例外を発生させずに済みます。キーボードには軸がないため、下矢印キーと S キーは別々のキーです。S キーでも潜水する潜水艦にするには、keyboard.downArrowKey.isPressed || keyboard.sKey.isPressed をテストします。Mouse.current.position.ReadValue() は、Input.mousePosition と同様に、画面の左下隅を原点とするピクセル単位のポインター位置を Vector2 として返します。
チャレンジ
中級Input System を使って熱気球を飛ばしましょう。スクリプトには、drift(2)、rise(3)、sink(1)、groundY(2)、そしてバーナーの炎である、気球の下のflameがあります。
- 右矢印キーまたは D キーを押している間、気球は
drift単位/秒の速度で右(+x 方向)に移動します。左矢印キーまたは A キーを押している間は、左に移動します。 - Space またはマウスの左ボタンを押している間、バーナーが点火します。点火している間だけ
flameを表示してください。 - バーナーが点火しているとき、気球は
rise単位/秒の速度で上昇します。消えているときはsink単位/秒の速度で下降しますが、groundYより下には決して下がりません。
Keyboard.currentとMouse.currentを使ってください。このプロジェクトは新しい Unity 6 プロジェクトと同様に設定されているため(Active Input Handling: Input System Package)、ここではInputクラスを使うと InvalidOperationException がスローされます。Playを押して飛ばし、それからCheckを押してください。
自分で試してみよう
using UnityEngine;
using UnityEngine.InputSystem;
public class Balloon : MonoBehaviour
{
public float drift = 2f;
public float rise = 3f;
public float sink = 1f;
public float groundY = 2f;
public GameObject flame;
void Update()
{
// 矢印キーまたは A と D で漂い、Space またはマウスで燃焼する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。