我正在新的Oculus Go中测试几个我的three.js应用程序。我想知道是否有可能仅使用GamePad API来访问 Controller ,而GamePad API似乎已在主流浏览器中提供。

查看Oculus文档,似乎可以通过Unity随附的OVRManager或通过UnReal Blueprints完成。但是我试图避免另一条学习曲线,并且在可以避免的情况下扩大我的应用程序。

作为VR的新手,似乎最有利的前进方式只是通过执行类似这样的操作来使用Gamepad API(其实质还不是有效的代码,但我试图解决这个问题使用这种方法,除了进入VR模式时中断应用程序,到目前为止没有其他结果):

var gamePadState = {
  lastButtons: {},
  lastAxes: {}
};

function onGamePad(){

    Array.prototype.forEach.call( navigator.getGamepads(), function (activePad, padIndex){
      if ( activePad.connected ) {
        if (activePad.id.includes("Oculus Go")) {
          // Process buttons and axes for the Gear VR touch panel
          activePad.buttons.forEach( function ( gamepadButton, buttonIndex ){
            if ( buttonIndex === 0 && gamepadButton.pressed && !lastButtons[buttonIndex]){
              // Handle tap
              dollyCam.translateZ( -0.01 );
            }
            gamePadState.lastButtons[buttonIndex] = gamepadButton.pressed;
          });

          activePad.axes.forEach( function (axisValue, axisIndex ) {
            if (axisIndex === 0 && axisValue < 0 && lastAxes[axisIndex] >= 0 ){
              // Handle swipe right
            } else if (axisIndex === 0 && axisValue > 0 && lastAxes[axisIndex] <= 0) {
              // Handle swipe left
            } else if (axisIndex === 1 && axisValue < 0 && lastAxes[axisIndex] >= 0) {
              // Handle swipe up
            } else if (axisIndex === 1 && axisValue > 0 && lastAxes[axisIndex] <= 0) {
              // Handle swipe down
            }
            gamePadState.lastAxes[axisIndex] = axisValue;
          });
        } else {
          // This is a connected Bluetooth gamepad which you may want to support in your VR experience
        }
      }
    });

}

在针对该主题的another, narrower question中,建议我在应用程序中创建一个Unity构建以获得所需的结果,这似乎既是一条额外的学习曲线,又增加了我的开销。如果需要,我会这样做,但如果不需要,我宁愿不这样做。

最终,我希望能够使用如下逻辑支持大多数“主要” Controller :
onGamePad( event ){

    var gamePads = navigator.getGamepads();

    if ( gamePads && gamePads.length > 0 && event.isSomeGamePadEventOfSomeSort ){
        for ( var p = 0; p < gamePads.length; p ++ ){
            if ( gamePads[ p ].id.includes( "Oculus Go" ) ){
                // process buttons and axes for the Oculus Go Controller here
                if ( event[ some property... gamePad?? ].id.includes( "Oculus Go" ) && event[ some property... gamePad?? ].button.pressed === someIndex ){
                    doSomething();
                }
            }
            else if ( gamePads[ p ].id.includes( "Oculus Gear VR" ){
                // Process buttons and axes for the Oculus Gear VR Controller here...
            }
        }
    }

}

但是出于测试目的,我很高兴现在就可以使用Oculus Go Controller 。

那么...是否可以通过Gamepad API访问Oculus Go Controller ,以及如何访问设备属性(如按钮,轴和方向以及相关的Gamepad事件)?

谢谢。

最佳答案

当然,您可以直接使用Gamepad API,而无需求助于Unity。几个月前,我编写了自己的Oculus Go controller,它花费的代码比您想象的要少得多。由于我的代码已在GitHub上免费提供,因此我不会将其复制到此站点。

10-08 16:21