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

Unity中PlayerPrefs.DeleteAll()重置功能异常求助

Unity中PlayerPrefs.DeleteAll()重置失效问题排查与解决

问题重现

主菜单点击「开始游戏」打开选关面板后返回,再点击重置按钮,关卡解锁数据无法被正确重置;但直接在主菜单点击重置按钮则功能正常。

核心原因

你的SelectLevels脚本存在数据缓存未更新的问题:

  • 脚本仅在Awake()生命周期中读取一次PlayerPrefs的UnlockedLevel值,并缓存到unlockedLevel变量中。
  • 第一次打开选关面板时,Awake()已执行并缓存了旧的解锁进度;重置PlayerPrefs后,脚本没有重新读取最新的存储状态,也没有刷新按钮的可交互状态。
  • 再次打开选关面板时,依然使用缓存的旧值渲染UI,导致看起来像是重置失效,实际上PlayerPrefs已经被清空。

解决方案

步骤1:抽离UI刷新逻辑为独立方法

修改SelectLevels脚本,将原本在Awake()中的读取与UI设置逻辑抽成公共方法,方便在需要时主动调用刷新:

using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class SelectLevels : MonoBehaviour
{
    public Button[] buttons;
    public Button[] worlds;
    private int unlockedLevel;
    
    private void Awake()
    {
        UpdateLevelUI();
    }

    // 新增公共方法:刷新关卡UI状态,每次调用都会重新读取PlayerPrefs
    public void UpdateLevelUI()
    {
        unlockedLevel = PlayerPrefs.GetInt("UnlockedLevel", 1);
        for(int i = 0; i < buttons.Length; i++)
        {
            buttons[i].interactable = false;
        }
        for (int i = 0; i < unlockedLevel; i++)
        {
            buttons[i].interactable = true;
        }

        worlds[1].interactable = unlockedLevel > 3;
    }
    
    public void OpenLevel(int levelIndex)
    {
        SceneManager.LoadScene(levelIndex);
    }

    public void QuitGame()
    {
        Application.Quit();
        Debug.Log("QUIT");
    }
}

步骤2:重置后主动刷新UI

修改ResetGame脚本,在删除PlayerPrefs后调用刷新方法,确保UI同步最新状态:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ResetGame : MonoBehaviour
{
    public SelectLevels selectLevels; // 在Unity编辑器中拖入SelectLevels组件的实例

    public void RestartGame()
    {
        PlayerPrefs.DeleteAll();
        PlayerPrefs.Save();
        // 强制刷新关卡选择UI
        selectLevels.UpdateLevelUI();
        // 可选:添加日志验证重置结果
        Debug.Log("重置后UnlockedLevel值:" + PlayerPrefs.GetInt("UnlockedLevel", 1));
    }
}

步骤3:选关面板打开时强制刷新

为了确保每次打开选关面板都能获取最新数据,给「开始游戏」按钮绑定的方法中添加一行:

// 假设打开面板的方法是ShowLevelPanel()
public void ShowLevelPanel()
{
    // 你的面板显示逻辑(比如设置布尔标记为true)
    ...
    // 刷新UI
    selectLevels.UpdateLevelUI();
}

验证方法

在RestartGame()中添加日志,打印PlayerPrefs.GetInt("UnlockedLevel", 1)的值,重置后如果输出1,说明PlayerPrefs已被正确清空,问题仅出在UI未同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:53:13