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

为什么使用PlayerPrefs取值后数值比较失效、函数调用逻辑异常?

问题根源

  • 比较逻辑执行时机错误:当前数值比较仅在OnEnable脚本激活时执行一次,后续PlayerPrefs值更新后,只要脚本没有重新触发禁用再激活流程,已绑定的事件回调就永远是首次比较结果对应的方法,不会自动更新。
  • PlayerPrefs修改后未主动持久化:PlayerPrefs.SetInt()仅将值写入内存缓存,Unity默认仅在应用正常退出时自动落盘,若中途出现闪退、强制杀进程等情况会丢失修改,也可能出现跨脚本读取到旧值的异常。
  • 键名大小写敏感风险:Unity的PlayerPrefs键名区分大小写,需确保其他脚本中做递增操作的键名与你读取的键名完全一致,避免因拼写大小写差异读取到默认值0。

解决方案

  1. 每次修改PlayerPrefs后主动调用保存方法,在所有PlayerPrefs.SetInt()执行后新增一行:
PlayerPrefs.Save();
  1. 调整事件绑定逻辑,将数值判断从绑定阶段移到事件触发时执行,保证每次事件回调都用最新值做判断,修改后代码如下:
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();
    }
}
  1. 调试阶段可在OnBoardCompletedHandler中添加日志打印,确认每次读取的数值符合预期:
Debug.Log($"brojBroja: {brojBroja}, broj: {broj}");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:15:02