New Input SystemをPlayerInputを通さずに使う (v1.0.2)

このあたりインターフェイスが変わりまくっているようで、ググって出てきた情報が古かったので1.0.2時点での使い方を置いておきます。

公式のクイックスタートを読んでも、PlayerInputを通した使い方しか書いておらず、
いやいや、そんなMonoBehaviourにベッタリな感じで使いたくないんだが。という気持ちになった人のためのメモです。

設定

Input Action Asset作って、コード生成しておきます。
f:id:kyubuns:20210401132214p:plain

使い方

結論から書くと、これだけでオッケー。

var actions = new GeneratedInputAction();

actions.OutGame.SetCallbacks(new OutGameInputCallback());
actions.InGame.SetCallbacks(new InGameInputCallback());

actions.OutGame.Enable();
actions.InGame.Disable();

// actionsはDisposableなのでちゃんとDisposeしましょう。

複数人プレイ(複数コントローラー)に対応するには?

InputSystem.onDeviceChange で新しいデバイスを受け取って、

actions = new NewInputAction
{
    devices = new[] { ここに受け付けるデバイスを渡す }
};

まあ現実的には

public void Start()
{
    foreach (var device in InputSystem.devices)
    {
        OnConnectDevice(device);
    }
    InputSystem.onDeviceChange += InputSystemOnDeviceChange;
}

private void InputSystemOnDeviceChange(InputDevice device, InputDeviceChange change)
{
    if (change == InputDeviceChange.Added)
    {
        OnConnectDevice(device);
    }
}

みたいになりそう。

メニュー画面を開いたらメニューのイベントだけ受け付けたい

これでActionMap毎にON/OFF出来る。
actions.Enableすると全部ONになるので気をつけて。

actions.OutGame.Enable();
actions.InGame.Disable();