実行可能なアプローチを見つけました。私はDS4Toolソースを取得し、必要なビットをUnityプロジェクトにコピーして、デバイスからレポートを直接読み取れるようにしました。
(それがありますNativeMethodsの Kernel32.dllの、からデバイスの列挙とのインタフェースクラスHidDevices、およびからのレポートを読んでHidDeviceのクラスIは、できるだけ簡単に物事を保つために残りの部分を切り取る- 。私はちょうど新しいのスレッドポーリングを持っています可能な限り高速なデータ。)
このガイドでは、64バイトレポート内のモーションセンサーデータの場所を教えてくれました。少し実験的なテストで、データがgsとラジアン/秒になっているように見えます。
accel = new Vector3(
System.BitConverter.ToInt16(_inputBuffer, 19),
System.BitConverter.ToInt16(_inputBuffer, 21),
System.BitConverter.ToInt16(_inputBuffer, 23)
)/8192f;
gyro = new Vector3(
System.BitConverter.ToInt16(_inputBuffer, 13),
System.BitConverter.ToInt16(_inputBuffer, 15),
System.BitConverter.ToInt16(_inputBuffer, 17)
)/1024f;
これは、右向きの座標系で、x +右、y +上、z +がプレーヤーを指します。
この方法でデータを取得しても、UnityのInputManagerには影響しません。UnityのInputManagerは、非標準のドライバーをダウンロードしたり、バックグラウンドで追加のソフトウェアを実行したりすることなく、期待どおりにボタンとスティックを取得します。
更新:ワイヤレス(Bluetooth)
これをワイヤレスで機能するように拡張する2つの問題(および2つの解決策)が見つかりました。
DualShock 4は、(Windows 8より前の)Windows とのペアリングを維持したくありません。この愚かな手順は、Windows 7でそれを回避するようです。
Bluetooth経由で接続した場合、モーションセンサーデータはありません。モーションデータを送信するためにデバイスに出力レポートを書き込む必要があることを発見しました(メソッドについてはHidDevice、マジックナンバーについてはDS4Deviceを参照)。これが完了すると、返される入力レポートは2バイトずつシフトされます。