using System; using UnityEngine; using UnityEngine.Events; public class SettingsManager : MonoBehaviour { public static SettingsManager instance; public GameSettings gameSettings; [Tooltip("ScriptableObject с дефолтными настройками. Если не задан, используются встроенные дефолты.")] public SettingsData settingsData; // ActualHash теперь берётся из модели (меньше аллокаций) int ActualHash { get { if (settingsData != null) return settingsData.GetDefaultsHash(); var tmp = SettingsData.CreateGameSettingsFromDefaults(); return tmp.hash; } } public UnityEvent OnSettingsChanged; private void Awake() { instance ??= this; OnSettingsChanged = new UnityEvent(); LoadOrCreateSettings(); } private void LoadOrCreateSettings() { // Полностью делегируем работу с файлом модели if (settingsData != null) { gameSettings = settingsData.LoadOrCreateFromDefaultPath(); Debug.Log("[SettingsManager] Loaded settings via SettingsData model (default path)."); return; } // Если модель не задана — используем статические методы модели (путь по умолчанию) gameSettings = SettingsData.LoadOrCreateFromFileDefault(); Debug.Log("[SettingsManager] Loaded settings via SettingsData static helper (default path)."); } public void ChangeSetting(string settingName, int newIndex) { if (gameSettings == null || gameSettings.settings == null) { Debug.LogWarning("SettingsManager.ChangeSetting called but gameSettings is null"); return; } var setting = gameSettings.GetSetting(settingName); if (setting != null && newIndex >= 0 && newIndex < setting.options.Count) { setting.chosenIndex = newIndex; SaveSettings(); } } public void SaveSettings() { if (gameSettings == null) { Debug.LogWarning("SaveSettings called but gameSettings is null - creating default."); gameSettings = (settingsData != null) ? settingsData.CreateGameSettings() : SettingsData.CreateGameSettingsFromDefaults(); } // Делегируем сохранение в модель, если она задана bool ok; if (settingsData != null) { ok = settingsData.TrySaveToDefaultPath(gameSettings); if (ok) Debug.Log($"[SettingsManager] Settings saved via SettingsData (default path)."); else Debug.LogError($"[SettingsManager] Failed to save settings via SettingsData (default path)."); } else { ok = SettingsData.SaveToDefaultPath(gameSettings); if (ok) Debug.Log($"[SettingsManager] Settings saved via SettingsData static (default path)."); else Debug.LogError($"[SettingsManager] Failed to save settings via SettingsData static (default path)."); } OnSettingsChanged?.Invoke(); } public string GetSettingValue(string settingName) { if (gameSettings == null) return string.Empty; var s = gameSettings.GetSetting(settingName); return s != null ? s.ChosenOption : string.Empty; } void LoadDefaultSettings() { // Получаем готовую модель настроек из SettingsData (модель отвечает за дефолты и хеш) if (settingsData != null) { gameSettings = settingsData.CreateGameSettings(); } else { gameSettings = SettingsData.CreateGameSettingsFromDefaults(); } SaveSettings(); } void LoadSettings() { // Делегируем загрузку модели через SettingsData (путь по умолчанию) GameSettings loaded = null; if (settingsData != null) { loaded = settingsData.TryLoadFromDefaultPath(); } else { loaded = SettingsData.LoadFromDefaultPath(); } if (loaded != null) { gameSettings = loaded; // Обновляем файл, чтобы синхронизировать хеш/формат при изменениях дефолтов SaveSettings(); return; } // Если не удалось загрузить — создаём дефолтные LoadDefaultSettings(); } }