修复了build guard等若干问题
This commit is contained in:
@@ -25,6 +25,9 @@ public static class PackagingResetTool
|
||||
{
|
||||
".eco.dat", ".eco.bak", ".eco.tmp", // PlayerEconomyStorage(货币)
|
||||
".ahd.dat", ".ahd.bak", ".ahd.tmp", // AllyHeroDeployLedgerStorage(英雄成长)
|
||||
".xpv.dat", ".xpv.bak", ".xpv.tmp", // ExpBottleLedgerStorage(经验瓶)
|
||||
".dsm.dat", ".dsm.bak", ".dsm.tmp", // DushMaterialLedgerStorage(突破材料)
|
||||
".eqc.dat", ".eqc.bak", ".eqc.tmp", // EquipmentConsumableLedgerStorage(装备消耗品)
|
||||
};
|
||||
|
||||
[MenuItem("Tools/Packaging/一键初始化打包设置(恢复默认)", false, 0)]
|
||||
@@ -38,7 +41,7 @@ public static class PackagingResetTool
|
||||
"2.5 歌曲:游玩次数、累计时长、各难度成绩记录清零(歌曲解锁/谱面配置不动)\n" +
|
||||
"3. 装备:删除 " + GeneratedEquipmentFolder + " 下所有生成装备,清除英雄已装备引用\n" +
|
||||
"4. 商店:所有物品 purchasedCount、user_has_read 清零(限购配置 itemPurchaseQuota 不动)\n" +
|
||||
"5. 清理本机测试存档(.cache_bridge 货币/成长/装备/商店存档,不含拥有权账本)与相关 PlayerPrefs\n\n" +
|
||||
"5. 清理本机测试存档(.cache_bridge 货币/成长/经验瓶/突破材料/装备消耗品、player_rks、player_experience、装备/商店存档,不含拥有权账本)与相关 PlayerPrefs\n\n" +
|
||||
"此操作会修改并保存资产文件,建议在版本控制下执行。是否继续?",
|
||||
"执行重置",
|
||||
"取消");
|
||||
@@ -51,6 +54,12 @@ public static class PackagingResetTool
|
||||
var report = new StringBuilder();
|
||||
int errors = 0;
|
||||
|
||||
// 【关键】先删除运行时存档,再清理 .asset。
|
||||
// 原因:SongData.OnEnable() 在编辑器模式下会从存档回写到 .asset;
|
||||
// 如果先改 .asset 再删存档,.asset 被修改时触发 OnEnable() → 从存档回写 → .asset 又脏了。
|
||||
errors += ClearRuntimeSaves(report);
|
||||
errors += ClearPlayerPrefs(report);
|
||||
|
||||
try
|
||||
{
|
||||
AssetDatabase.StartAssetEditing();
|
||||
@@ -73,10 +82,6 @@ public static class PackagingResetTool
|
||||
AssetDatabase.Refresh();
|
||||
}
|
||||
|
||||
// 运行时存档 / PlayerPrefs 清理(放在资产保存之后,避免被回写覆盖)。
|
||||
errors += ClearRuntimeSaves(report);
|
||||
errors += ClearPlayerPrefs(report);
|
||||
|
||||
report.Insert(0, errors == 0
|
||||
? "打包初始化完成,未发现错误。\n\n"
|
||||
: "打包初始化完成,但有 " + errors + " 处警告/错误,请查看下方明细。\n\n");
|
||||
@@ -199,6 +204,14 @@ public static class PackagingResetTool
|
||||
|
||||
serialized.ApplyModifiedPropertiesWithoutUndo();
|
||||
EditorUtility.SetDirty(so);
|
||||
|
||||
// 【关键】清空内存中的运行时数据映射,防止 OnEnable/SavePersistent 回写脏数据。
|
||||
// SongData 在编辑器模式下会从存档加载到内存 map(personalRecordMap 等),
|
||||
// 再通过 SyncEntriesFromMaps() 同步到 chartFiles[] 序列化字段。
|
||||
// 即使磁盘上的存档和 .asset 都清零了,内存中的 map 如果还有旧值,
|
||||
// Unity 保存资产时会把内存脏数据写回磁盘。必须显式清空。
|
||||
so.ClearSaveDataAndReload();
|
||||
|
||||
count++;
|
||||
}
|
||||
|
||||
@@ -281,6 +294,31 @@ public static class PackagingResetTool
|
||||
{
|
||||
int errors = 0;
|
||||
|
||||
// 歌曲成绩存档(必须先删除,避免回写覆盖已清零的 .asset)。
|
||||
int songSavesCleared = 0;
|
||||
foreach (var guid in AssetDatabase.FindAssets("t:SongData"))
|
||||
{
|
||||
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||||
var so = AssetDatabase.LoadAssetAtPath<SongData>(path);
|
||||
if (so == null || so.songID <= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
string legacySongPath = Path.Combine(Application.persistentDataPath, $"SongData_{so.songID}.json");
|
||||
SecureSaveVault.Delete("song_runtime", so.songID.ToString(), legacySongPath);
|
||||
songSavesCleared++;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errors++;
|
||||
report.AppendLine($"清理歌曲 {so.songID} 存档失败:" + ex.Message);
|
||||
}
|
||||
}
|
||||
report.AppendLine("已清理歌曲运行时存档:" + songSavesCleared + " 个(song_runtime/*)。");
|
||||
|
||||
// 商店 purchasedCount 存档(SecureSaveVault + 旧版明文文件)。
|
||||
try
|
||||
{
|
||||
@@ -328,6 +366,31 @@ public static class PackagingResetTool
|
||||
}
|
||||
|
||||
report.AppendLine("已清理 .cache_bridge 货币/成长存档文件:" + fileDeleted + " 个(保留拥有权账本 .own.*)。");
|
||||
|
||||
// player_rks / player_experience 等 SecureSaveVault 存档。
|
||||
try
|
||||
{
|
||||
SecureSaveVault.Delete("player_rks", "overall");
|
||||
report.AppendLine("已清理 player_rks 运行时存档(player_rks/overall)。");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errors++;
|
||||
report.AppendLine("清理 player_rks 存档失败:" + ex.Message);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
string legacyExpPath = Path.Combine(Application.persistentDataPath, "player_experience.json");
|
||||
SecureSaveVault.Delete("player_experience", "runtime", legacyExpPath);
|
||||
report.AppendLine("已清理 player_experience 运行时存档(player_experience/runtime)。");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errors++;
|
||||
report.AppendLine("清理 player_experience 存档失败:" + ex.Message);
|
||||
}
|
||||
|
||||
return errors;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user