using System; using System.Collections.Generic; using UnityEngine; [Serializable] public class ChartFileEntry { [Header("难度序列号0/1/2/3 -> ez/hd/im/in")] public int difficulty; // 该谱面对应的难度序列号 [Header("展示给用户的难度分级:float数字")] public float difficultyLEVEL; [Header("本难度敌人总生命值=音符数量×下面的倍率")] public float enemyTotalHP_Multiplier; [Header("ez/hd/im/in 没啥用")] public string difficultyName; // 难度名称 [Header("谱面文件 json")] public TextAsset chartFile; // 谱面文件 [Header("本关本难度描述 文本")] [TextArea(3,10)] public string difficultyDescription; [Header("本关本难度上次游玩分数记录")] public int lastScoreForThisDifficulty; [Header("本关本难度最佳纪录")] public int personalRecordForThisDifficulty; [Header("本关本难度进度")] public float levelProgressForThisDifficulty; [Header("本关本难度最后游玩时间")] public DateTime lastPlayTimeForThisDifficulty; } [CreateAssetMenu(fileName = "NewSongData", menuName = "EaseOut/SongData")] public class SongData : ScriptableObject { public string usernameID = "user_TestUser@FloatGaming"; public string songName; public int songID; public int songLength_second; public string artistName; public string painter; public string level_creator; public string belongsTo_whichDLC; public int bpm; public float songDuration; public int game_enterTimes; public int time_totalPlayingTime; public DateTime uploadData; public Sprite illustration; public Sprite backgroudPIC; public Sprite fullscreen_songPicture; public AudioClip audioFile; public AudioClip audio_previewAudio; // 支持不同难度的数据 public Dictionary difficultyNumberMap = new Dictionary(); // 各个难度的难度数值 public Dictionary personalRecordMap = new Dictionary(); // 各个难度的最高分 public Dictionary chartFileMap = new Dictionary(); // 各个难度下的谱面文件 // 用于在 Inspector 选择谱面文件 public List chartFiles = new List(); // 个人最高记录(所有难度中的最高分) public int personalRecord; // 当前游玩的难度 public int difficultyID; public float current_levelProgress; public bool _if_level_is_EASE; public int max_comboRecord; [Header("当前选择的关卡难度")] public int thisLevel_selectedDifficultyID; // 构造函数:从 JSON 数据创建 SongData public SongData(SongDataSerializable jsonData) { usernameID = jsonData.usernameID; songName = jsonData.songName; songID = jsonData.songID; songLength_second = jsonData.songLength_second; artistName = jsonData.artistName; painter = jsonData.painter; level_creator = jsonData.level_creator; belongsTo_whichDLC = jsonData.belongsTo_whichDLC; bpm = jsonData.bpm; songDuration = jsonData.songDuration; game_enterTimes = jsonData.game_enterTimes; time_totalPlayingTime = jsonData.time_totalPlayingTime; uploadData = DateTime.Parse(jsonData.uploadData); difficultyID = jsonData.difficultyID; current_levelProgress = jsonData.current_levelProgress; _if_level_is_EASE = jsonData._if_level_is_EASE; max_comboRecord = jsonData.max_comboRecord; difficultyNumberMap = jsonData.difficultyNumberMap; personalRecordMap = jsonData.personalRecordMap; personalRecord = jsonData.personalRecord; // 赋值最高成绩 // 确保 JSON 里的谱面文件映射到可用的 List foreach (var kvp in jsonData.chartFileMap) { chartFiles.Add(new ChartFileEntry { difficulty = kvp.Key, chartFile = Resources.Load("Charts/" + kvp.Value) }); } SyncChartFileMap(); } // 获取所有难度中最高的成绩 public int CalculateHighestPersonalRecord() { int highest = 0; foreach (var score in personalRecordMap.Values) { if (score > highest) { highest = score; } } personalRecord = highest; return highest; } // 更新指定难度的最高成绩 public void UpdatePersonalRecord(int difficulty, int newScore) { if (!personalRecordMap.ContainsKey(difficulty) || newScore > personalRecordMap[difficulty]) { personalRecordMap[difficulty] = newScore; } CalculateHighestPersonalRecord(); } // 获取特定难度的最高分 public int GetPersonalRecord(int difficulty) { return personalRecordMap.ContainsKey(difficulty) ? personalRecordMap[difficulty] : 0; } // 获取指定难度的谱面文件 public TextAsset GetChartFile(int difficulty) { foreach (var entry in chartFiles) { if (entry.difficulty == difficulty) return entry.chartFile; } return null; } // 同步 Dictionary 和 List 确保数据一致 public void SyncChartFileMap() { chartFileMap.Clear(); foreach (var entry in chartFiles) { if (entry.chartFile != null) { chartFileMap[entry.difficulty] = entry.chartFile; } } } }