Input Systemで入力を受け取ろう【Unityスタートガイド6-7】

ゲームといえば、キーボードやゲームパッドで操作できてこそ!Unity6では、入力はInput Systemという仕組みで受け取ります。ネットの古い記事でよく見るInput.GetKey()は、Unity6の新しいプロジェクトではそのままだとエラーになるので注意。今回はInput Systemで、移動やジャンプの入力を受け取る方法をご紹介します!

目次

この記事で学べること

  • Input Systemとは何か、古いInput.GetKey()との違い
  • 最初から入っている入力の設定(InputSystem_Actions)の見方
  • 入力を扱うスクリプトを自動で作る方法(Generate C# Class)
  • 移動・ボタンの入力をスクリプトで受け取る方法

前提知識

Input Systemとは?

入力をまとめて扱う仕組み

Input Systemは、キーボード・マウス・ゲームパッド・タッチなどの入力を、まとめて扱える仕組みです。

  • 「移動」「ジャンプ」のようなアクションに、キーやボタンを割り当てておく
  • スクリプトでは「ジャンプが押されたか」だけを見ればよい
  • キーボードでもゲームパッドでも、同じスクリプトで動く

古いInput.GetKey()は使えない?

以前のUnityでは、Input.GetKey(KeyCode.Space)のように書いて入力を受け取っていました(Input Manager)。Unity6の新しいプロジェクトは、初期設定でInput Systemだけを使うようになっているので、古い書き方をすると再生したときに次のようなエラーが出ます。

InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings.

ネットの記事を参考にするときは、Input.GetKeyやInput.GetAxisが出てきたら「古い書き方だな」と思ってください。

スライム

Edit>Project Settings>Player>Other SettingsのActive Input Handlingで、古い方式も使えるように切り替えることは出来ます。でもこの講座ではInput Systemで統一していきます

最初から入っている入力の設定

InputSystem_Actionsを開いてみよう

Unity6のテンプレートで作ったプロジェクトには、Assetsの中にInputSystem_Actionsというファイルが最初から入っています。これが入力の設定ファイルです。

  • ProjectウィンドウでAssets>InputSystem_Actionsをダブルクリック
  • 入力の設定ウィンドウが開く
  • Action Maps:場面ごとのまとまり(Player:ゲーム中の操作、UI:メニュー操作)
  • Actions:「移動」「ジャンプ」などの操作の名前
  • Bindings:そのアクションに割り当てたキーやボタン

Playerに最初から入っている主なアクション

アクション内容キーボードの割り当ての例
Move移動(上下左右)WASD、矢印キー
Look視点を動かすマウスの動き
Attack攻撃マウスの左クリック
JumpジャンプSpace
Sprintダッシュ左Shift
Interact調べる・話しかけるE(長押し)

ゲームパッドのボタンも一緒に割り当てられています。細かい割り当ては、上の設定ウィンドウで確認・変更出来ます。

スクリプトで使えるようにする(Generate C# Class)

InputSystem_Actionsの設定を、スクリプトから簡単に使えるようにします。

  1. ProjectウィンドウでInputSystem_Actionsを1回クリックして選択
  2. InspectorのGenerate C# Classにチェックを入れる
  3. Applyを押す
  4. Assetsの中にInputSystem_Actions.csというスクリプトが自動で作られる

これで、スクリプトからInputSystem_Actionsという名前で入力を扱えるようになりました。

入力を受け取るスクリプト

基本の形

using UnityEngine;

public class InputExample : MonoBehaviour
{
    private InputSystem_Actions inputActions;

    void Awake()
    {
        // 入力の設定を使う準備
        inputActions = new InputSystem_Actions();
    }

    void OnEnable()
    {
        // 入力の受付を開始
        inputActions.Enable();
    }

    void OnDisable()
    {
        // 入力の受付を終了
        inputActions.Disable();
    }

    void Update()
    {
        // 移動の入力(-1〜1の2つの数字)
        Vector2 move = inputActions.Player.Move.ReadValue<Vector2>();
        if (move != Vector2.zero)
        {
            Debug.Log("移動の入力: " + move);
        }

        // ジャンプのボタンが押された瞬間
        if (inputActions.Player.Jump.WasPressedThisFrame())
        {
            Debug.Log("ジャンプ!");
        }

        // ダッシュのボタンが押されている間
        if (inputActions.Player.Sprint.IsPressed())
        {
            Debug.Log("ダッシュ中");
        }
    }
}

空のゲームオブジェクトにアタッチして再生し、WASDやSpace、左Shiftを押してConsoleを確認してみましょう。

書き方のポイント

  • Awake
    • new InputSystem_Actions()で、入力の設定を使う準備をする
    • AwakeはStartよりも前に1回呼ばれるメソッドです(6-9の記事で説明します)
  • OnEnable / OnDisable
    • オブジェクトが有効になったとき・無効になったときにUnityが呼んでくれるメソッド
    • Enable()で入力の受付を始め、Disable()で終わる。Enableを忘れると入力が一切来ません
  • 移動の入力:ReadValue<Vector2>()
    • 横(x)と縦(y)の2つの数字で返ってくる
    • 右を押すと(1, 0)、上を押すと(0, 1)、何も押していないと(0, 0)
  • ボタンの入力
書き方trueになるとき
WasPressedThisFrame()押した瞬間(1回だけ)
IsPressed()押している間ずっと
WasReleasedThisFrame()離した瞬間(1回だけ)
フェアリー

ジャンプのように「1回だけ」反応してほしいものはWasPressedThisFrame、ダッシュのように「押している間」はIsPressedを使い分けてね

実際に動かしてみる

移動の入力を使って、オブジェクトを動かしてみましょう。Updateの最後に次の2行を足します。

        // 入力の方向に動かす(詳しくは6-8の記事で説明します)
        Vector3 direction = new Vector3(move.x, move.y, 0f);
        transform.position += direction * 5f * Time.deltaTime;

Cubeにアタッチして再生すると、WASDでCubeが上下左右に動きます。

もっと手軽に:キーを直接調べる

アクションを作るほどでもない、ちょっとしたテストをしたいときは、キーボードを直接調べる方法もあります。

using UnityEngine;
using UnityEngine.InputSystem;

public class KeyboardCheck : MonoBehaviour
{
    void Update()
    {
        // キーボードがつながっていないときはnullになるので確認する
        if (Keyboard.current == null)
        {
            return;
        }

        if (Keyboard.current.rKey.wasPressedThisFrame)
        {
            Debug.Log("Rキーが押された!");
        }
    }
}
  • using UnityEngine.InputSystem;が必要です
  • ゲームパッドやキー設定の変更には対応しにくいので、ゲームの操作にはInputSystem_Actionsを使うのがオススメです

注意点やヒント

Generate C# Classは最初に1回だけ

一度作れば、あとはInputSystem_Actionsの設定を変えてSaveするたびに、InputSystem_Actions.csも自動で更新されます。

アクションの設定を変えたらSave Asset

設定ウィンドウでキーの割り当てを変えたら、ウィンドウ上部のSave Assetを押して保存します(Auto-SaveにチェックがあるとSave不要)。

よくあるエラーと対処法

エラー:The type or namespace name ‘InputSystem_Actions’ could not be found

  • 原因:Generate C# Classをしていない
  • 対処法:InputSystem_Actionsを選んで、Generate C# Classにチェックを入れてApplyする

エラー:InvalidOperationException: You are trying to read Input using the UnityEngine.Input class…

  • 原因:古いInput.GetKey()やInput.GetAxis()を使っている
  • 対処法:この記事の書き方(InputSystem_Actions)に書き換える

エラー:入力しても何も反応しない

  • 原因:inputActions.Enable()を呼んでいない。またはゲームビューにフォーカスが当たっていない
  • 対処法:OnEnableでEnable()しているか確認する。再生したら一度ゲームビューをクリックしてからキーを押す

エラー:Keyboard.currentでNullReferenceException

  • 原因:キーボードがつながっていない環境で、nullのまま使った
  • 対処法:if (Keyboard.current == null) return;のように、先に確認する

まとめ

  • Unity6の入力はInput System。古いInput.GetKey()はエラーになる
  • 入力の設定はInputSystem_Actions。Move・Jump・Sprintなどが最初から入っている
  • Generate C# Classで、スクリプトからInputSystem_Actionsとして使える
  • new → Enable() → ReadValue / WasPressedThisFrame / IsPressed の流れで入力を受け取る
スライム

最初の準備が多くて、覚えられない・・・

フェアリー

この形はこれからずっと使うから、コピーして使い回せばOK!何回も書いているうちに覚えちゃうよ

次のステップ

入力が受け取れるようになったので、次はその入力でオブジェクトを思い通りに動かす方法を学びましょう:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (2件)

コメントする

目次