Unity2D中实现累计金币的二进制持久化存储问题
问题解决:Unity累计金币持久化存储实现
错误原因分析
你的代码无法实现金币累加的核心问题在于:
- 保存时覆盖原有数据:每次调用
SaveHighScore(this)都会新建HighScoreData对象,新对象的totalCoins初始为0,加上当前局金币后直接覆盖了文件中存储的历史总金币。 - 逻辑混乱导致重复操作:
KillPlayer中重复执行金币累加和保存操作,且没有基于加载的历史数据进行更新。
正确实现方案
1. 修改HighScoreData类
添加支持初始化默认值的构造函数,用于首次运行时初始化数据:
using UnityEngine; [System.Serializable] public class HighScoreData { public float bestDistanceCount; public int totalCoins; // 用于首次初始化或手动构建完整数据的构造函数 public HighScoreData(float bestDistance, int totalCoins) { this.bestDistanceCount = bestDistance; this.totalCoins = totalCoins; } }
2. 更新HighScoreSaveSystem类
新增接受HighScoreData对象的保存方法,直接保存已更新的完整数据:
using UnityEngine; using System.IO; using System.Runtime.Serialization.Formatters.Binary; public static class HighScoreSaveSystem { // 保存完整的HighScoreData对象 public static void SaveHighScore(HighScoreData data) { BinaryFormatter formatter = new BinaryFormatter(); string path = Application.persistentDataPath + "/highscore.highscorefile"; FileStream stream = new FileStream(path, FileMode.Create); formatter.Serialize(stream, data); stream.Close(); } public static HighScoreData LoadHighScore() { string path = Application.persistentDataPath + "/highscore.highscorefile"; if (File.Exists(path)) { BinaryFormatter formatter = new BinaryFormatter(); FileStream stream = new FileStream(path, FileMode.Open); HighScoreData data = formatter.Deserialize(stream) as HighScoreData; stream.Close(); return data; } else { Debug.LogWarning("Save file not found, will initialize default data."); return null; } } }
3. 修正KillPlayer方法逻辑
先加载历史数据,累加金币、更新最高分后再保存完整数据:
public void KillPlayer() { isDead = true; // 加载历史数据,无数据则初始化默认值(总金币0,最高分0) HighScoreData data = HighScoreSaveSystem.LoadHighScore() ?? new HighScoreData(0, 0); // 累加本局金币到历史总金币 data.totalCoins += coinCount; // 更新最高分(仅当当前距离更远时) if (distanceCount > data.bestDistanceCount) { data.bestDistanceCount = distanceCount; } // 保存更新后的完整数据 HighScoreSaveSystem.SaveHighScore(data); Time.timeScale = 0f; }
说明
- 首次运行游戏时,因无存档文件会自动初始化总金币为0、最高分为0。
- 每次玩家死亡时,都会基于历史存档累加本局金币,并更新最高分(如果需要),最后保存完整的存档数据,确保数据不会丢失或被覆盖。
内容的提问来源于stack exchange,提问作者unitylearns
相关产品推荐
相关产品推荐

