Отключить/включить VR из кода с помощью SteamVR 2.0.1

Как следует из названия, я пытаюсь включить/отключить VR между разными приложениями, и мне нужно делать это столько раз, сколько я хочу. Я использую Unity 2017.4 и SteamVR 2.0.1. Я пытаюсь сделать это с двумя разными сценами одного и того же проекта (тестирую одну в редакторе, а другую запускаю как .exe).

Это решение не работает, так как очевидно, что действия и позы обрабатываются неправильно, когда VR остановлен с XRSettings.enabled = false.

Кто-нибудь испытал такое же поведение?

Я попытался найти обходной путь:

1) Отключение/включение также Player и Hands

    ...
    // ** 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) В файл SteamVR.cs добавлены следующие строки:

private void Dispose(bool disposing)
    {
        ...

        // added code
        SteamVR_Input.initialized = false;
        SteamVR_Behaviour.instance = null;
    }

(Чтобы заставить его работать, мне пришлось добавить публичный сеттер для свойства SteamVR_Behaviour.instance).

3) В SteamVR_Behaviour я добавил проверку внутри Update(), LateUpdate() и FixedUpdate():

if (_instance != null) ... // do update

Эти модификации на самом деле не решат проблемы, потому что у меня все еще есть некоторые исключения, когда я снова включаю 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)

...но они поднимаются всего несколько раз, а затем останавливаются. Это может быть связано с каким-то неудачным временем. Кстати, я поместил интерактивный игровой объект в пустую сцену, чтобы проверить, могу ли я по-прежнему взаимодействовать с ним после отключения/включения, и кажется, что могу.

Тем не менее, я бы ожидал более простого и чистого метода для достижения моей цели. Я упустил что-то очевидное или это ошибка последней версии SteamVR?

Заранее благодарю за любую помощь.


person ireth86    schedule 24.01.2019    source источник
comment
Для завершения было обсуждено возможное решение: github.com/ValveSoftware/steamvr_unity_plugin/issues. /307   -  person ireth86    schedule 12.02.2019


Ответы (1)


Пожалуйста, смотрите эту ссылку для справки

https://docs.unity3d.com/ScriptReference/XR.XRSettings-enabled.html

Остановка сеанса виртуальной реальности не поддерживается в GearVR, не уверен насчет SteamVR.

person zambari    schedule 24.01.2019
comment
Привет zambari, извините, что значит не поддерживается? Unity или SteamVR? - person ireth86; 24.01.2019
comment
мой первоначальный ответ был частично неправильным, см. обновленный ответ - person zambari; 24.01.2019