InputSystem対応


投稿日:2024年7月31日 | 最終更新日:2025年10月25日

概要

Unityでは入力処理を扱う基本システムが、InputManagerという旧バージョンと、InputSystemという新バージョンがあります。
InputSystemはUnity公式の追加プラグインなのですが、最近はデフォルトで使用するようになっている場合が多いため、
宴4.1.2からInputSystem経由で入力処理ができるようにしました。

InputSystem関係のプログラムは、Assets/Utage/ExtensionSupport/InputSystemフォルダ以下にあります。

InputSystem対応は自動的に適用

プロジェクトにInputSystemパッケージが適用されている場合は、自動的にInputSystemを使用するよう設定されます。
プロジェクトにInputSystemがない場合は、従来通りInputManager経由で処理を行います。
InputManagerとInputSystemを併用する、Both(両対応モード)設定の場合は、特に対応作業をする必要はないです。
InputManagerを使用していた状態から、InputSystemのみを使用する場合は、下記の手順が必要になります。

InputManagerを排除して、InputSystemのみを使用する場合

InputManagerを使用していたプロジェクトから、InputSystemに完全に移行し、InputManagerを使用するのをやめる場合は手作業で対応が必要になります。

1.Edit > Project Settings > Player > Other Settings > Configuration の
Active Input Handlingを「Input System Package(New)」にします。

2.シーン内の、EventSystemオブジェクトで「StandAlone Input Module」が使用されていた場合、下記画像のようなボタンが表示されるので、
ボタンを押して「Input System UI Input Module」に変換します。
(既にInput System UI Input Moduleが使用されている場合は対応不要)

宴4.2.0より前のバージョンで作成した宴プロジェクトはInputManagerかBoth(両対応)で作成されているので、InputSystemのみの使用に移行する場合は上記の作業を行ってください。

InputUtilの抽象化

Utageでは、キーボー入力などのボタン入力処理は、「InputUtil」というstaticなWrapperクラスを経由して行っていいたのですが、
InputSystem対応をするにあたって、具体的な入力キーのメソッド名から、入力キー等を抽象化し入力の目的名のメソッドを使えるように変更しました。
もし、自作のキーボード入力処理などで、宴のInputUtil経由で処理を行っているものがあった場合は、警告がでますので警告メッセージにある代替メソッドに変更するようにしてください。
(一応そのままでも動作しますが、警告が残ったままになります)

        //強制スキップ入力があったか
        public static bool IsInputForceSkip()
        {
            if (!EnableInput) return false;
            return InputStrategy.IsInputForceSkip();
        }
        //UI入力を抽象化するため、メソッド名を変更
        [Obsolete("Use "+nameof(IsInputForceSkip) + " instead")]
        public static bool IsInputControl()
        {
            return IsInputForceSkip();
        }

自作のアクションマップなどで入力処理を変更したい場合

宴のInptuSystem対応のコード(Assets/Utage/ExtensionSupport/InputSystem/InputSystemStrategy.cs)は、具体的なキーやボタン入力を検知するようになっています。

自作のアクションマップなどを使って、入力処理を変えたい場合は
IInputStrategyを継承したクラスを作成して入力処理を実装し、
InputUtil.SetInputStrategy(); を使って、宴の使用する入力処理を上書きして書き換える形になります。

以下、サンプル

    //自作のアクションマップを使った入力処理を適用するサンプル
    //IInputStrategyを継承して、自作の入力処理を実装する
    public class SampleInputSystemStrategy :
        MonoBehaviour,
        IInputStrategy
    {
        public PlayerInput PlayerInput => playerInput;
        [SerializeField] PlayerInput playerInput;

        void Awake()
        {
            //InputUtil.SetInputStrategy()を使って、自作の入力処理を適用する
            InputUtil.SetInputStrategy(this);
        }

        public bool IsInputGuiClose()
        {
            //アクションマップを取得
            return PlayerInput.actions["GuiClose"].ReadValue<bool>();
        }