Включить / отключить 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();
}