Unityでキー・マウス操作などの入力システムと入力マネージャー(InputSystem・InputManager)

当ページのリンクには広告が含まれています。

Unityでキーボード操作、マウス操作、タッチ操作などの入力でゲーム操作を行う場合、「InputSystem」もしくは「InputManager」を利用します。今回は、新入力システム(InputSystem)と旧入力マネージャー(InputManager)の変換を確認します。

はじめに

Unityのバージョンは6.4です。下記はマウスでゲーム画面に線を引くのを「InputManager」を利用して作成しました。これを「InputSystem」に置き換えて実装してみます。

実装開始

まずは上記記事にある「InputManager」を利用したパターンの確認です。空オブジェクトを追加して、LineRendererを追加します。

下記スクリプトを作成します。

using UnityEngine;

public class LineDrawScript : MonoBehaviour
{
    [SerializeField] private LineRenderer _rend;
    [SerializeField] private Camera _cam;

    private void Update()
    {
        Vector2 mousePos = _cam.ScreenToWorldPoint(Input.mousePosition);
        if (Input.GetMouseButton(0))
            SetPosition(mousePos);
    }

    private void SetPosition(Vector2 pos)
    {
        _rend.positionCount++;
        _rend.SetPosition(_rend.positionCount - 1, pos);
    }
}

スクリプトをアタッチして、パラメータをセットします。

Unity6.4でデフォルトの状態で実行すると、下記エラーが表示されて実行できないです。

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.

有効にするには、「Edit」→「Project Settings…」を選択。

「Player」の「OtherSettings」内にある「ActiveInputHandling」を「InputManager(Old)」または「Both」に変更すると実行する事が出来ます。

同じ動作を「InputSystem」を利用すると下記スクリプトになります。

using UnityEngine;
using UnityEngine.InputSystem;

public class LineDrawScript : MonoBehaviour
{
    [SerializeField] private LineRenderer _rend;
    [SerializeField] private Camera _cam;

    private void Update()
    {
        Vector2 mousePos = _cam.ScreenToWorldPoint(Mouse.current.position.ReadValue());
        if(Mouse.current.leftButton.isPressed)
            SetPosition(mousePos);
    }
    private void SetPosition(Vector2 pos)
    {
        _rend.positionCount++;
        _rend.SetPosition(_rend.positionCount - 1, pos);
    }
}

条件付きコンパイルを利用して下記の様に記載すると、どの設定でも実行できます。

using UnityEngine;
using UnityEngine.InputSystem;

public class LineDrawScript : MonoBehaviour
{
    [SerializeField] private LineRenderer _rend;
    [SerializeField] private Camera _cam;

#if ENABLE_INPUT_SYSTEM
    private void Update()
    {
        Vector2 mousePos = _cam.ScreenToWorldPoint(Mouse.current.position.ReadValue());
        if (Mouse.current.leftButton.isPressed)
            SetPosition(mousePos);
    }
#elif ENABLE_LEGACY_INPUT_MANAGER
    private void Update()
    {
        Vector2 mousePos = _cam.ScreenToWorldPoint(Input.mousePosition);
        if (Input.GetMouseButton(0))
            SetPosition(mousePos);
    }
#endif
    private void SetPosition(Vector2 pos)
    {
        _rend.positionCount++;
        _rend.SetPosition(_rend.positionCount - 1, pos);
    }
}

下記の様に無効箇所がグレー表示になります。

公式マニュアルは下記になります。旧入力マネジャー(InputManager)と新入力システム(InputSystem)の対応表も記載されています。

タイトルとURLをコピーしました