You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity2D中实现累计金币的二进制持久化存储问题

问题解决:Unity累计金币持久化存储实现

错误原因分析

你的代码无法实现金币累加的核心问题在于:

  1. 保存时覆盖原有数据:每次调用SaveHighScore(this)都会新建HighScoreData对象,新对象的totalCoins初始为0,加上当前局金币后直接覆盖了文件中存储的历史总金币。
  2. 逻辑混乱导致重复操作: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:31:19