ゲームパッド
WindowsのゲームパッドのAPIには旧規格のDirectInputと新規格のXInputがあり、
Oculus Unity Integration付属のOVRGamepadController.csはこのうちXInputのみに対応しています。 *1
そのため古いゲームパッドでは動作しない可能性があります。
【2015.5.30追記】0.5.0.1まではXInputのみに対応していました。0.6.0.0以降はDirectInputのゲームパッドにも対応しています。
ただし、少なくとも現在の0.6.0.0ではエラーが発生してしまいます。解決方法はこちら。
Oculus VR社としてはXInput準拠のXbox 360コントローラが推奨のようです。
こちらを利用すれば間違いないでしょう。
(詳しくはOculus Unity Integration Guideに記述されています。)
それでもDirectInput仕様のゲームパッドを使いたい
どうしてもDirectInputのみに対応したゲームパッドを使用したい場合、選択肢は2つあります。
- x360ceを使ってXInputに見せかける
- Unity標準のInputを使うようにOVRPlayerController.csを書き換える
x360ceを使ってXInputに見せる
x360ce(XBOX 360 Controller emulator)というソフトで、
DirectInput仕様のゲームパッドをXInput仕様のゲームパッドのように見せかけることが出来ます。
手順は次のとおり。
- アプリをビルドする。
- x360ceをダウンロードし、解凍する。
- x360ce.exeを起動する。
- "'x360ce.ini' was not found." "Do you want to create this file?"と聞かれるので、[Yes]をクリックする。
- "'xinput1_3.dll' was not found." "Do you want to create this file?"と聞かれるので、[Yes]をクリックする。
- そのままx360ceでゲームパッドの設定をし、終わったら[Save]をクリックして終了する。
- xinput1_3.dllをxinput9_1_0.dllにリネームする。
- ビルドしたアプリと同フォルダにx360ce.iniとxinput9_1_0.dllを入れる。
- アプリを起動する。
私のx360ce.iniの設定は次のようになりました。
下記はJC-U3412Sの例です。ゲームパッドの種類によってAxisの番号やボタンの番号は異なります。
x360ce.ini
Unity標準のInputを使うようにOVRPlayerController.csを書き換える
Unity標準のInputを使うようにOVRPlayerController.csを書き換えてみます。
下記はJC-U3412Sの例です。ゲームパッドの種類によってAxisの番号やボタンの番号は異なります。
- Unityエディタで[Editor]>[Project Settings]>[Input]を開く。
- Axes配下のSize欄の数字を5増やす。
- Name欄をRightHorizontalとし、Axis欄を3rd axisに設定する。他の項目は既存のHorizontal*2と同一にする。
- Name欄をDpadVerticalとし、Axis欄を6th axisに設定する。他の項目は既存のVertical*3と同一にする。
- Name欄をLeftShoulderとし、Positive Button欄をjoystick button 4に設定する。他の項目は既存のFire1*4と同一にする。
- Name欄をRightShoulderとし、Positive Button欄をjoystick button 5に設定する。他の項目は既存のFire1*5と同一にする。
- Name欄をLeftTriggerとし、Positive Button欄をjoystick button 6に設定する。他の項目は既存のFire1*6と同一にする。
- OVRPlayerController.csを開く。
- 左スティック部分を下記のように修正する。
- 修正前
float leftAxisX = OVRGamepadController.GPC_GetAxis(OVRGamepadController.Axis.LeftXAxis); float leftAxisY = OVRGamepadController.GPC_GetAxis(OVRGamepadController.Axis.LeftYAxis);
- 修正後
float leftAxisX = Input.GetAxis("Horizontal"); float leftAxisY = Input.GetAxis("Vertical");
- 修正前
- 右スティック部分を下記のように修正する。
- 修正前
float rightAxisX = OVRGamepadController.GPC_GetAxis(OVRGamepadController.Axis.RightXAxis);
- 修正後
float rightAxisX = Input.GetAxis("RightHorizontal");
- 修正前
- 十字キー部分を下記のように修正する。
- 修正前
if (OVRGamepadController.GPC_GetButton(OVRGamepadController.Button.Up))
- 修正後
if (Input.GetAxis("DpadVertical") > 0f)
- 修正前
- 十字キー部分を下記のように修正する。
- 修正前
if (OVRGamepadController.GPC_GetButton(OVRGamepadController.Button.Down))
- 修正後
if (Input.GetAxis("DpadVertical") < 0f)
- 修正前
- LeftShoulder部分を下記のように修正する。
- 修正前
bool curHatLeft = OVRGamepadController.GPC_GetButton(OVRGamepadController.Button.LeftShoulder);
- 修正後
bool curHatLeft = Input.GetButton("LeftShoulder");
- 修正前
- RightShoulder部分を下記のように修正する。
- 修正前
bool curHatRight = OVRGamepadController.GPC_GetButton(OVRGamepadController.Button.RightShoulder);
- 修正後
bool curHatRight = Input.GetButton("RightShoulder");
- 修正前
- LeftTrigger部分を下記のように修正する。
- 修正前
moveInfluence *= 1.0f + OVRGamepadController.GPC_GetAxis(OVRGamepadController.Axis.LeftTrigger);
- 修正後
if (Input.GetButton("LeftTrigger")) { moveInfluence *= 5f; }
- 修正前
Oculus Unity Integration 0.6.0.0を導入するとエラーが出る件の回避策
Oculus Unity Integration 0.6.0.0を導入すると、OVRGamepadController.csで下記のようなエラーが発生します。
ArgumentException: Input Button Desktop_Up is not setup.
To change the input settings use: Edit -> Project Settings -> Input
OVRGamepadController.DefaultReadButton (Button button) (at Assets/OVR/Scripts/Util/OVRGamepadController.cs:292)
OVRGamepadController.GPC_GetButton (Button button) (at Assets/OVR/Scripts/Util/OVRGamepadController.cs:303)
OVRPlayerController.UpdateMovement () (at Assets/OVR/Scripts/Util/OVRPlayerController.cs:226)
OVRPlayerController.Update () (at Assets/OVR/Scripts/Util/OVRPlayerController.cs:174)
原因はOVRGamepadController.csが求める定義がInputManagerにないためです。
定義をすれば済むのですが、面倒なので、簡単に導入できるようにしました。
下記をダウンロード、解凍し、ご自分のプロジェクトのフォルダ内のProjectSettingsフォルダ内の"InputManager.asset"ファイルと置き換えてください。
(公式フォーラムのこちらの投稿に添付したものと同一です。)
もちろんご自分のファイルのバックアップをお忘れなく。
なお、Unity 5.0.2p1で作成したファイルであるため、他のバージョンのUnityでは使用できない可能性があります。
また、あくまで回避策であり、恒久的な対処については公式の対応をお待ちください。