using System; using Continentis.MainGame.Saving; using SLSUtilities.General; using UnityEngine; namespace Continentis.MainGame { /// /// 负责游戏存档的读写、校验和删除。 /// 跨场景持久,挂载在初始场景的 SaveManager GameObject 上。 /// 内存中缓存一份 GameSave,所有操作均通过缓存进行, /// 保证 PlayerSave(成就、统计)不会被跑局操作意外覆盖。 /// public class SaveManager : Singleton { private const string SaveKey = "GameSave"; private const string SaveFilePath = "save.es3"; /// 内存中的存档缓存,Awake 时从文件加载,不存在则新建。 private GameSave _cache; // ── 生命周期 ────────────────────────────────────────────────────── protected override void Awake() { Initialize(dontDestroy: true); LoadOrCreate(); } // ── 查询 API ────────────────────────────────────────────────────── /// 返回缓存中的 PlayerSave(账号级数据)。 public PlayerSave PlayerData => _cache.playerData; /// 判断当前是否存在未完成的跑局。 public bool HasActiveRun() => _cache.HasActiveRun; // ── 跑局存档 API ────────────────────────────────────────────────── /// /// 将 RunSave 写入缓存并持久化。 /// 由 MainGameManager 在开局和节点边界(战斗胜利后)调用。 /// public void SaveRunSave(RunSave runSave) { _cache.currentRun = runSave; Flush(); } /// /// 清除当前跑局(战斗失败 / 放弃跑局),保留 PlayerSave。 /// public void DeleteRunSave() { _cache.currentRun = null; Flush(); Debug.Log("[Save] 跑局存档已清除(PlayerSave 保留)。"); } /// 返回缓存中的 RunSave,若无进行中的跑局则返回 null。 public RunSave GetRunSave() => _cache.currentRun; // ── 账号存档 API ────────────────────────────────────────────────── /// /// 更新 PlayerSave 并持久化(解锁内容、统计数据变更时调用)。 /// public void SavePlayerData(PlayerSave playerSave) { _cache.playerData = playerSave; Flush(); } // ── 全局存档 API ────────────────────────────────────────────────── /// /// 清除所有存档数据,包括 PlayerSave(账号重置时调用)。 /// public void DeleteAllData() { if (ES3.FileExists(SaveFilePath)) { ES3.DeleteFile(SaveFilePath); Debug.Log("[Save] 所有存档已删除。"); } _cache = new GameSave(); } // ── 内部方法 ────────────────────────────────────────────────────── /// 从文件加载 GameSave;文件不存在则新建并立即持久化。 private void LoadOrCreate() { if (!ES3.FileExists(SaveFilePath)) { _cache = new GameSave(); Flush(); Debug.Log("[Save] 未找到存档文件,已新建。"); return; } try { _cache = ES3.Load(SaveKey, SaveFilePath, defaultValue: null) ?? new GameSave(); Debug.Log($"[Save] 存档加载成功(版本 {_cache.saveVersion})。"); } catch (Exception e) { Debug.LogError($"[Save] 存档加载异常,将新建:{e.Message}"); _cache = new GameSave(); Flush(); } } /// 将当前缓存写入文件。 private void Flush() { _cache.saveTime = DateTime.UtcNow; ES3.Save(SaveKey, _cache, SaveFilePath); } } }