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

Unity中使用PlayerPrefs保存金币时的累加失效问题

解决Unity找茬游戏金币累加失效问题

看起来你遇到的核心问题是金币没有正确累加,根源在于每次进入关卡时,你的coins变量没有从PlayerPrefs中读取已有的历史金币数,而是默认从0开始计算。这样每次通关后,你保存的只是当前关卡获得的金币数,而不是累加后的总数。

具体修复步骤:

1. 关卡内初始化金币变量

在你的找茬关卡脚本的Start()或Awake()方法中,先读取已保存的金币值作为coins的初始值,而不是让它默认从0开始:

// 确保coins是类的成员变量(不要在方法内定义成局部变量)
private int coins;
private int score; // 假设这也是你的成员变量

void Start()
{
    // 读取PlayerPrefs中已有的金币数,没有的话默认0
    coins = PlayerPrefs.GetInt("Coins", 0);
    // 初始化当前关卡的分数显示(如果需要)
    score1.text = " " + score;
}

2. 保持现有金币保存逻辑(无需修改)

你当前碰撞触发时的保存代码是正确的,只要coins初始值正确,累加后保存就会生效:

if (result.collider.CompareTag("Images")) { 
    Debug.Log("Hit"); 
    result.collider.enabled = false; 
    tmpCircle = Instantiate(krug1); 
    tmpCircle.SetActive(true); 
    tmpCircle.transform.SetParent(canvas.transform, true); 
    tmpCircle.transform.position = new Vector3(result.point.x, result.point.y, result.point.z); 
    tmpCircle.transform.localScale = new Vector3(transform.localScale.x * 2f, transform.localScale.y * 2f, transform.localScale.z); 
    circle.Play("CircleAnim"); 
    score += 1; 
    diff -= 1; 
    coins += 1; 
    score1.text = " " + score; 
    PlayerPrefs.SetInt("Coins", coins); 
    PlayerPrefs.Save(); 
    item.Play(); 
}

3. 优化选关界面的金币显示逻辑

原来的Start()方法只会在选关界面首次加载时执行一次,如果你的选关界面是常驻场景(比如从关卡返回时不会销毁),那么切换关卡后不会重新读取金币数。建议改成OnEnable()方法,这样每次选关界面激活时都会刷新显示:

void OnEnable() { 
    coins.text = PlayerPrefs.GetInt("Coins", 0).ToString(); 
}

额外注意事项:

  • 测试前可以调用PlayerPrefs.DeleteAll()清除旧的测试数据,避免历史值干扰新的逻辑。
  • 确保coins是类的成员变量,不要在碰撞检测的方法内定义成局部变量,否则每次触发碰撞都会重新初始化为0。

内容的提问来源于stack exchange,提问作者Juan Don Guterez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:27:30