using System; using System.Collections; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace UnityEngine.XR.Management { /// General settings container used to house the instance of the active settings as well as the manager /// instance used to load the loaders with. /// public class XRGeneralSettings : ScriptableObject { /// The key used to query to get the current loader settings. public static string k_SettingsKey = "com.unity.xr.management.loader_settings"; internal static XRGeneralSettings s_RuntimeSettingsInstance = null; [SerializeField] internal XRManagerSettings m_LoaderManagerInstance = null; [SerializeField] [Tooltip("Toggling this on/off will enable/disable the automatic startup of XR at run time.")] internal bool m_InitManagerOnStart = true; /// The current active manager used to manage XR lifetime. public XRManagerSettings Manager { get { return m_LoaderManagerInstance; } set { m_LoaderManagerInstance = value; } } private XRManagerSettings m_XRManager = null; #pragma warning disable 414 // Suppress warning for needed variables. private bool m_ProviderIntialized = false; private bool m_ProviderStarted = false; #pragma warning restore 414 /// The current settings instance. public static XRGeneralSettings Instance { get { return s_RuntimeSettingsInstance; } #if UNITY_EDITOR set { s_RuntimeSettingsInstance = value; } #endif } /// The current active manager used to manage XR lifetime. public XRManagerSettings AssignedSettings { get { return m_LoaderManagerInstance; } #if UNITY_EDITOR set { m_LoaderManagerInstance = value; } #endif } /// Used to set if the manager is activated and initialized on startup. public bool InitManagerOnStart { get { return m_InitManagerOnStart; } #if UNITY_EDITOR set { m_InitManagerOnStart = value; } #endif } #if !UNITY_EDITOR void Awake() { Debug.Log("XRGeneral Settings awakening..."); s_RuntimeSettingsInstance = this; Application.quitting += Quit; DontDestroyOnLoad(s_RuntimeSettingsInstance); } #endif #if UNITY_EDITOR /// For internal use only. [System.Obsolete("Deprecating internal only API.")] public void InternalPauseStateChanged(PauseState state) { throw new NotImplementedException(); } /// For internal use only. public void InternalPlayModeStateChanged(PlayModeStateChange state) { switch (state) { case PlayModeStateChange.ExitingPlayMode: Quit(); break; case PlayModeStateChange.ExitingEditMode: case PlayModeStateChange.EnteredPlayMode: case PlayModeStateChange.EnteredEditMode: break; } } #endif static void Quit() { XRGeneralSettings instance = XRGeneralSettings.Instance; if (instance == null) return; instance.DeInitXRSDK(); } void Start() { StartXRSDK(); } void OnDestroy() { DeInitXRSDK(); } [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)] internal static void AttemptInitializeXRSDKOnLoad() { XRGeneralSettings instance = XRGeneralSettings.Instance; if (instance == null || !instance.InitManagerOnStart) return; instance.InitXRSDK(); } [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)] internal static void AttemptStartXRSDKOnBeforeSplashScreen() { XRGeneralSettings instance = XRGeneralSettings.Instance; if (instance == null || !instance.InitManagerOnStart) return; instance.StartXRSDK(); } private void InitXRSDK() { if (XRGeneralSettings.Instance == null || XRGeneralSettings.Instance.m_LoaderManagerInstance == null || XRGeneralSettings.Instance.m_InitManagerOnStart == false) return; m_XRManager = XRGeneralSettings.Instance.m_LoaderManagerInstance; if (m_XRManager == null) { Debug.LogError("Assigned GameObject for XR Management loading is invalid. No XR Providers will be automatically loaded."); return; } m_XRManager.automaticLoading = false; m_XRManager.automaticRunning = false; m_XRManager.InitializeLoaderSync(); m_ProviderIntialized = true; } private void StartXRSDK() { if (m_XRManager != null && m_XRManager.activeLoader != null) { m_XRManager.StartSubsystems(); m_ProviderStarted = true; } } private void StopXRSDK() { if (m_XRManager != null && m_XRManager.activeLoader != null) { m_XRManager.StopSubsystems(); m_ProviderStarted = false; } } private void DeInitXRSDK() { if (m_XRManager != null && m_XRManager.activeLoader != null) { m_XRManager.DeinitializeLoader(); m_XRManager = null; m_ProviderIntialized = false; } } } }