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

