169 lines
5.6 KiB
C#
169 lines
5.6 KiB
C#
using UnityEngine;
|
|
using AppleHills.Core.Settings;
|
|
using System;
|
|
|
|
/// <summary>
|
|
/// Singleton manager for global game state and settings. Provides accessors for various gameplay parameters.
|
|
/// </summary>
|
|
public class GameManager : MonoBehaviour
|
|
{
|
|
private static GameManager _instance;
|
|
private static bool _isQuitting = false;
|
|
|
|
/// <summary>
|
|
/// Singleton instance of the GameManager.
|
|
/// </summary>
|
|
public static GameManager Instance
|
|
{
|
|
get
|
|
{
|
|
if (_instance == null && Application.isPlaying && !_isQuitting)
|
|
{
|
|
_instance = FindAnyObjectByType<GameManager>();
|
|
if (_instance == null)
|
|
{
|
|
var go = new GameObject("GameManager");
|
|
_instance = go.AddComponent<GameManager>();
|
|
// DontDestroyOnLoad(go);
|
|
}
|
|
}
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
[Header("Settings Status")]
|
|
[SerializeField] private bool _settingsLoaded = false;
|
|
[SerializeField] private bool _developerSettingsLoaded = false;
|
|
public bool SettingsLoaded => _settingsLoaded;
|
|
public bool DeveloperSettingsLoaded => _developerSettingsLoaded;
|
|
|
|
void Awake()
|
|
{
|
|
_instance = this;
|
|
|
|
// Create settings provider if it doesn't exist
|
|
SettingsProvider.Instance.gameObject.name = "Settings Provider";
|
|
|
|
// Create developer settings provider if it doesn't exist
|
|
DeveloperSettingsProvider.Instance.gameObject.name = "Developer Settings Provider";
|
|
|
|
// Load all settings synchronously during Awake
|
|
InitializeSettings();
|
|
InitializeDeveloperSettings();
|
|
|
|
// DontDestroyOnLoad(gameObject);
|
|
}
|
|
|
|
private void InitializeSettings()
|
|
{
|
|
Debug.Log("Starting settings initialization...");
|
|
|
|
// Load settings synchronously
|
|
var playerSettings = SettingsProvider.Instance.LoadSettingsSynchronous<PlayerFollowerSettings>();
|
|
var interactionSettings = SettingsProvider.Instance.LoadSettingsSynchronous<InteractionSettings>();
|
|
var minigameSettings = SettingsProvider.Instance.LoadSettingsSynchronous<DivingMinigameSettings>();
|
|
|
|
// Register settings with service locator
|
|
if (playerSettings != null)
|
|
{
|
|
ServiceLocator.Register<IPlayerFollowerSettings>(playerSettings);
|
|
Debug.Log("PlayerFollowerSettings registered successfully");
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Failed to load PlayerFollowerSettings");
|
|
}
|
|
|
|
if (interactionSettings != null)
|
|
{
|
|
ServiceLocator.Register<IInteractionSettings>(interactionSettings);
|
|
Debug.Log("InteractionSettings registered successfully");
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Failed to load InteractionSettings");
|
|
}
|
|
|
|
if (minigameSettings != null)
|
|
{
|
|
ServiceLocator.Register<IDivingMinigameSettings>(minigameSettings);
|
|
Debug.Log("MinigameSettings registered successfully");
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Failed to load MinigameSettings");
|
|
}
|
|
|
|
// Log success
|
|
_settingsLoaded = playerSettings != null && interactionSettings != null && minigameSettings != null;
|
|
if (_settingsLoaded)
|
|
{
|
|
Debug.Log("All settings loaded and registered with ServiceLocator");
|
|
}
|
|
else
|
|
{
|
|
Debug.LogWarning("Some settings failed to load - check that all settings assets exist and are marked as Addressables");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Check for and initialize developer settings.
|
|
/// </summary>
|
|
private void InitializeDeveloperSettings()
|
|
{
|
|
Debug.Log("Starting developer settings initialization...");
|
|
|
|
// Load developer settings
|
|
var divingDevSettings = DeveloperSettingsProvider.Instance.GetSettings<DivingDeveloperSettings>();
|
|
|
|
_developerSettingsLoaded = divingDevSettings != null;
|
|
|
|
if (_developerSettingsLoaded)
|
|
{
|
|
Debug.Log("All developer settings loaded successfully");
|
|
}
|
|
else
|
|
{
|
|
Debug.LogWarning("Some developer settings failed to load");
|
|
}
|
|
}
|
|
|
|
void OnApplicationQuit()
|
|
{
|
|
_isQuitting = true;
|
|
ServiceLocator.Clear();
|
|
}
|
|
|
|
// Helper method to get settings
|
|
private T GetSettings<T>() where T : class
|
|
{
|
|
return ServiceLocator.Get<T>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the entire settings object of specified type.
|
|
/// </summary>
|
|
/// <typeparam name="T">Type of settings to retrieve</typeparam>
|
|
/// <returns>The settings object or null if not found</returns>
|
|
public static T GetSettingsObject<T>() where T : class
|
|
{
|
|
return Instance?.GetSettings<T>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the developer settings object of specified type.
|
|
/// </summary>
|
|
/// <typeparam name="T">Type of developer settings to retrieve</typeparam>
|
|
/// <returns>The developer settings object or null if not found</returns>
|
|
public static T GetDeveloperSettings<T>() where T : BaseDeveloperSettings
|
|
{
|
|
return DeveloperSettingsProvider.Instance?.GetSettings<T>();
|
|
}
|
|
|
|
// LEFTOVER LEGACY SETTINGS
|
|
public float PlayerStopDistance => GetSettings<IInteractionSettings>()?.PlayerStopDistance ?? 6.0f;
|
|
public float PlayerStopDistanceDirectInteraction => GetSettings<IInteractionSettings>()?.PlayerStopDistanceDirectInteraction ?? 2.0f;
|
|
public float DefaultPuzzlePromptRange => GetSettings<IInteractionSettings>()?.DefaultPuzzlePromptRange ?? 3.0f;
|
|
|
|
}
|