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

Unity 3D如何使用PlayerPrefs存储游戏货币并解决代码失效问题

核心问题排查
  • 初始化时仅将读取到的存储值赋值给了文本组件,没有同步给AmountNumber变量,首次运行时Update会直接用AmountNumber的初始值覆盖已有存储数据
  • 每帧执行PlayerPrefs.SetFloat属于无意义的性能消耗
  • 未主动调用PlayerPrefs.Save(),平台进程意外终止时会丢失还未写入磁盘的缓存数据
  • 货币用float类型容易出现精度误差,绝大多数场景下更推荐用int存储整数型游戏货币
可运行修复方案

调整逻辑为仅在初始化、货币数值变动时执行存储读写,避免每帧操作:

// 建议改用int存储货币,避免浮点精度问题
public int AmountNumber;
public Text AmountText;

void Start()
{
    // 读取存储值时同步赋值给AmountNumber,第二个参数为首次运行无数据时的默认值
    AmountNumber = PlayerPrefs.GetInt("Amount", 0);
    RefreshAmountDisplay();
}

// 单独封装文本更新逻辑,无需每帧执行
void RefreshAmountDisplay()
{
    AmountText.text = AmountNumber.ToString();
}

// 所有货币增减操作统一调用该方法
public void ModifyAmount(int changeValue)
{
    AmountNumber += changeValue;
    RefreshAmountDisplay();
    // 仅在数值变动时更新存储
    PlayerPrefs.SetInt("Amount", AmountNumber);
    // 主动触发落盘,避免缓存数据丢失
    PlayerPrefs.Save();
}

如果你确实需要使用浮点型货币,将上述代码中所有int替换为float,PlayerPrefs.GetInt/PlayerPrefs.SetInt对应替换为PlayerPrefs.GetFloat/PlayerPrefs.SetFloat即可。

额外优化建议
  • PlayerPrefs为明文存储,不要直接用它存敏感的核心数值,有条件可以加简单的校验逻辑(比如存储和货币值绑定的校验哈希,读取时对比一致性)避免用户直接改文件刷货币
  • 如果存储操作非常频繁,不要每次修改都调用PlayerPrefs.Save(),可以改成延迟攒批存储,或者游戏退出时统一存储,减少磁盘IO消耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:24:07