using UnityEditor; using UnityEditor.XR.Management; using UnityEditor.XR.Management.Metadata; using UnityEngine; using UnityEngine.XR.Management; #if XR_COMPOSITION_LAYERS using UnityEngine.XR.OpenXR; using UnityEngine.XR.OpenXR.Features.CompositionLayers; #endif namespace DTrierFlood.Editor { static class OpenXRQuestSetup { const string GeneralSettingsPath = "Assets/XR/XRGeneralSettingsPerBuildTarget.asset"; const string OpenXRLoaderType = "UnityEngine.XR.OpenXR.OpenXRLoader"; [MenuItem("Tools/XR/Setup OpenXR for Quest (No Meta SDK)")] static void Setup() { var generalSettings = EnsureGeneralSettingsAsset(); EnsureBuildTarget(generalSettings, BuildTargetGroup.Android); #if XR_COMPOSITION_LAYERS EnableCompositionLayersFeature(BuildTargetGroup.Android); EnableCompositionLayersFeature(BuildTargetGroup.Standalone); #endif AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log("OpenXR is configured for Android. Build the project for Quest using OpenXR."); } static XRGeneralSettingsPerBuildTarget EnsureGeneralSettingsAsset() { var settings = AssetDatabase.LoadAssetAtPath(GeneralSettingsPath); if (settings != null) { EditorBuildSettings.AddConfigObject(XRGeneralSettings.k_SettingsKey, settings, true); return settings; } if (!AssetDatabase.IsValidFolder("Assets/XR")) { AssetDatabase.CreateFolder("Assets", "XR"); } settings = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(settings, GeneralSettingsPath); EditorBuildSettings.AddConfigObject(XRGeneralSettings.k_SettingsKey, settings, true); EditorUtility.SetDirty(settings); return settings; } static void EnsureBuildTarget(XRGeneralSettingsPerBuildTarget settings, BuildTargetGroup targetGroup) { if (!settings.HasSettingsForBuildTarget(targetGroup)) { settings.CreateDefaultSettingsForBuildTarget(targetGroup); } if (!settings.HasManagerSettingsForBuildTarget(targetGroup)) { settings.CreateDefaultManagerSettingsForBuildTarget(targetGroup); } var generalSettings = settings.SettingsForBuildTarget(targetGroup); if (generalSettings != null) { generalSettings.InitManagerOnStart = true; EditorUtility.SetDirty(generalSettings); } var managerSettings = settings.ManagerSettingsForBuildTarget(targetGroup); if (managerSettings != null) { XRPackageMetadataStore.AssignLoader(managerSettings, OpenXRLoaderType, targetGroup); EditorUtility.SetDirty(managerSettings); } EditorUtility.SetDirty(settings); } #if XR_COMPOSITION_LAYERS static void EnableCompositionLayersFeature(BuildTargetGroup targetGroup) { var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); if (settings == null) { Debug.LogWarning($"OpenXR settings not found for {targetGroup}."); return; } var feature = settings.GetFeature(); if (feature == null) { Debug.LogWarning($"OpenXR Composition Layers feature not found for {targetGroup}."); return; } feature.enabled = true; EditorUtility.SetDirty(feature); EditorUtility.SetDirty(settings); } #endif } }