Включить / отключить VR из кода

Как я могу программно установить стереоскопическое отображение в Unity для приложения, развернутого на устройстве Android?

Мне нужно меню пользовательского интерфейса, где пользователь может переключаться между "режимом VR" и обычным режимом. Я не хочу режим VR по умолчанию, так как он должен быть опцией во время выполнения. Я знаю, что в настройках сборки есть параметр "Поддерживается виртуальная реальность", но опять же, я не хочу, чтобы он был включен по умолчанию.

5 ответов

Решение

Включают using UnityEngine.XR; на вершине.

Вызов XRSettings.LoadDeviceByName("") с пустой строкой, за которой следует XRSettings.enabled = false; отключить VR в функции запуска, чтобы отключить VR.

Если вы хотите включить его позже, позвоните XRSettings.LoadDeviceByName("daydream") с именем VR, сопровождаемым XRSettings.enabled = true;,

Вы должны ждать кадра между каждым вызовом функции. Это требует, чтобы это было сделано функцией сопрограммы.

Кроме того, на некоторых устройствах VR необходимо перейти в " Правка" -> " Настройки проекта" -> " Плеер" и убедиться, что флажок " Поддерживаемая виртуальная реальность" установлен (true), прежде чем это сработает. Затем вы можете отключить его в функции "Пуск" и включить его в любое время.

РЕДАКТИРОВАТЬ:

Известно, что это работает на некоторых устройствах VR и не на всех устройствах VR. Хотя, это должно работать на Daydream VR. Полный пример кода:

IEnumerator LoadDevice(string newDevice, bool enable)
{
    XRSettings.LoadDeviceByName(newDevice);
    yield return null;
    XRSettings.enabled = enable;
}

void EnableVR()
{
    StartCoroutine(LoadDevice("daydream", true));
}

void DisableVR()
{
    StartCoroutine(LoadDevice("", false));
}

Вызов EnableVR() включить vr и DisableVR() отключить это. Если вы используете что-то, кроме daydream, передайте имя этого устройства VR на LoadDevice функция в EnableVR() функция.

Для более новых сборок Unity (например, 2019.4.0f1) вы можете использовать пакет XR Plugin Management.

Чтобы включить звонок:

XRGeneralSettings.Instance.Manager.InitializeLoader();

Чтобы отключить звонок:

XRGeneralSettings.Instance.Manager.DeinitializeLoader();

Я использую Unity 2021, но это, вероятно, работает в более ранних версиях, я также использую XR Plug-in Management.

Начинать: XRGeneralSettings.Instance.Manager.StartSubsystems();

Останавливаться: XRGeneralSettings.Instance.Manager.StopSubsystems();

Полная документация по адресу:https://docs.unity3d.com/Packages/ [email protected] /manual/EndUser.html

2020.3.14f1

У меня не работает, я получаю эту ошибку при запуске приложения для Android.

Вызов DeinitializeLoader без инициализированного менеджера. Перед вызовом этого API обязательно дождитесь завершения инициализации.

      [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
        static void AfterAssembliesLoaded()
        {
            XRGeneralSettings.Instance.Manager.DeinitializeLoader();
        }

Пробовал все RuntimeInitializeLoadType аннотации.

 public void Awake() {
          StartCoroutine(SwitchToVR(()=>{
                Debug.Log("Switched to VR Mode");
          }));

          //For disable VR Mode
          XRSettings.enabled = false;
  }
 
  IEnumerator SwitchToVR(Action callback) {
            // Device names are lowercase, as returned by `XRSettings.supportedDevices`.
            // Google original, makes you specify
            // string desiredDevice = "daydream"; // Or "cardboard".
            // XRSettings.LoadDeviceByName(desiredDevice);
            // this is slightly better;
            
            string[] Devices = new string[] { "daydream", "cardboard" };
             XRSettings.LoadDeviceByName(Devices);
      
            // Must wait one frame after calling `XRSettings.LoadDeviceByName()`.
            yield return null;
          
            // Now it's ok to enable VR mode.
            XRSettings.enabled = true;
            callback.Invoke();
   }
Другие вопросы по тегам