Files
AppleHillsProduction/Assets/Editor/Settings/EditorSettingsProvider.cs
tschesky e60d516e7e Implement Fort Fight minigame (#75)
Co-authored-by: Michal Pikulski <michal.a.pikulski@gmail.com>
Reviewed-on: #75
2025-12-04 01:18:29 +00:00

117 lines
4.3 KiB
C#

using UnityEditor;
using AppleHills.Core.Settings;
using Core;
namespace AppleHills.Editor
{
/// <summary>
/// Provides access to settings in editor (non-play) mode
/// </summary>
[InitializeOnLoad]
public static class EditorSettingsProvider
{
private static PlayerFollowerSettings _playerFollowerSettings;
private static InteractionSettings _interactionSettings;
private static DivingMinigameSettings _divingMinigameSettings;
private static Minigames.FortFight.Core.FortFightSettings _fortFightSettings;
// 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()
{
_playerFollowerSettings = AssetDatabase.LoadAssetAtPath<PlayerFollowerSettings>("Assets/Settings/PlayerFollowerSettings.asset");
_interactionSettings = AssetDatabase.LoadAssetAtPath<InteractionSettings>("Assets/Settings/InteractionSettings.asset");
_divingMinigameSettings = AssetDatabase.LoadAssetAtPath<DivingMinigameSettings>("Assets/Settings/MinigameSettings.asset");
_fortFightSettings = AssetDatabase.LoadAssetAtPath<Minigames.FortFight.Core.FortFightSettings>("Assets/Settings/FortFightSettings.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<T>() 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;
}
}
}