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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:38:13