我找到了一种可行的方法。我抓住了DS4Tool的源并将所需的位复制到Unity项目中,以便可以直接从设备读取报告。
(这是用于与Kernel32.dll进行交互的NativeMethods类,该类是HidDevices的设备枚举,并从HidDevice类读取报告。我剪掉了其余部分,以使事情尽可能简单-我刚好有一个线程轮询新线程尽可能快的数据。)
本指南告诉我在64字节报告中的哪里可以找到运动传感器数据。进行一些实证测试,结果看起来像这样将数据转换为gs和弧度/ sec:
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,后者仍会按预期拾取按钮和操纵杆,而无需下载非标准驱动程序或在后台运行其他软件。
更新:无线(蓝牙)
我发现了将其扩展为无线工作的两个问题(和两个解决方案):
DualShock 4s不希望与Windows(Windows 8之前)保持配对。这个愚蠢的过程似乎可以在Windows 7上解决。
通过蓝牙连接时,没有运动传感器数据。我发现您需要向设备写入输出报告(有关方法请参见HidDevice,有关幻数请参见DS4Device)以哄骗其发送运动数据。完成此操作后,您取回的输入报告将移动2个字节。