using System.IO; using UnityEngine; namespace BaseGames.Core { /// /// 全局设置管理器。从 GlobalSettingsSO 读取默认值,从文件加载用户覆盖。 /// [DefaultExecutionOrder(-800)] public class SettingsManager : MonoBehaviour { private const string SettingsFileName = "settings.json"; [SerializeField] private GlobalSettingsSO _defaultSettings; private GlobalSettingsData _current; private string SettingsFilePath => Path.Combine(Application.persistentDataPath, SettingsFileName); public GlobalSettingsData Current => _current; /// 由 GameManager.Awake 调用。读取设置文件,应用音量/分辨率。 public void Initialize() { _current = Load() ?? _defaultSettings?.CreateDefault() ?? new GlobalSettingsData(); Apply(_current); } private GlobalSettingsData Load() { if (!File.Exists(SettingsFilePath)) return null; try { var json = File.ReadAllText(SettingsFilePath); return JsonUtility.FromJson(json); } catch { return null; } } public void Save() { try { var json = JsonUtility.ToJson(_current, true); File.WriteAllText(SettingsFilePath, json); } catch (System.Exception e) { Debug.LogWarning($"[SettingsManager] 设置保存失败: {e.Message}"); } } private void Apply(GlobalSettingsData data) { QualitySettings.vSyncCount = data.VSync ? 1 : 0; if (!data.VSync) Application.targetFrameRate = data.TargetFPS; if (data.FullScreen) Screen.fullScreenMode = FullScreenMode.FullScreenWindow; } // ── 音量设置(调用 AudioManager,Phase 1 接通)──────────────────── public void SetMasterVolume(float v) { _current.MasterVolume = v; Save(); } public void SetBGMVolume(float v) { _current.BGMVolume = v; Save(); } public void SetSFXVolume(float v) { _current.SFXVolume = v; Save(); } public void SetAmbientVolume(float v) { _current.AmbientVolume = v; Save(); } // ── 画面设置 ────────────────────────────────────────────────────── public void SetResolution(int w, int h, FullScreenMode mode) { Screen.SetResolution(w, h, mode); _current.FullScreen = (mode != FullScreenMode.Windowed); Save(); } public void SetVSync(bool enabled) { _current.VSync = enabled; QualitySettings.vSyncCount = enabled ? 1 : 0; Save(); } public void SetTargetFrameRate(int fps) { _current.TargetFPS = fps; if (!_current.VSync) Application.targetFrameRate = fps; Save(); } public void SetLanguage(string localeCode) { _current.Language = localeCode; Save(); } } }