/* * @Author: 白哉 * @Description: 游戏的成就系统数据 * @Date: 2025年05月14日 星期三 19:05:32 * @Modify: */ using System; using System.Collections.Generic; using UnityEngine; namespace Logic.Achievement { public class AchievementAsset : ScriptableObject { public AchievementData Data; public AchievementAsset() { Data = new AchievementData(); } } [Serializable] public class AchievementData { public List AchievementList; private Dictionary _achievementItems; public AchievementData() { AchievementList = new List(); } public void AddNewAchievementItem(uint big, uint small) { RefreshAchievementDict(); var item = new AchievementItem(); item.BigID = big; item.SmallID = small; for (int i = 1; i < 20; i++) { if (_achievementItems.ContainsKey((uint)(big * 10000 + small * 100 + i))) continue; item.InternalID = (uint)i; break; } AchievementList.Add(item); AchievementList.Sort((a, b) => a.ID.CompareTo(b.ID)); } public void RemoveAchievementItem(uint big, uint small, uint internalId) { RefreshAchievementDict(); var id = big * 10000 + small * 100 + internalId; var item = _achievementItems.GetValueOrDefault(id); if (item != null) { AchievementList.Remove(item); _achievementItems.Remove(id); } } public List GetAchievementItemList(uint big, uint small, uint internalId) { RefreshAchievementDict(); var result = new List(); foreach (var achievement in AchievementList) { if (big != 0 && achievement.BigID != big) continue; if (small != 0 && achievement.SmallID != small) continue; if (internalId != 0 && achievement.InternalID != internalId) continue; result.Add(achievement); } return result; } public AchievementItem GetAchievementItem(uint big, uint small, uint internalId) { RefreshAchievementDict(); var id = big * 10000 + small * 100 + internalId; return _achievementItems.GetValueOrDefault(id); } public void RefreshAchievementDict() { _achievementItems ??= new Dictionary(); if (_achievementItems.Count == AchievementList.Count) return; _achievementItems.Clear(); foreach (var item in AchievementList) _achievementItems[item.ID] = item; } public void ClearAchievementFinishedInfo() { foreach (var item in AchievementList) item.IsFinished = false; } } }