UIの複数コントローラー対応

InputSystemパッケージを使ってUIをローカルマルチプレイに対応させる方法のメモ

使うもの

  • PlayerInputManager
  • PlayerInput
  • MultiplayerEventSystem
  • InputSystemUIInputModule

(1) PlayerInputの作成

適当な名前を付けた空のゲームオブジェクトを作り、下記コンポーネントをアタッチする。このゲームオブジェクトは入力を受け取るプレイヤー毎に生成されます。

  • PlayerInput
  • MultiplayerEventSystem
  • InputSystemUIInputModule

PlayerInputのActionsにはUIで使用するアクションを持つ適当なInputActionAssetを指定、UI Input Moduleには同じゲームオブジェクトにアタッチされたInputSystemUIInputModuleを指定する。

InputSystemUIInputModuleのActions Assetは勝手に変更されるので未指定でOK。

MultiplayerEventSystemのFirst Selectedに適当なUIオブジェクトを指定する。

諸々完了したらゲームオブジェクトを非アクティブにする。

※本来このPlayerInputはプレハブ化すべきですが、説明を簡潔にするため、ゲームオブジェクトを非アクティブにして疑似的にプレハブ化しています。

(2) PlayerInputManagerのセットアップ

適当な名前を付けた新たな空のゲームオブジェクトを作り、PlayerInputManagerをアタッチする。

PlayerInputManagerのPlayer Prefabに先ほど作ったPlayerInputのゲームオブジェクトを指定する。

終わり

この時点でコントローラーごとにUIの操作が出来るようになります。簡単。

UIを操作したプレイヤーを知りたい

UIのイベントが処理される際、EventSystem.currentがプレイヤー別のMultiplayerEventSystemに書き換わります。イベントの中でEventSystem.currentからPlayerInputを取るなりすると誰が操作したかの判別が可能です。