C# 使用SteamVR 2.0.1从代码中禁用/启用VR

C# 使用SteamVR 2.0.1从代码中禁用/启用VR,c#,unity3d,virtual-reality,htc-vive,steamvr,C#,Unity3d,Virtual Reality,Htc Vive,Steamvr,正如标题所说,我正在尝试在不同的应用程序之间启用/禁用VR,我需要尽可能多次地这样做。 我使用的是Unity 2017.4和SteamVR 2.0.1。我正试图用同一个项目的两个不同场景来实现这一点,一个在编辑器中测试,另一个作为.exe启动 无法正常工作,因为当VR停止时,XRSettings.enabled=false显然无法正确处理动作和姿势 有没有人经历过同样的行为 我试图找到一个解决办法: 1同时禁用/启用玩家和手 ... // ** ENABLE VR **

正如标题所说,我正在尝试在不同的应用程序之间启用/禁用VR,我需要尽可能多次地这样做。 我使用的是Unity 2017.4和SteamVR 2.0.1。我正试图用同一个项目的两个不同场景来实现这一点,一个在编辑器中测试,另一个作为.exe启动

无法正常工作,因为当VR停止时,XRSettings.enabled=false显然无法正确处理动作和姿势

有没有人经历过同样的行为

我试图找到一个解决办法:

1同时禁用/启用玩家和手

    ...
    // ** ENABLE VR **
    if (enable)
    {
        print("Enabling VR ...");

        XRSettings.LoadDeviceByName("OpenVR");
        yield return null;

        print("Loaded device: " + XRSettings.loadedDeviceName);
        XRSettings.enabled = enable;
        EnablePlayerAndHands(true);
    }
    // ** DISABLE VR **
    else
    {
        print("Disabling VR ...");

        EnablePlayerAndHands(false);
        XRSettings.LoadDeviceByName("");
        yield return null;

        print("Loaded device: " + XRSettings.loadedDeviceName);
        XRSettings.enabled = false;
    }
    ...
2在streamvr.cs文件中添加了以下行:

private void Dispose(bool disposing)
    {
        ...

        // added code
        SteamVR_Input.initialized = false;
        SteamVR_Behaviour.instance = null;
    }
为了使其工作,我必须为streamvr_behavior.instance属性添加一个公共setter

3在SteamVR_行为中,我在Update、LateUpdate和FixeUpdate中添加了一个检查:

if (_instance != null) ... // do update
这些修改实际上并不能解决问题,因为我在启用back VR时仍有一些例外情况,例如:

GetPoseActionData error (/actions/default/in/SkeletonLeftHand): InvalidHandle handle: 1152990670760182193
UnityEngine.Debug:LogError(Object)
Valve.VR.SteamVR_Action_Pose:UpdateValue(SteamVR_Input_Sources, Boolean) (at Assets/SteamVR/Input/SteamVR_Action_Pose.cs:96)
Valve.VR.SteamVR_Action_Skeleton:UpdateValue(SteamVR_Input_Sources, Boolean) (at Assets/SteamVR/Input/SteamVR_Action_Skeleton.cs:75)
Valve.VR.SteamVR_Input:UpdateSkeletonActions(SteamVR_Input_Sources, Boolean) (at Assets/SteamVR/Input/SteamVR_Input.cs:487)
Valve.VR.SteamVR_Input:UpdateSkeletonActions(Boolean) (at Assets/SteamVR/Input/SteamVR_Input.cs:462)
Valve.VR.SteamVR_Input:LateUpdate() (at Assets/SteamVR/Input/SteamVR_Input.cs:352)
Valve.VR.SteamVR_Behaviour:LateUpdate() (at Assets/SteamVR/Scripts/SteamVR_Behaviour.cs:224)
……但他们只被养了几次,然后就停了下来。这可能是由于时间安排不当。顺便说一句,我在空场景中放置了一个可交互的游戏对象,只是为了测试在禁用/启用后我是否仍然可以与它交互,而且似乎我可以

尽管如此,我还是希望有一些更简单更干净的方法来实现我的目标。我是否遗漏了一些明显的东西,或者是来自最新版本的bug


提前感谢您的帮助。

请查看此链接以供参考


GearVR中不支持停止VR会话,不确定SteamVR是否支持

嗨,zambari,对不起,您的意思是不支持什么?我最初的答案基本上是错的,请参阅你的答案为了完成,我们已经讨论了一个可能的解决方案: