入力アクション
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 46/56。
キーを1つずつテストすると、スクリプトがキーボードに依存してしまいます。代わりにアクションでプレイヤーの操作を名前で表し、どのキー、スティック、ボタンがそのアクションを起動するかをプロジェクトで設定します。新しいUnity 6プロジェクトには、アクションのセット(InputSystem_Actionsアセット。プロジェクト全体のアクションとして設定済み)が含まれており、そのPlayerマップにはMove(WASD、矢印キー、ゲームパッドの左スティック)、Look(マウスまたは右スティック)、Attack(マウスの左ボタンとEnter)、Interact(E、押し続ける)、Crouch(C)、Jump(Spaceとゲームパッドの南ボタン)、PreviousとNext(1と2)、Sprint(Left Shift)があります。これらは最初から有効になっており、InputSystem.actions.FindAction("Jump")で名前を指定して取得できます。この横視点のクレーンゲームはx軸とy軸方向に移動し、Jumpでつかみます。
using UnityEngine;
using UnityEngine.InputSystem;
public class ClawCrane : MonoBehaviour
{
public float speed = 3f;
private InputAction moveAction;
private InputAction jumpAction;
void Start()
{
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
transform.position += new Vector3(input.x, input.y, 0f) * speed * Time.deltaTime;
if (jumpAction.WasPressedThisFrame())
Debug.Log("Grab!");
}
}アクションはStartで一度だけ検索し、InputActionフィールドに保持します。MoveはVector2を返します。xはキーでの左右、yは上下を表し、値は正規化されるため、WとDを同時に押すと(1, 1)ではなく(0.71, 0.71)になります。クレーンは横視点なので、このyを高さとして使います。上から見たゲームなら、zとして使います。ボタンアクションはキーと同じように、WasPressedThisFrame()、WasReleasedThisFrame()、IsPressed()で状態を取得できます。2つのミスは例外を引き起こします。名前のスペルを間違えるとFindActionはnullを返し(最初に読み取るときにNullReferenceExceptionが発生)、Moveに対してReadValue<Vector3>()を使うと、キーを押した時点でInvalidOperationExceptionが発生します。Moveが保持するのはVector2だからです。
チャレンジ
中級測量士は雪原を上から見た地図にし、道中に立てるためのflags(3本)を持っています。スクリプトにはspeed(4)、flags、flagPrefabと、リストplantedがあります。プロジェクトのアクションを使いましょう。
- Moveで、測量士を毎秒
speedユニットの速さで雪原上を移動させます。右と左はx軸方向、上と下はz軸方向です。 - Jumpを押すたびに旗を立てます。測量士のx座標とz座標の位置にあるy座標0.75の地点に
flagPrefabのコピーを置き、plantedに追加します。flagsを1本消費し、残りの本数をFlags left: 2のようにログに出力します。旗が残っていない場合、Jumpを押しても旗は立ちません。 - Attack(左クリック)を押すたびに、最後に立てた旗を引き抜きます。旗は破棄されてリストから取り除かれ、
flagsが1増え、同じ行がログに出力されます。
Playを押し、旗を3本立ててから1本引き抜き、Checkを押しましょう。
自分で試してみよう
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Surveyor : MonoBehaviour
{
public float speed = 4f;
public int flags = 3;
public GameObject flagPrefab;
private List<GameObject> planted = new List<GameObject>();
void Start()
{
// Move、Jump、Attackのアクションを見つける
}
void Update()
{
// Moveで歩き、Jumpで旗を立て、Attackで旗を1本引き抜く
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。