夏季休暇
長い休暇明けは周りからの「どこに行きました?」という質問が一番怖い皆さんこんにちは。それぞれお土産のお菓子を配ったりするのはご勝手なんですが、それを渡す際に不毛な質問をするのは是非やめて頂きたい。返事に窮するので。
アップデートに向けて
既に早期アクセス版をリリースしているアドベンチャーゲーム「W.T.」ですが、今月末にアップデート版をリリースする予定です。
アップデート内容はバグの改修とUIの修正、一部パズルにヒントを追加する事と、ゲームコントローラー対応を予定しています。
ゲームコントローラーは東京ゲームダンジョン3で展示したデモ版では対応していたのですが、本編の方では諸般の問題解決に時間が掛かり間に合っていなかったので次回のアップデートのタイミングで導入することにしました。
Inputクラスによる入力判定
Unity でゲームコントローラーによる入力を判定する場合、Unity2019辺りから導入されたInputSystemを使えば「Gamepad.current.leftStick」や「Gamepad.current.buttonSouth」といった各入力応じたコントールを使用して判定する事ができるのですが、旧式のInputManagerを使っている場合はInputSystemと共存できない為、Inputクラスを使うことになります。
(InputSystemを導入するとInputManagerを無効化する設定に変更される)
Inputクラスを使う場合、ゲームコントローラーには軸(左右スティック等)によるアナログ入力とボタンによるデジタル入力の2種類があるため、それぞれの入力情報を受け取るには、Input.GetAxis と Input.GetButtonDown といった二種類のメソッドを使い分けて取得する事になります。
Input-GetAxis - Unity スクリプトリファレンス
Input-GetButtonDown - Unity スクリプトリファレンス
上のマニュアルの通り、Input.GetAxis と Input.GetButtonDownどちらも入力値を取得したい軸、ボタンをその名前("JoystickAxis0"とか"JoystickButton0")で指定する方式なので、事前に使用するゲームコントローラーの「左スティックの名前」「Aボタンの名前」を知っておく必要があります。
ゲームコントローラー毎のマッピング
一般的にPCゲームで使用されるゲームコントローラーは
- XBoxで使用されるXInput形式
- PSで使用されるDualShock形式
の二種類が考えられると思います。
どちらもコントローラーの構成(左右スティック、4ボタン、上部左右にトリガーボタン二つ)は同じなので、Inputで使用する各軸の名前、ボタンの名前は同じなのかと思いきやドッコイ、調べてみるとXInput/DualShockで異なるのはもちろん、それぞれWindowsとMacOSでも異なる、という鬼畜仕様、メモを取っておかないと絶対に対応できない、という事が分かったので、下に各形式で割り当てられている軸名、ボタン名を書き置きます。
■XInput形式
■DualShock形式
左スティックに関しては各形式どれも同じ名前ですが、右スティックに関しては各形式で微妙に違うので注意が必要です。
ボタンの割り当てはXInput形式の場合はWindowsとMacOSで大きく異なり、DualShock形式ではほぼ同じ、Windows版のXInputとDualShockでボタンのマッピング微妙に違う(XInputはbutton0が下ボタン、DualShockでは左ボタン)事も不可解ですが注意しましょう。
DualShock形式での注意点
ゲームコントローラーにはアナログ入力とデジタル入力の二種類の入力がありますが、L2,R2(XInputではLT,RT)ボタンはアナログ/デジタルの併用入力となっている為、ボタンでありながらGetAxisで入力情報を取得することができます。
入力値の範囲は左右スティックと同じ-1.0~1.0の範囲ですが、DualShockコントローラーの場合、L2,R2はOFFの値が「-1」となっている為、例えば入力判定に「Mathf.Abs(Input.GetAxis(L2軸名))==1」のような条件を設定していると、必ずONとして判定される事になります。
DualShockコントローラー接続中の各軸OFFの値
この為、キーコンフィグ画面などで各ボタンの入力有無を判定する場合、「L2」「R2」に関しては「1がON」として判定するように設計を行う必要があります。開発者としては少し意地悪な仕様に感じますが、こればっかりは文句をいっても仕方ないのでDualShock形式の仕様に合わせて対応を行いましょう。