using UnityEditor; using AppleHills.Core.Settings; using Core; namespace AppleHills.Editor { /// /// Provides access to settings in editor (non-play) mode /// [InitializeOnLoad] public static class EditorSettingsProvider { // Gameplay Settings private static PlayerFollowerSettings _playerFollowerSettings; private static InteractionSettings _interactionSettings; private static DivingMinigameSettings _divingMinigameSettings; private static Minigames.FortFight.Core.FortFightSettings _fortFightSettings; // Developer Settings private static FortFightDeveloperSettings _fortFightDeveloperSettings; private static DivingDeveloperSettings _divingDeveloperSettings; // Static constructor will be called when Unity loads/reloads scripts static EditorSettingsProvider() { LoadAllSettings(); // Set up the delegates in SettingsAccess (includes Fort Fight) AppleHills.SettingsAccess.SetupEditorProviders( GetPlayerStopDistance, GetPlayerStopDistanceDirectInteraction, GetPuzzlePromptRange, GetWeakPointExplosionRadius ); // 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() { // Load gameplay settings _playerFollowerSettings = AssetDatabase.LoadAssetAtPath("Assets/Settings/PlayerFollowerSettings.asset"); _interactionSettings = AssetDatabase.LoadAssetAtPath("Assets/Settings/InteractionSettings.asset"); _divingMinigameSettings = AssetDatabase.LoadAssetAtPath("Assets/Settings/MinigameSettings.asset"); _fortFightSettings = AssetDatabase.LoadAssetAtPath("Assets/Settings/FortFightSettings.asset"); // Load developer settings _fortFightDeveloperSettings = AssetDatabase.LoadAssetAtPath("Assets/Settings/Developer/FortFightDeveloperSettings.asset"); _divingDeveloperSettings = AssetDatabase.LoadAssetAtPath("Assets/Settings/Developer/DivingDeveloperSettings.asset"); // Re-register the delegates in case they were lost AppleHills.SettingsAccess.SetupEditorProviders( GetPlayerStopDistance, GetPlayerStopDistanceDirectInteraction, GetPuzzlePromptRange, GetWeakPointExplosionRadius ); Logging.Debug("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; } // Fort Fight delegate methods private static float GetWeakPointExplosionRadius() { return _fortFightSettings?.WeakPointExplosionRadius ?? 2.5f; } // 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; else if (typeof(T) == typeof(Minigames.FortFight.Core.FortFightSettings)) return _fortFightSettings as T; return null; } /// /// Get developer settings in editor mode (for OnDrawGizmos, etc.) /// public static T GetDeveloperSettings() where T : BaseDeveloperSettings { if (typeof(T) == typeof(FortFightDeveloperSettings)) return _fortFightDeveloperSettings as T; else if (typeof(T) == typeof(DivingDeveloperSettings)) return _divingDeveloperSettings as T; return null; } } }