コントローラーとマウス・キーボード操作を両立する設計

ひな子と帰ろう全年齢版 [まさかみ自然保護区] | DLsite
異世界転生系3D脱出アドベンチャー「DLsite 同人」は同人誌・同人ゲーム・同人ボイス・ASMRのダウンロードショップ。お気に入りの作品をすぐダウンロードできてすぐ楽しめる!毎日更新しているのであなたが探している作品にきっと出会えます。国内最大級の二次元総合ダウンロードショップ「DLsite」!
魔理沙の不思議な魔法具店 [まさかみ自然保護区] | DLsite
物語が充実した簡単経営シミュレーション「DLsite 同人」は同人誌・同人ゲーム・同人ボイス・ASMRのダウンロードショップ。お気に入りの作品をすぐダウンロードできてすぐ楽しめる!毎日更新しているのであなたが探している作品にきっと出会えます。国内最大級の二次元総合ダウンロードショップ「DLsite」!

両方ともxboxコントローラーやマウス・キーボード操作に対応してます。実現するための設計と課題などについてです。

設計

入力は全てPadというクラスに抽象化しました。コントローラからの入力やキーボードからの入力やボタンがクリックされたコールバックはUpdateの最初期にPadクラスに集約されます。

ゲームシーケンス側はこのPadだけ使ってボタン押された、押されてないの判定をします

実装

コントローラー入力はインゲームキーコンフィグのためさらにラップされてますが、結局はInput.GetButton、Input.GetAxisです。

キーボードの入力はキーコンフィグ無しの決めうちで、こちらも結局はInput.GetKeyです。

UGUI.Buttonが押されたコールバックはいったんglobalなButtonBlackboardみたいのに集めました。ボタン同時押しされたら最後のが書き込まれます。このとき各ボタンには自作のButtonEventReceiverがついていてパッドのAボタンだとか、デジタル十字キーの右だとかのメンバ変数を持ってます。

これらの入力情報をUpdateの最初期にPadクラスがいい感じにまとめます。

アイテム一覧などの選択しがクリックされた時は、要素を選択した後に、Aボタンが押されたみたいな連続してはいります。

課題

ボタンはButtonEventReceiverがグローバル変数に書き込む実装です(一応interface化してます)。これだけはイマイチ感があります。

モバイルゲーム開発をしてた時はグローバルではないにせよ、共有変数に書き込んでいました。影響範囲が限定されるかわりに都度コーディングが必要でだるさを感じていました。