using UnityEditor; using AppleHills.Core.Settings; using Core; using UnityEngine; using UnityEngine.Rendering.VirtualTexturing; namespace AppleHills.Editor { /// /// Provides access to settings in editor (non-play) mode /// [InitializeOnLoad] public static class EditorSettingsProvider { private static PlayerFollowerSettings _playerFollowerSettings; private static InteractionSettings _interactionSettings; private static DivingMinigameSettings _divingMinigameSettings; // Static constructor will be called when Unity loads/reloads scripts static EditorSettingsProvider() { LoadAllSettings(); // Set up the delegates in SettingsAccess AppleHills.SettingsAccess.SetupEditorProviders( GetPlayerStopDistance, GetPlayerStopDistanceDirectInteraction, GetPuzzlePromptRange ); // Subscribe to asset changes to auto-refresh when settings are modified EditorApplication.delayCall += () => { EditorApplication.projectChanged += OnProjectChanged; }; } private static void OnProjectChanged() { // Check if any settings assets have changed if (HasSettingsChanged()) { LoadAllSettings(); RefreshSceneViews(); } } private static bool HasSettingsChanged() { // Simplified check - you might want to make this more efficient // by checking timestamps or specific files return true; } public static void LoadAllSettings() { _playerFollowerSettings = AssetDatabase.LoadAssetAtPath("Assets/Settings/PlayerFollowerSettings.asset"); _interactionSettings = AssetDatabase.LoadAssetAtPath("Assets/Settings/InteractionSettings.asset"); _divingMinigameSettings = AssetDatabase.LoadAssetAtPath("Assets/Settings/MinigameSettings.asset"); // Re-register the delegates in case they were lost AppleHills.SettingsAccess.SetupEditorProviders( GetPlayerStopDistance, GetPlayerStopDistanceDirectInteraction, GetPuzzlePromptRange ); LogDebugMessage("Editor settings loaded for Scene View use"); } public static void RefreshSceneViews() { // Force scene views to repaint to refresh gizmos SceneView.RepaintAll(); } // Implementation of delegate methods private static float GetPlayerStopDistance() { return _interactionSettings?.PlayerStopDistance ?? 6.0f; } private static float GetPlayerStopDistanceDirectInteraction() { return _interactionSettings?.PlayerStopDistanceDirectInteraction ?? 2.0f; } private static float GetPuzzlePromptRange() { return _interactionSettings?.DefaultPuzzlePromptRange ?? 3.0f; } // Other utility methods public static T GetSettings() where T : BaseSettings { if (typeof(T) == typeof(PlayerFollowerSettings)) return _playerFollowerSettings as T; else if (typeof(T) == typeof(InteractionSettings)) return _interactionSettings as T; else if (typeof(T) == typeof(DivingMinigameSettings)) return _divingMinigameSettings as T; return null; } private static void LogDebugMessage(string message) { if (Application.isPlaying && DeveloperSettingsProvider.Instance.GetSettings().settingsLogVerbosity <= LogVerbosity.Debug) { Logging.Debug($"[EditorSettingsProvider] {message}"); } } } }