139 lines
4.7 KiB
C#
139 lines
4.7 KiB
C#
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();
|
||
}
|
||
|
||
|
||
|
||
} |