using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using UnityEngine; namespace AibisDream.SaveSystem.CloudSave { /// /// 云存档协调器:负责选择当前平台的 backend,并在槽位写入/读取后触发同步钩子。 /// /// P2 不实现真实云同步逻辑,仅保留扩展点。 /// /// public static class CloudSaveManager { private static readonly List Backends = new(); /// 注册一个云存档后端。应在游戏启动时调用一次。 public static void RegisterBackend(ICloudSaveBackend backend) { if (backend == null) { return; } Backends.Add(backend); } /// 清空已注册后端(主要用于测试)。 public static void ClearBackends() { Backends.Clear(); } /// 槽位写入后调用:触发所有可用后端的异步上传。 public static void OnSlotWritten(int slotIndex) { _ = UploadSlotAsync(slotIndex); } /// 槽位读取前调用:可触发下载(P2 默认不自动下载,避免覆盖本地进度)。 public static void OnSlotRestored(int slotIndex) { // P2 占位:未来可在此触发冲突检测与下载。 } /// 手动触发指定槽位的云同步上传。 public static async Task UploadSlotAsync(int slotIndex) { var filePaths = CollectSlotFilePaths(slotIndex); if (filePaths.Count == 0) { return; } foreach (var backend in Backends) { if (!backend.IsAvailable) { continue; } try { await backend.UploadSlotAsync(slotIndex, filePaths.ToArray()); Debug.Log($"[CloudSaveManager] {backend.PlatformName} 上传槽位 {slotIndex} 完成。"); } catch (Exception ex) { Debug.LogWarning($"[CloudSaveManager] {backend.PlatformName} 上传槽位 {slotIndex} 失败: {ex.Message}"); } } } /// 收集槽位下需要同步的文件路径。 private static List CollectSlotFilePaths(int slotIndex) { var paths = new List(); var snapshotPath = SlotDirectory.GetSnapshotPath(slotIndex); if (File.Exists(snapshotPath)) { paths.Add(snapshotPath); } var metaPath = SlotDirectory.GetMetaPath(slotIndex); if (File.Exists(metaPath)) { paths.Add(metaPath); } var thumbnailPath = SlotDirectory.GetThumbnailPath(slotIndex); if (File.Exists(thumbnailPath)) { paths.Add(thumbnailPath); } return paths; } } }