Top/Devel/OculusRift/ゲームパッド

ゲームパッドはてなブックマーク

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つあります。


  1. x360ceを使ってXInputに見せかける
  2. Unity標準のInputを使うようにOVRPlayerController.csを書き換える

x360ceを使ってXInputに見せる

x360ce(XBOX 360 Controller emulator)というソフトで、
DirectInput仕様のゲームパッドをXInput仕様のゲームパッドのように見せかけることが出来ます。


手順は次のとおり。

  1. アプリをビルドする。
  2. x360ceをダウンロードし、解凍する。
  3. x360ce.exeを起動する。
  4. "'x360ce.ini' was not found." "Do you want to create this file?"と聞かれるので、[Yes]をクリックする。
  5. "'xinput1_3.dll' was not found." "Do you want to create this file?"と聞かれるので、[Yes]をクリックする。
  6. そのままx360ceでゲームパッドの設定をし、終わったら[Save]をクリックして終了する。
  7. xinput1_3.dllをxinput9_1_0.dllにリネームする。
  8. ビルドしたアプリと同フォルダにx360ce.iniとxinput9_1_0.dllを入れる。
  9. アプリを起動する。


私のx360ce.iniの設定は次のようになりました。
下記はJC-U3412Sの例です。ゲームパッドの種類によってAxisの番号やボタンの番号は異なります。

filex360ce.ini
[Options]
UseInitBeep=0
Log=0
Console=0
DebugMode=0
InternetDatabaseUrl=http://www.x360ce.com/webservices/x360ce.asmx
InternetFeatures=1
InternetAutoload=1
AllowOnlyOneCopy=1
ProgramScanLocations=C:\Program Files,C:\Program Files (x86)
Version=1

[InputHook]
HookMode=1

[Mappings]
PAD1=IG_8f295a10fe4411e38001444553540000
PAD2=
PAD3=
PAD4=

[PAD1]
[PAD2]
[PAD3]
[PAD4]

[IG_8f295a10fe4411e38001444553540000]
ProductName=Elecom Wireless Gamepad
ProductGuid=100605b8-0000-0000-0000-504944564944
InstanceGuid=8f295a10-fe44-11e3-8001-444553540000
AxisToDPadDeadZone=256
AxisToDPad=0
AxisToDPadOffset=0
A=3
B=4
GuideButton=
Back=9
Start=10
X=1
Y=2
D-pad POV=
D-pad Down=DOWN
D-pad Left=LEFT
D-pad Right=RIGHT
D-pad Up=UP
UseForceFeedback=0
ForcePercent=100
SwapMotor=0
FFBType=0
ControllerType=1
LeftMotorPeriod=60
LeftMotorStrength=100
Left Shoulder=5
Left Analog X AntiDeadZone=0
Left Analog Y AntiDeadZone=0
Left Analog X Linear=0
Left Analog Y Linear=0
Left Analog X=1
Left Analog Y=-2
Left Thumb=0
Left Analog X DeadZone=0
Left Analog Y DeadZone=0
Left Analog Y- Button=0
Left Analog X- Button=0
Left Analog X+ Button=0
Left Analog Y+ Button=0
Left Trigger=7
LeftTriggerDeadzone=0
PassThrough=0
RightMotorPeriod=120
RightMotorStrength=100
Right Shoulder=6
Right Analog X AntiDeadZone=0
Right Analog Y AntiDeadZone=0
Right Analog X Linear=0
Right Analog Y Linear=0
Right Analog X=3
Right Analog Y=-6
Right Thumb=0
Right Analog X DeadZone=0
Right Analog Y DeadZone=0
Right Analog Y- Button=0
Right Analog X- Button=0
Right Analog X+ Button=0
Right Analog Y+ Button=0
Right Trigger=8
RightTriggerDeadZone=0
MapToPad=0

Unity標準のInputを使うようにOVRPlayerController.csを書き換える

Unity標準のInputを使うようにOVRPlayerController.csを書き換えてみます。
下記はJC-U3412Sの例です。ゲームパッドの種類によってAxisの番号やボタンの番号は異なります。


  1. Unityエディタで[Editor]>[Project Settings]>[Input]を開く。
  2. Axes配下のSize欄の数字を5増やす。
  3. Name欄をRightHorizontalとし、Axis欄を3rd axisに設定する。他の項目は既存のHorizontal*2と同一にする。
  4. Name欄をDpadVerticalとし、Axis欄を6th axisに設定する。他の項目は既存のVertical*3と同一にする。
  5. Name欄をLeftShoulderとし、Positive Button欄をjoystick button 4に設定する。他の項目は既存のFire1*4と同一にする。
  6. Name欄をRightShoulderとし、Positive Button欄をjoystick button 5に設定する。他の項目は既存のFire1*5と同一にする。
  7. Name欄をLeftTriggerとし、Positive Button欄をjoystick button 6に設定する。他の項目は既存のFire1*6と同一にする。
  8. OVRPlayerController.csを開く。
  9. 左スティック部分を下記のように修正する。
    • 修正前
      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");
  10. 右スティック部分を下記のように修正する。
    • 修正前
      float rightAxisX = OVRGamepadController.GPC_GetAxis(OVRGamepadController.Axis.RightXAxis);
    • 修正後
      float rightAxisX = Input.GetAxis("RightHorizontal");
  11. 十字キー部分を下記のように修正する。
    • 修正前
      if (OVRGamepadController.GPC_GetButton(OVRGamepadController.Button.Up))
    • 修正後
      if (Input.GetAxis("DpadVertical") > 0f)
  12. 十字キー部分を下記のように修正する。
    • 修正前
      if (OVRGamepadController.GPC_GetButton(OVRGamepadController.Button.Down))
    • 修正後
      if (Input.GetAxis("DpadVertical") < 0f)
  13. LeftShoulder部分を下記のように修正する。
    • 修正前
      bool curHatLeft = OVRGamepadController.GPC_GetButton(OVRGamepadController.Button.LeftShoulder);
    • 修正後
      bool curHatLeft = Input.GetButton("LeftShoulder");
  14. RightShoulder部分を下記のように修正する。
    • 修正前
      bool curHatRight = OVRGamepadController.GPC_GetButton(OVRGamepadController.Button.RightShoulder);
    • 修正後
      bool curHatRight = Input.GetButton("RightShoulder");
  15. LeftTrigger部分を下記のように修正する。
    • 修正前
      moveInfluence *= 1.0f + OVRGamepadController.GPC_GetAxis(OVRGamepadController.Axis.LeftTrigger);
    • 修正後
      if (Input.GetButton("LeftTrigger"))
      {
          moveInfluence *= 5f;
      }

Oculus Unity Integration 0.6.0.0を導入するとエラーが出る件の回避策 Permalinkはてなブックマーク

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では使用できない可能性があります。


また、あくまで回避策であり、恒久的な対処については公式の対応をお待ちください。

参考

Amazon

*1 根拠はOculus Unity Integration Guideの"On Windows systems, the gamepad must be XInput-compliant."という記述です。
*2 Type欄がJoystick Axisの方のHorizontal
*3 Type欄がJoystick Axisの方のVertical
*4 Positive Button欄がjoystick button 0の方のFire1
*5 Positive Button欄がjoystick button 0の方のFire1
*6 Positive Button欄がjoystick button 0の方のFire1
差分 一覧