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

