using System; using System.Collections.Generic; using System.Linq; using Unity.XR.CoreUtils.Editor; using UnityEngine.XR.Interaction.Toolkit; namespace UnityEditor.XR.Interaction.Toolkit.Samples { /// /// Unity Editor class which registers Project Validation rules for the Starter Assets sample package. /// class StarterAssetsSampleProjectValidation { const string k_Category = "XR Interaction Toolkit"; const string k_StarterAssetsSampleName = "Starter Assets"; const string k_TeleportLayerName = "Teleport"; const int k_TeleportLayerIndex = 31; static readonly BuildTargetGroup[] s_BuildTargetGroups = ((BuildTargetGroup[])Enum.GetValues(typeof(BuildTargetGroup))).Distinct().ToArray(); static readonly List s_BuildValidationRules = new List(); [InitializeOnLoadMethod] static void RegisterProjectValidationRules() { // In the Player Settings UI we have to delay the call one frame to let the settings provider get initialized // since we need to access the settings asset to set the rule's non-delegate properties (FixItAutomatic). EditorApplication.delayCall += AddRules; } static void AddRules() { if (s_BuildValidationRules.Count == 0) { s_BuildValidationRules.Add( new BuildValidationRule { Category = k_Category, Message = $"[{k_StarterAssetsSampleName}] Interaction Layer {k_TeleportLayerIndex} should be set to '{k_TeleportLayerName}' for teleportation locomotion.", FixItMessage = $"XR Interaction Toolkit samples reserve Interaction Layer {k_TeleportLayerIndex} for teleportation locomotion. Set Interaction Layer {k_TeleportLayerIndex} to '{k_TeleportLayerName}' to prevent conflicts.", HelpText = "Please note Interaction Layers are unique to the XR Interaction Toolkit and can be found in Edit > Project Settings > XR Plug-in Management > XR Interaction Toolkit", FixItAutomatic = InteractionLayerSettings.Instance.IsLayerEmpty(k_TeleportLayerIndex) || IsInteractionLayerTeleport(), Error = false, CheckPredicate = IsInteractionLayerTeleport, FixIt = () => { if (InteractionLayerSettings.Instance.IsLayerEmpty(k_TeleportLayerIndex) || DisplayTeleportDialog()) InteractionLayerSettings.Instance.SetLayerNameAt(k_TeleportLayerIndex, k_TeleportLayerName); else SettingsService.OpenProjectSettings(XRInteractionToolkitSettingsProvider.k_SettingsPath); }, }); } foreach (var buildTargetGroup in s_BuildTargetGroups) { BuildValidator.AddRules(buildTargetGroup, s_BuildValidationRules); } } static bool IsInteractionLayerTeleport() { return string.Equals(InteractionLayerSettings.Instance.GetLayerNameAt(k_TeleportLayerIndex), k_TeleportLayerName, StringComparison.OrdinalIgnoreCase); } static bool DisplayTeleportDialog() { return EditorUtility.DisplayDialog( "Fixing Teleport Interaction Layer", $"Interaction Layer {k_TeleportLayerIndex} for teleportation locomotion is currently set to '{InteractionLayerSettings.Instance.GetLayerNameAt(k_TeleportLayerIndex)}' instead of '{k_TeleportLayerName}'", "Automatically Replace", "Cancel"); } } }