/* * @Author: 白哉 * @Description: 成就数据管理 * @Date: 2025年05月14日 星期三 21:05:54 * @Modify: */ using System.Collections.Generic; using System.IO; using Logic.Achievement; using Logic.CrashSight; using UnityEngine; namespace RuntimeData { public class AchievementDataManager { public static AchievementDataManager Instance = new AchievementDataManager(); public AchievementData Achievement; public List FinishedCache; public void OnGameStart(MapData map) { Init(); BindMapData(map); ReCheckAchievementDataNotComplete(); } public void Init() { LoadAchievement(); ReCheckAchievementDataNotComplete(); } public void LoadAchievement() { string path = Application.persistentDataPath + "/achievement.json"; if (File.Exists(path)) { string json = File.ReadAllText(path); Achievement = JsonUtility.FromJson(json); } if (Achievement == null) { var asset = Resources.Load("Export/Achievement"); Achievement = asset.Data; Achievement.ClearAchievementFinishedInfo(); } FinishedCache ??= new List(); FinishedCache.Clear(); } public void BindMapData(MapData mapData) { foreach (var item in Achievement.AchievementList) item.BindMapData(mapData); } public void ReCheckAchievementDataNotComplete() { foreach (var item in Achievement.AchievementList) item.ReCheckConditionsNotComplete(); } public void OnTurnStart(MapData map, PlayerData player) { foreach (var item in Achievement.AchievementList) item.OnTurnStart(map, player); } public void OnTrainUnit(MapData map, PlayerData player, CityData city, UnitData newUnit) { foreach (var item in Achievement.AchievementList) item.OnTrainUnit(map, player, city, newUnit); } public void OnBuildWonder(MapData map, PlayerData player, CityData city, GridData grid) { foreach (var item in Achievement.AchievementList) item.OnBuildWonder(map, player, city, grid); } public void OnKillUnit(MapData map, UnitData origin, UnitData target) { foreach (var item in Achievement.AchievementList) item.OnKillUnit(map, origin, target); } public void OnUnitMove(MapData map, UnitData unit, GridData gridData) { foreach (var item in Achievement.AchievementList) item.OnUnitMove(map, unit, gridData); } public bool IsFinished(uint bigId, uint smallId, uint internalID) { var item = Achievement.GetAchievementItem(bigId, smallId, internalID); if (item == null) return false; return item.IsFinished; } public string GetNoFinishDescription(uint bigId, uint smallId, uint internalID) { var item = Achievement.GetAchievementItem(bigId, smallId, internalID); if (item == null) return ""; if (item.IsFinished) return ""; return item.GetConditionDescription(); } public void SaveAchievementData() { if (Achievement == null) return; string json = JsonUtility.ToJson(Achievement); string path = Application.persistentDataPath + "/achievement.json"; int retryCount = 3; while (retryCount > 0) { try { using (StreamWriter writer = new StreamWriter(path, false)) { writer.Write(json); writer.Close(); } return; } catch (IOException ex) { retryCount--; if (retryCount <= 0) { LogSystem.LogError($"保存成就数据失败: {ex.Message}"); } } } } } }