重做粗略选曲界面 浮动小游戏可开关

修复一些小bug和加入部分新功能
This commit is contained in:
FloatGaming
2025-12-30 03:26:39 +08:00
parent e8ac354f8d
commit e7f4ac72d5
243 changed files with 18884 additions and 1897 deletions
+164 -16
View File
@@ -9,7 +9,7 @@ public class ChartFileEntry
public int difficulty; // 该谱面对应的难度序列号
[Header("展示给用户的难度分级:float数字")]
public float difficultyLEVEL;
[Header("本难度敌人总生命值=音符数量×下面的倍率")]
[Header("本难本难度敌人总生命值=音符数量×下面的倍率")]
public float enemyTotalHP_Multiplier;
[Header("ez/hd/im/in 没啥用")]
public string difficultyName; // 难度名称
@@ -19,11 +19,13 @@ public class ChartFileEntry
[TextArea(3,10)]
public string difficultyDescription;
[Header("本关本难度上次游玩分数记录")]
public int lastScoreForThisDifficulty;
[Header("本关本难度最佳纪录")]
public int pmScore_personalRecordForThisDifficulty;
public int idolScore_personalRecordForThisDifficulty;
public int personalRecordForThisDifficulty;
public int lastScoreForThisDifficulty; // 上次游玩(总分/参考)
[Header("本关本难度个人分记录(谱面分)")]
public int chartPersonalRecordForThisDifficulty; // 谱面(个人)分
[Header("本关本难度偶像分记录")]
public int idolPersonalRecordForThisDifficulty; // 偶像分
[Header("本关本难度总分展示 (谱面分 + 偶像分)")]
public int totalPersonalRecordForThisDifficulty; // 展示用:谱面分 + 偶像分 (总分)
[Header("本关本难度进度")]
public float levelProgressForThisDifficulty;
[Header("本关本难度最后游玩时间")]
@@ -52,21 +54,30 @@ public class SongData : ScriptableObject
public int time_totalPlayingTime;
public DateTime uploadData;
[Header("各种图")]
public Sprite illustration;
public Sprite backgroudPIC;
public Sprite fullscreen_songPicture;
public Sprite card_profileImage;
[Header("右侧卡片用图")]
public Sprite right_pic_bottom_image;
public Sprite right_pic_top_image;
[Header("音乐")]
public AudioClip audioFile;
public AudioClip audio_previewAudio;
[Header("")]
// 支持不同难度的数据
public Dictionary<int, int> difficultyNumberMap = new Dictionary<int, int>(); // 各个难度的难度数值
public Dictionary<int, int> personalRecordMap = new Dictionary<int, int>(); // 各个难度的最高分
public Dictionary<int, int> personalRecordMap = new Dictionary<int, int>(); // 各个难度的谱面(个人)最高分
public Dictionary<int, int> idolRecordMap = new Dictionary<int, int>(); // 各个难度的偶像分
public Dictionary<int, int> chartScoreMap = new Dictionary<int, int>(); // 各个难度的谱面(上次)分数记录
public Dictionary<int, TextAsset> chartFileMap = new Dictionary<int, TextAsset>(); // 各个难度下的谱面文件
// 用于在 Inspector 选择谱面文件
public List<ChartFileEntry> chartFiles = new List<ChartFileEntry>();
// 个人最高记录(所有难度中的最高分)
// 个人最高记录(所有难度中的最高分) - 这里表示最高的「谱面分 + 偶像分」之和(全谱面最高)
public int personalRecord;
// 当前游玩的难度
@@ -78,6 +89,30 @@ public class SongData : ScriptableObject
[Header("当前选择的关卡难度")]
public int thisLevel_selectedDifficultyID;
[Header("本关卡加入时间:字符串格式yyyy-mm-dd")]
public string thisLevel_addDateString;
[Header("本关卡总体简介")]
[TextArea(3,10)]
public string thisLevel_overallDescription;
// Ensure dictionaries initialized when ScriptableObject is loaded/deserialized
private void OnEnable()
{
if (difficultyNumberMap == null) difficultyNumberMap = new Dictionary<int, int>();
if (personalRecordMap == null) personalRecordMap = new Dictionary<int, int>();
if (idolRecordMap == null) idolRecordMap = new Dictionary<int, int>();
if (chartScoreMap == null) chartScoreMap = new Dictionary<int, int>();
if (chartFileMap == null) chartFileMap = new Dictionary<int, TextAsset>();
// If chartFiles exist in inspector, ensure maps reflect them
if (chartFiles != null && chartFiles.Count > 0)
{
SyncRecordsFromChartFiles();
SyncChartFileMap();
}
}
// 构造函数:从 JSON 数据创建 SongData
public SongData(SongDataSerializable jsonData)
{
@@ -102,8 +137,10 @@ public class SongData : ScriptableObject
_if_level_is_EASE = jsonData._if_level_is_EASE;
max_comboRecord = jsonData.max_comboRecord;
difficultyNumberMap = jsonData.difficultyNumberMap;
personalRecordMap = jsonData.personalRecordMap;
difficultyNumberMap = jsonData.difficultyNumberMap ?? new Dictionary<int,int>();
personalRecordMap = jsonData.personalRecordMap ?? new Dictionary<int,int>();
idolRecordMap = jsonData.idolRecordMap ?? new Dictionary<int,int>();
chartScoreMap = jsonData.chartScoreMap ?? new Dictionary<int,int>();
personalRecord = jsonData.personalRecord; // 赋值最高成绩
// 确保 JSON 里的谱面文件映射到可用的 List
@@ -112,42 +149,119 @@ public class SongData : ScriptableObject
chartFiles.Add(new ChartFileEntry { difficulty = kvp.Key, chartFile = Resources.Load<TextAsset>("Charts/" + kvp.Value) });
}
SyncChartFileMap();
// 从 chartFiles 中同步各难度的记录到字典(如果 inspector 中有填写)
SyncRecordsFromChartFiles();
// Ensure per-difficulty chartScoreMap populated from entries if not present
foreach (var entry in chartFiles)
{
if (!chartScoreMap.ContainsKey(entry.difficulty))
chartScoreMap[entry.difficulty] = entry.lastScoreForThisDifficulty;
}
}
// 获取所有难度中最高的成绩
// 获取所有难度中最高的成绩(谱面分 + 偶像分 的最大和)
public int CalculateHighestPersonalRecord()
{
if (personalRecordMap == null) personalRecordMap = new Dictionary<int,int>();
if (idolRecordMap == null) idolRecordMap = new Dictionary<int,int>();
int highest = 0;
foreach (var score in personalRecordMap.Values)
foreach (var kvp in personalRecordMap)
{
if (score > highest)
int diff = kvp.Key;
int p = kvp.Value;
int i = idolRecordMap.ContainsKey(diff) ? idolRecordMap[diff] : 0;
int combined = p + i;
if (combined > highest)
{
highest = score;
highest = combined;
}
}
personalRecord = highest;
return highest;
}
// 更新指定难度的最高成绩
// 更新指定难度的谱面(个人)最高成绩
public void UpdatePersonalRecord(int difficulty, int newScore)
{
if (personalRecordMap == null) personalRecordMap = new Dictionary<int,int>();
if (!personalRecordMap.ContainsKey(difficulty) || newScore > personalRecordMap[difficulty])
{
personalRecordMap[difficulty] = newScore;
}
// also update corresponding ChartFileEntry if exists
var entry = chartFiles != null ? chartFiles.Find(e => e.difficulty == difficulty) : null;
if (entry != null)
{
entry.chartPersonalRecordForThisDifficulty = personalRecordMap[difficulty];
int idol = idolRecordMap != null && idolRecordMap.ContainsKey(difficulty) ? idolRecordMap[difficulty] : 0;
entry.totalPersonalRecordForThisDifficulty = personalRecordMap[difficulty] + idol;
}
CalculateHighestPersonalRecord();
}
// 获取特定难度的最高
// 更新指定难度的偶像
public void UpdateIdolRecord(int difficulty, int newIdolScore)
{
if (idolRecordMap == null) idolRecordMap = new Dictionary<int,int>();
if (!idolRecordMap.ContainsKey(difficulty) || newIdolScore > idolRecordMap[difficulty])
{
idolRecordMap[difficulty] = newIdolScore;
}
// also update corresponding ChartFileEntry if exists
var entry = chartFiles != null ? chartFiles.Find(e => e.difficulty == difficulty) : null;
if (entry != null)
{
entry.idolPersonalRecordForThisDifficulty = idolRecordMap[difficulty];
int personal = personalRecordMap != null && personalRecordMap.ContainsKey(difficulty) ? personalRecordMap[difficulty] : 0;
entry.totalPersonalRecordForThisDifficulty = personal + idolRecordMap[difficulty];
}
CalculateHighestPersonalRecord();
}
// 更新或设置谱面上次分数记录(last run 总分)
public void UpdateChartScore(int difficulty, int newChartScore)
{
if (chartScoreMap == null) chartScoreMap = new Dictionary<int,int>();
chartScoreMap[difficulty] = newChartScore;
var entry = chartFiles != null ? chartFiles.Find(e => e.difficulty == difficulty) : null;
if (entry != null)
{
entry.lastScoreForThisDifficulty = newChartScore;
}
}
// 获取特定难度的谱面(个人)最高分
public int GetPersonalRecord(int difficulty)
{
if (personalRecordMap == null) return 0;
return personalRecordMap.ContainsKey(difficulty) ? personalRecordMap[difficulty] : 0;
}
// 获取特定难度的偶像分
public int GetIdolRecord(int difficulty)
{
if (idolRecordMap == null) return 0;
return idolRecordMap.ContainsKey(difficulty) ? idolRecordMap[difficulty] : 0;
}
// 获取特定难度的谱面(上次)分数
public int GetChartScore(int difficulty)
{
if (chartScoreMap == null) return 0;
return chartScoreMap.ContainsKey(difficulty) ? chartScoreMap[difficulty] : 0;
}
// 获取指定难度的谱面文件
public TextAsset GetChartFile(int difficulty)
{
if (chartFiles == null) return null;
foreach (var entry in chartFiles)
{
if (entry.difficulty == difficulty)
@@ -159,7 +273,9 @@ public class SongData : ScriptableObject
// 同步 Dictionary 和 List 确保数据一致
public void SyncChartFileMap()
{
if (chartFileMap == null) chartFileMap = new Dictionary<int, TextAsset>();
chartFileMap.Clear();
if (chartFiles == null) return;
foreach (var entry in chartFiles)
{
if (entry.chartFile != null)
@@ -168,4 +284,36 @@ public class SongData : ScriptableObject
}
}
}
// 从 chartFiles 中读取各难度的谱面分/偶像分到 Map(用于 inspector 已填写时)
public void SyncRecordsFromChartFiles()
{
if (personalRecordMap == null) personalRecordMap = new Dictionary<int,int>();
if (idolRecordMap == null) idolRecordMap = new Dictionary<int,int>();
if (chartScoreMap == null) chartScoreMap = new Dictionary<int,int>();
if (chartFiles == null) return;
foreach (var entry in chartFiles)
{
if (entry == null) continue;
if (!personalRecordMap.ContainsKey(entry.difficulty) || entry.chartPersonalRecordForThisDifficulty > personalRecordMap[entry.difficulty])
{
personalRecordMap[entry.difficulty] = entry.chartPersonalRecordForThisDifficulty;
}
if (!idolRecordMap.ContainsKey(entry.difficulty) || entry.idolPersonalRecordForThisDifficulty > idolRecordMap[entry.difficulty])
{
idolRecordMap[entry.difficulty] = entry.idolPersonalRecordForThisDifficulty;
}
if (!chartScoreMap.ContainsKey(entry.difficulty) || entry.lastScoreForThisDifficulty > chartScoreMap[entry.difficulty])
{
chartScoreMap[entry.difficulty] = entry.lastScoreForThisDifficulty;
}
// keep per-entry convenience field in sync to combined total
int p = personalRecordMap.ContainsKey(entry.difficulty) ? personalRecordMap[entry.difficulty] : 0;
int i = idolRecordMap.ContainsKey(entry.difficulty) ? idolRecordMap[entry.difficulty] : 0;
entry.totalPersonalRecordForThisDifficulty = p + i;
}
CalculateHighestPersonalRecord();
}
}