/// <summary>
        /// See [XRLoader.Initialize](xref:UnityEngine.XR.Management.XRLoader.Initialize)
        /// </summary>
        /// <returns>True if initialized, false otherwise.</returns>
        public override bool Initialize()
        {
            if (currentLoaderState == LoaderState.Initialized)
            {
                return(true);
            }

            if (!validLoaderInitStates.Contains(currentLoaderState))
            {
                return(false);
            }

            if (Instance != null)
            {
                Debug.LogError("Only one OpenXRLoader can be initialized at any given time");
                return(false);
            }

#if UNITY_EDITOR
            if (!DisableValidationChecksOnEnteringPlaymode)
            {
                if (OpenXRProjectValidation.LogPlaymodeValidationIssues())
                {
                    return(false);
                }
            }

            OpenXRSettings.Instance.lastPlayVersion = UnityEditor.PackageManager.PackageInfo.FindForAssembly(GetType().Assembly)?.version;
#endif

            DiagnosticReport.StartReport();

            // Wrap the initialization in a try catch block to ensure if any exceptions are thrown that
            // we cleanup, otherwise the user will not be able to run again until they restart the editor.
            try
            {
                if (InitializeInternal())
                {
                    return(true);
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
            }

            Deinitialize();
            Instance = null;
            OpenXRAnalytics.SendInitializeEvent(false);

            return(false);
        }
Пример #2
0
        public void ValidationError()
        {
            bool errorFixed = false;

            // Set up a validation check ...
            MockRuntime.Instance.TestCallback = (s, o) =>
            {
                if (s == "GetValidationChecks")
                {
                    var validationChecks = o as List <OpenXRFeature.ValidationRule>;
                    validationChecks?.Add(new OpenXRFeature.ValidationRule
                    {
                        message        = "Mock Validation Fail",
                        checkPredicate = () => errorFixed,
                        fixIt          = () => errorFixed = true,
                        error          = true
                    });
                }

                return(true);
            };

            // Try to build the player ...
            var report = zBuildHookTests.BuildMockPlayer();

            // It will fail because of the above validation issue ...
            Assert.AreEqual(BuildResult.Failed, report.summary.result);

            // There's one validation issue ...
            var validationIssues = new List <OpenXRFeature.ValidationRule>();

            OpenXRProjectValidation.GetCurrentValidationIssues(validationIssues, BuildTargetGroup.Standalone);
            Assert.AreEqual(1, validationIssues.Count);

            // Fix it ...
            Assert.IsFalse(errorFixed);
            validationIssues[0].fixIt.Invoke();
            Assert.IsTrue(errorFixed);

            // Now there's zero validation issues ...
            OpenXRProjectValidation.GetCurrentValidationIssues(validationIssues, BuildTargetGroup.Standalone);
            Assert.AreEqual(0, validationIssues.Count);

            // Close the validation window ...
            OpenXRProjectValidationWindow.CloseWindow();
        }
Пример #3
0
        private bool InitializeInternal()
        {
            Instance = this;

            currentLoaderState = LoaderState.InitializeAttempted;

#if TEST_SUPPORT
            if (ShouldExitEarly())
            {
                return(false);
            }
#endif

#if UNITY_EDITOR
            if (!DisableValidationChecksOnEnteringPlaymode)
            {
                if (OpenXRProjectValidation.LogPlaymodeValidationIssues())
                {
                    return(false);
                }
            }
#endif

            OpenXRFeature.Initialize();

            if (!LoadOpenXRSymbols())
            {
                Debug.LogError("Failed to load openxr runtime loader.");
                return(false);
            }

            // Sort the features array by priority in descending order (highest priority first)
            OpenXRSettings.Instance.features = OpenXRSettings.Instance.features
                                               .Where(f => f != null)
                                               .OrderByDescending(f => f.priority)
                                               .ThenBy(f => f.nameUi)
                                               .ToArray();

            OpenXRFeature.HookGetInstanceProcAddr();

            if (!Internal_InitializeSession())
            {
                return(false);
            }

            SetApplicationInfo();
            RequestOpenXRFeatures();
            RegisterOpenXRCallbacks();

            if (null != OpenXRSettings.Instance)
            {
                OpenXRSettings.Instance.ApplySettings();
            }

            if (!CreateSubsystems())
            {
                return(false);
            }

            if (OpenXRFeature.requiredFeatureFailed)
            {
                return(false);
            }

            OpenXRAnalytics.SendInitializeEvent(true);

            OpenXRFeature.ReceiveLoaderEvent(this, OpenXRFeature.LoaderEvent.SubsystemCreate);

            OpenXRInput.Initialize();

            DebugLogEnabledSpecExtensions();

            Application.onBeforeRender += ProcessOpenXRMessageLoop;
            currentLoaderState          = LoaderState.Initialized;
            return(true);
        }
        public UnityXRRecommendedSettings()
        {
#if VIU_OPENXR && VIU_XR_GENERAL_SETTINGS
            Add(new VIUVersionCheck.RecommendedSetting <int>
            {
                settingTitle     = "Review OpenXR Project Validation Issues",
                skipCheckFunc    = () => !VIUSettingsEditor.PackageManagerHelper.IsPackageInList(VIUSettingsEditor.OPENXR_PLUGIN_PACKAGE_NAME) || !XRPluginManagementUtils.IsXRLoaderEnabled(UnityXRModule.OPENXR_LOADER_NAME, VIUSettingsEditor.activeBuildTargetGroup),
                currentValueFunc = () => {
                    OpenXRProjectValidation.GetCurrentValidationIssues(s_tempOpenXRValidationIssues, VIUSettingsEditor.activeBuildTargetGroup);
                    return(s_tempOpenXRValidationIssues.Count);
                },
                setValueFunc = (int value) =>
                {
                    try
                    {
                        Assembly openXREditorAsm = null;
                        foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
                        {
                            if (asm.GetName().Name == "Unity.XR.OpenXR.Editor")
                            {
                                openXREditorAsm = asm;
                                break;
                            }
                        }

                        MethodInfo openWindowMethod = openXREditorAsm.GetType("UnityEditor.XR.OpenXR.OpenXRProjectValidationWindow", true).GetMethod("ShowWindow", BindingFlags.NonPublic | BindingFlags.Static);
                        openWindowMethod.Invoke(null, new object[] { VIUSettingsEditor.activeBuildTargetGroup });
                    }
                    catch (Exception e)
                    {
                        Debug.LogError("Failed to open OpenXRProjectValidationWindow: " + e);
                    }
                },
                recommendedValue = 0,
            });

            Add(new VIUVersionCheck.RecommendedSetting <bool>
            {
                settingTitle     = "Enable All Feature Sets",
                skipCheckFunc    = () => !VIUSettingsEditor.PackageManagerHelper.IsPackageInList(VIUSettingsEditor.OPENXR_PLUGIN_PACKAGE_NAME) || !XRPluginManagementUtils.IsXRLoaderEnabled(UnityXRModule.OPENXR_LOADER_NAME, VIUSettingsEditor.activeBuildTargetGroup),
                currentValueFunc = () =>
                {
                    return(OpenXRSettings.ActiveBuildTargetInstance.GetFeatures <OpenXRInteractionFeature>().All(feature => feature.enabled));
                },
                setValueFunc = (bool value) =>
                {
                    if (!value)
                    {
                        return;
                    }

                    OpenXRFeature[] features = OpenXRSettings.ActiveBuildTargetInstance.GetFeatures <OpenXRInteractionFeature>();
                    foreach (OpenXRFeature feature in features)
                    {
                        feature.enabled = true;
                    }
                },
                recommendedValue = true,
            });
#endif
        }