Unity角色选择菜单中PlayerPrefs使用及角色解锁状态异常问题
解决Unity角色选择菜单重启后已解锁角色锁定的问题
嘿,我仔细看了你的代码,问题的核心很明确:游戏重启后,你没有根据保存的解锁状态初始化WhitePlane按钮的交互状态。虽然你在Start()里读取了isPlanesold的值,但并没有把这个值和按钮的interactable属性绑定起来,所以按钮会回到默认的不可交互状态。
问题分析
你的代码已经实现了购买时保存解锁状态(PlayerPrefs.SetInt("isPlanesold", 1))和扣除金币的逻辑,但缺少了启动时根据保存的状态恢复UI的关键步骤。比如:
- 重启后
WhitePlane按钮的交互状态没有从PlayerPrefs读取并设置 - 购买后隐藏的
wood对象,重启后也会重新显示
修复方案
我们需要在Start()方法里补充初始化逻辑,根据保存的isPlanesold值来设置按钮和UI的状态,同时优化购买方法里的逻辑,确保状态同步。
修改后的完整代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; using UnityEditor; public class MainMenu3 : MonoBehaviour { int SceneIndex; public Button BluePlane; public Button WhitePlane; public GameObject wood; public static int character_number; public int isPlanesold; // Use this for initialization void Start () { // 读取保存的解锁状态,第二个参数是默认值,避免键不存在时出错 isPlanesold = PlayerPrefs.GetInt("isPlanesold", 0); // 读取保存的金币数量 UIManager2.coin_score = PlayerPrefs.GetInt("Score", 0); // 读取保存的角色编号 if (!PlayerPrefs.HasKey("Number")) { PlayerPrefs.SetInt("Number", 1); } character_number = PlayerPrefs.GetInt("Number"); // 关键:根据解锁状态初始化UI if (isPlanesold == 1) { WhitePlane.interactable = true; wood.SetActive(false); } else { WhitePlane.interactable = false; wood.SetActive(true); } SceneIndex = SceneManager.GetActiveScene().buildIndex; } public void Blueplane () { character_number = 1; PlayerPrefs.SetInt("Number", character_number); // 保存当前选择的角色 SceneManager.LoadScene("Menu2"); } public void BuyWhitePlane () { if (UIManager2.coin_score >= 1 && isPlanesold == 0) { // 立即更新UI状态 WhitePlane.interactable = true; wood.SetActive(false); // 更新解锁状态和金币 isPlanesold = 1; PlayerPrefs.SetInt("isPlanesold", isPlanesold); UIManager2.coin_score--; PlayerPrefs.SetInt("Score", UIManager2.coin_score); // 保存选择的角色 character_number = 2; PlayerPrefs.SetInt("Number", character_number); SceneManager.LoadScene("Menu2"); } else { WhitePlane.interactable = false; } } void Update () { if (Input.GetKeyDown(KeyCode.Escape)) SceneManager.LoadScene(SceneIndex - 1); } }
关键修改点说明
- 在
Start()中添加了根据isPlanesold初始化WhitePlane和wood的逻辑,确保重启后UI状态和保存的一致 - 给
PlayerPrefs.GetInt()添加了默认值参数,避免首次运行时因为键不存在导致的异常 - 在
Blueplane()方法中补充了保存角色编号的逻辑,确保重启后记住用户选择的角色 - 购买成功后立即更新本地变量
isPlanesold,避免后续逻辑出错
额外测试建议
如果测试时想重置所有保存的数据,可以在Start方法开头添加PlayerPrefs.DeleteAll();(测试完成后记得删除),这样可以模拟首次进入游戏的状态。
内容的提问来源于stack exchange,提问作者amin007
相关产品推荐
相关产品推荐

