ながつきぶろぐ

Unityのこととかゲームのこととか書けたらよいなブログ。

Rewiredでゲームパッドの4人対戦をできるようにした話

この記事のタイトルとURLをコピーする

前回の記事でも話にしていましたが、先日「ひよこバトル」をゲームパッド対応、ならびに最大4人で同時操作できるようにしました。

 

nagatuki.hateblo.jp

 

実装までの過程をざっとメモ書きです。備忘録的な奴です。

最初に考えたこと

  • UnityのInputManagerにボタン番号を想定できる範囲分×想定プレイヤー数分の入力情報を登録(GamePad1_Button10、GamePad2_Stick2など)
  • プレイヤー操作で「W」や「Space」などキーボード直指定していたものを、InputManagerに登録した名前を使って入力検知するように変更
  • プレイヤーIDとゲームパッドの番号をもとに、操作可能なひよこを制限(もともとオンラインたいせんである程度の範囲で実装済み)
  • ゲームパッドによって配置と返ってくるボタン番号が違うらしいので、キーコンフィグを実装

…とここまで考えてくっそめんどくさいことが分かった(特に一番最後)ので、諦めてアセット買いました。

Rewiredを導入

アセットについて

いろいろなゲームパッドにこれ一つで対応してくれるアセットです。

プラットフォームはWindowsMacはもちろん、WebGLにも対応。(直近の創作活動的にここが一番でかかった)

ゲームパッドの種類が多く、(使う機会はなさそうですが)Switchのコントローラも対応しているようです。というより現時点でRewired内に148データあるんですがこれ絶対ひとりじゃ実装無理

f:id:nagatuki_elv:20180121134624p:plain

基本実装

実装にあたっては以下を参考にしたのでぜひご確認ください。(投げやり)

アセット触ってみたシリーズ:多種多様なコントローラーに対応しよう!「Rewired」 – Unity公式 Asset Portal

上記では触れていない箇所で私が触った場所を挙げていきます。

 

独自で触ったところ

UIを操作できるように対応

UGUIの入力を受けるStandaloneInputModuleはそのままでは当然Rewiredに対応されていないので、代わりになるRewiredStandaloneInputModuleを使います。

EventSystemにデフォルトでアタッチされているStandaloneInputModuleを外して、RewiredStandaloneInputModuleをアタッチしなおすだけです。

f:id:nagatuki_elv:20180121145913p:plain

次に、「Horizontal Axis」「Vertical Axis」「Submit Button」「Cancel Button」に登録されているボタン名をゲームパッドの操作に登録。

この時、既存のゲーム操作と干渉しないように、「Map Categories」よりコントローラマップ(いわゆる操作対応表)を変更しておくと管理が楽です。私の場合、通常の操作は「Default」、UI操作は「System」として登録しています。

f:id:nagatuki_elv:20180121150245p:plain

次はソース側の調整。「ひよこバトル」ではオプションを開くとUIを操作できるようにしていますので、UIが立ち上がる際に以下を実行して操作に使用するコントローラマップを切り替えています。

// 操作モードをシステムにする

// 全プレイヤー情報を取得(引数trueでシステムのプレイヤーも取得。基本falseでOK)
IList<Player> playerList = ReInput.players.GetPlayers(false);
foreach(Player player in playerList) {
    // コントローラマップの有効設定変更
    player.controllers.maps.SetMapsEnabled(false, "Default");
    player.controllers.maps.SetMapsEnabled(true, "System");
}

閉じる際はフラグを反転させるだけ。

// 操作モードをデフォルトにする
IList<Player> playerList = ReInput.players.GetPlayers(false);
foreach(Player player in playerList) {
    player.controllers.maps.SetMapsEnabled(true, "Default");
    player.controllers.maps.SetMapsEnabled(false, "System");
}

 

これで切替処理の完成。UIのフォーカス切替はUGUIの既存システムと変わらないため割愛します。

WebGL用の調整

UnityEditorでは問題なく動作していたのに、いざWebGLビルドにしてみるとボタンの位置がずれていたり、反応しなかったりという問題が起きました。

しかし、Rewiredのドキュメントにもその辺りのことが書かれておりまして、どうもほとんどのコントローラがブラウザ上で正しく認識されず「不明なコントローラ」扱いで登録されてしまっているようでした。WebGL(ブラウザ)の仕様なのかRewiredの仕様なのかはよくわかっていません。

というわけなので、「Unknown Controller」の設定を追加し、ボタン番号に合わせた操作を登録。ボタン番号はだいたい1から始まると思いますが、こちらに登録するのはボタン番号-1(ボタン1の場合Button 0)を指定するとうまく行くはずです。

ちなみにここの「Hat」は十字キーです。

f:id:nagatuki_elv:20180121145042p:plain

まとめ

アセット買う前はちょっと高いかなーと思いましたが、だいぶ楽になりました。こんなん自前で用意するの無理なんで買ってよかった。

今後も使えるシロモノなので、どんどん使っていきます。

ただしキーコンフィグは面倒なので多分やりません。

おまけ

この記事書いてるときに見つけたやつ。

これが1Pのキーボード設定。↓

ここにキーボード入力がなされたとき、ここに登録した操作がゲームで実行可能になります。つまるところ1Pのみはゲームパッド以外でもキーボード入力が可能というわけです。

f:id:nagatuki_elv:20180121140034p:plain

 

んでもってこれが2Pのキーボード設定(3Pと4Pも同じ)↓

f:id:nagatuki_elv:20180121140229p:plain

???

 

f:id:nagatuki_elv:20180121140906g:plain

( ^ω^)・・・