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
相关产品推荐
相关产品推荐

