为什么使用PlayerPrefs取值后数值比较失效、函数调用逻辑异常?
问题根源
- 比较逻辑执行时机错误:当前数值比较仅在
OnEnable脚本激活时执行一次,后续PlayerPrefs值更新后,只要脚本没有重新触发禁用再激活流程,已绑定的事件回调就永远是首次比较结果对应的方法,不会自动更新。 - PlayerPrefs修改后未主动持久化:
PlayerPrefs.SetInt()仅将值写入内存缓存,Unity默认仅在应用正常退出时自动落盘,若中途出现闪退、强制杀进程等情况会丢失修改,也可能出现跨脚本读取到旧值的异常。 - 键名大小写敏感风险:Unity的PlayerPrefs键名区分大小写,需确保其他脚本中做递增操作的键名与你读取的键名完全一致,避免因拼写大小写差异读取到默认值0。
解决方案
- 每次修改PlayerPrefs后主动调用保存方法,在所有
PlayerPrefs.SetInt()执行后新增一行:
PlayerPrefs.Save();
- 调整事件绑定逻辑,将数值判断从绑定阶段移到事件触发时执行,保证每次事件回调都用最新值做判断,修改后代码如下:
private void OnEnable() { // 仅绑定统一回调,不在绑定阶段做判断 GameEvents.OnBoardCompleted += OnBoardCompletedHandler; } private void OnDisable() { // 解绑对应回调即可 GameEvents.OnBoardCompleted -= OnBoardCompletedHandler; } private void OnBoardCompletedHandler() { // 事件触发时读取最新的PlayerPrefs值做判断 int brojBroja = PlayerPrefs.GetInt("BROJOA"); if (brojBroja == broj) { ShowKonacnoRjesenje(); } else { nePrikazujOpet(); } }
- 调试阶段可在
OnBoardCompletedHandler中添加日志打印,确认每次读取的数值符合预期:
Debug.Log($"brojBroja: {brojBroja}, broj: {broj}");
内容的提问来源于stack exchange,提问作者bata kos
相关产品推荐
相关产品推荐

