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

Unity3D C#点击游戏分数保存异常修复求助

问题定位与修复方案

核心问题分析

分数回退的本质是购买操作后,主游戏脚本的实时分数变量未同步更新,或UI/场景刷新时错误读取了旧存储值,常见触发场景:

  • 仅修改存储值但未同步到主脚本的本地分数变量
  • 关闭商店时的UI刷新逻辑复用了旧缓存数据
  • 多脚本维护独立分数变量,出现数据源不一致

针对性修复步骤

1. 统一分数数据源

避免多脚本维护独立分数变量,让LocalStorageManager作为唯一读写入口:

  • 修改StrawberryClicker.cs,移除本地分数变量,所有操作通过存储管理器完成:
    public void OnStrawberryClicked()
    {
        // 直接调用存储管理器累加分数
        LocalStorageManager.Instance.AddScore(clickPower);
        // 刷新UI时读取存储管理器的最新值
        UpdateScoreUI(LocalStorageManager.Instance.GetScore());
    }
    
  • 修改ShopManager.cs的购买逻辑,扣除分数后主动同步主脚本状态:
    public void BuyUpgrade(int cost, int powerIncrease)
    {
        int currentScore = LocalStorageManager.Instance.GetScore();
        if (currentScore >= cost)
        {
            // 扣除分数并立即保存
            LocalStorageManager.Instance.SetScore(currentScore - cost);
            // 同步更新点击威力并存储
            int newPower = LocalStorageManager.Instance.GetClickPower() + powerIncrease;
            LocalStorageManager.Instance.SetClickPower(newPower);
            // 通知主脚本刷新UI和点击威力
            FindObjectOfType<StrawberryClicker>().RefreshGameState();
            Debug.Log("购买后分数:" + LocalStorageManager.Instance.GetScore());
        }
    }
    

2. 修复存储管理器读写逻辑

确保存储操作实时同步,避免缓存旧值:

// LocalStorageManager.cs 优化后代码
public class LocalStorageManager : MonoBehaviour
{
    public static LocalStorageManager Instance;

    private void Awake()
    {
        if (Instance == null) Instance = this;
        else Destroy(gameObject);
        DontDestroyOnLoad(gameObject);
    }

    public int GetScore()
    {
        return PlayerPrefs.GetInt("PlayerScore", 0);
    }

    public void SetScore(int newScore)
    {
        PlayerPrefs.SetInt("PlayerScore", newScore);
        PlayerPrefs.Save(); // 立即写入本地,避免数据丢失
    }

    public void AddScore(int amount)
    {
        SetScore(GetScore() + amount);
    }

    // 新增点击威力的存储方法
    public int GetClickPower()
    {
        return PlayerPrefs.GetInt("ClickPower", 1);
    }

    public void SetClickPower(int newPower)
    {
        PlayerPrefs.SetInt("ClickPower", newPower);
        PlayerPrefs.Save();
    }
}

3. 规范UI刷新时机

在StrawberryClicker.cs中添加主动刷新方法,用于商店操作后的状态同步:

public void RefreshGameState()
{
    clickPower = LocalStorageManager.Instance.GetClickPower();
    UpdateScoreUI(LocalStorageManager.Instance.GetScore());
    // 可选:刷新点击威力的显示UI
    UpdatePowerDisplay(clickPower);
}

关闭商店面板时,直接调用该方法同步最新状态,而非重新读取旧数据。

4. 排查单例重复问题

检查是否存在多个LocalStorageManager实例(如主场景和商店场景各有一个),确保单例模式生效,通过DontDestroyOnLoad保持全局唯一。

验证步骤

  1. 购买升级后,在控制台用PlayerPrefs.GetInt("PlayerScore")确认存储值已更新
  2. 关闭商店后,调用LocalStorageManager.Instance.GetScore()检查是否与存储值一致
  3. 点击草莓后,确认分数基于存储值累加,而非旧本地变量

内容的提问来源于stack exchange,提问作者PoprostuIzI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:25:03