在Unity中检测Oculus头戴式显示器

5
public Transform OculusPlayerPrefab;
public Transform DefaultPlayerPrefab;
void Start() {
    Transform player = OVRDevice.IsHMDPresent() ?
        (Transform)Instantiate(OculusPlayerPrefab) :
        (Transform)Instantiate(DefaultPlayerPrefab);
    player.position = transform.position;
}

这段代码应该检测 Oculus Rift 头戴式显示器是否已连接并实例化 Oculus Player 预制件,否则使用默认预制件。然而,IsHMDPresent() 方法无论 Oculus Rift 是否连接都返回 false。在 Unity/Oculus 整合包中,OVRMainMenu 使用 IsHMDPresent() 方法并获得了期望的结果。


嗨Gigimoi,关于你的代码有个问题:这基本上意味着如果你的Oculus预制件被实例化了,你就不需要手动拖动预制件并将其放置在层次面板中。对吧? - user285372
3个回答

2

编辑:此答案来自2014年,基于Unity 4。您可能想要使用其他答案。

我发现这种方法效果最佳:

Ovr.Hmd.Detect() > 0

同时记得使用HMDLost/HMDAcquired事件,这样你就不必每帧都进行轮询了:

bool oculusPresent=false;
void CheckOculusPresence() {
  oculusPresent=Ovr.Hmd.Detect() > 0;
}

void Start() {
  CheckOculusPresence();
  OVRManager.HMDAcquired+=CheckOculusPresence;
  OVRManager.HMDLost+=CheckOculusPresence;
}

(oculus SDK 0.4.3/unity3d 4.5.5, OSX/Windows)


大家好,我使用了以下代码:if ( Ovr.Hmd.Detect() > 0 ) Debug.Log ( "Rift detected . ." );这段代码运行良好,但是当我使用以下代码时:if ( OVRManager.display.isPresent && OVRManager.tracker.isPresent ) Debug.Log ( "Both display and tracker are present!" );却没有任何输出...有什么想法吗?谢谢。 - user285372
@Jtech,你的方法有什么优势吗?另外,你测试这个方法用的是哪个版本的SDK? - Krzysztof Bociurko
嗨,我正在使用Oculus版本1.5(SDK 0.4.4)和Unity版本4.6.1f1,但我只能使用您建议的(Ovr.Hmd.Detect() > 0),所以我遇到的另一个(OVRManager.display.isPresent && OVRManager.tracker.isPresent)实际上没有返回任何东西,我不知道为什么!您能否尝试一下并查看是否可以使其返回结果? - user285372
目前我手头没有Rift,但在0.4.3版本中这是我找到的最可靠的方法 - 为什么你不使用它呢? - Krzysztof Bociurko
我正在使用 (Ovr.Hmd.Detect() > 0) ,但我也想知道为什么另一个 (OVRManager.display.isPresent && OVRManager.tracker.isPresent) 没有返回任何内容? - user285372
@Jtech 我正在使用移动 SDK,但 isPresent 在这里不起作用。ChanibaL:可能是因为文档指向 isPresent 是“正确”的方法。尽管如此,我会尝试这种方法。 - Abandoned Cart

2

从Unity 2018.2版本开始,使用Oculus Utilities,以下内容是有效的:

Original Answer翻译成"最初的回答"

if (OVRManager.isHMDPresent) {
    // headset connected
}

我想补充一下,你也可以订阅HMDMountedHMDUnmounted事件,这与原始答案有些相关。
OVRManager.HMDMounted   += MyOnHMDMountedFunction();
OVRManager.HMDUnmounted += MyOnHMDUnmountedFunction();

当你戴上(HMDMounted)或取下(HMDUnmounted)头戴式显示器时,这些事件将被触发。


2

虽然这可能回答了问题,但最好在此处包含答案的基本部分,并提供参考链接。 - IKavanagh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接