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保持全局唯一。
验证步骤
- 购买升级后,在控制台用
PlayerPrefs.GetInt("PlayerScore")确认存储值已更新 - 关闭商店后,调用
LocalStorageManager.Instance.GetScore()检查是否与存储值一致 - 点击草莓后,确认分数基于存储值累加,而非旧本地变量
内容的提问来源于stack exchange,提问作者PoprostuIzI
相关产品推荐
相关产品推荐

