sea-battle/Assets/Scripts/Settings/SettingsManager.cs
2026-01-09 08:45:22 +03:00

139 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}