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

Unity开发需求:点击开始按钮加载最后解锁或上次游玩的关卡

嘿,这两个需求都是Unity游戏里很常见的存档逻辑,我给你拆解成两个独立的实现方案,你可以根据需求组合起来用:

一、实现「点击播放按钮加载最后解锁关卡」的逻辑

核心思路是持久化存储玩家的最高解锁关卡进度,点击播放时读取这个值并加载对应场景:

  1. 存储解锁进度
    当玩家完成一个关卡并解锁下一关时,更新存档里的最高解锁关卡号。用PlayerPrefs是最快捷的方式(如果你的游戏需要更复杂的存档系统,也可以用ScriptableObject或本地JSON文件,但PlayerPrefs足够应付这个基础需求):

    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class LevelManager : MonoBehaviour
    {
        // 假设当前关卡编号是currentLevel(比如从1开始)
        public int currentLevel = 1;
    
        // 关卡通关后调用这个方法解锁下一关
        public void UnlockNextLevel()
        {
            int newUnlockedLevel = currentLevel + 1;
            // 读取当前已存储的最高解锁关卡,默认值为1(第一个关卡)
            int currentMaxUnlocked = PlayerPrefs.GetInt("MaxUnlockedLevel", 1);
    
            if (newUnlockedLevel > currentMaxUnlocked)
            {
                PlayerPrefs.SetInt("MaxUnlockedLevel", newUnlockedLevel);
                PlayerPrefs.Save(); // 确保数据写入本地
            }
        }
    }
    
  2. 播放按钮的加载逻辑
    在你的主菜单播放按钮上绑定点击事件,读取存档里的最高解锁关卡并加载:

    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    public class MainMenu : MonoBehaviour
    {
        public Button playButton;
    
        void Start()
        {
            playButton.onClick.AddListener(OnPlayClicked);
        }
    
        void OnPlayClicked()
        {
            int maxUnlockedLevel = PlayerPrefs.GetInt("MaxUnlockedLevel", 1);
            // 假设你的场景命名规则是"Level_1"、"Level_2",按需修改
            SceneManager.LoadScene($"Level_{maxUnlockedLevel}");
        }
    }
    
二、实现「重启游戏后加载上次游玩的最后关卡」的逻辑

核心思路是在玩家退出游戏或切换关卡时,记录当前所在的场景,下次启动游戏点击播放时读取这个记录:

  1. 记录当前游玩的场景
    推荐在两个时机记录:一是切换关卡前,二是游戏退出前(双保险,避免崩溃导致记录丢失):

    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class GameManager : MonoBehaviour
    {
        void Start()
        {
            // 确保这个GameManager在场景切换时不被销毁
            DontDestroyOnLoad(gameObject);
        }
    
        // 切换关卡时调用这个方法
        public void SwitchToLevel(int levelNumber)
        {
            // 记录当前场景
            string currentSceneName = SceneManager.GetActiveScene().name;
            PlayerPrefs.SetString("LastPlayedScene", currentSceneName);
            PlayerPrefs.Save();
    
            // 加载目标关卡
            SceneManager.LoadScene($"Level_{levelNumber}");
        }
    
        // 游戏正常退出时触发
        void OnApplicationQuit()
        {
            string currentSceneName = SceneManager.GetActiveScene().name;
            PlayerPrefs.SetString("LastPlayedScene", currentSceneName);
            PlayerPrefs.Save();
        }
    }
    
  2. 播放按钮的加载逻辑(结合解锁关卡的逻辑)
    如果有上次游玩的记录就加载该场景,没有则加载最后解锁的关卡:

    using UnityEngine;
    using UnityEngine.SceneManagement;
    using UnityEngine.UI;
    
    public class MainMenu : MonoBehaviour
    {
        public Button playButton;
    
        void Start()
        {
            playButton.onClick.AddListener(OnPlayClicked);
        }
    
        void OnPlayClicked()
        {
            string lastPlayedScene = PlayerPrefs.GetString("LastPlayedScene", "");
    
            if (!string.IsNullOrEmpty(lastPlayedScene))
            {
                // 存在上次游玩记录,加载该场景
                SceneManager.LoadScene(lastPlayedScene);
            }
            else
            {
                // 没有记录,加载最后解锁的关卡
                int maxUnlockedLevel = PlayerPrefs.GetInt("MaxUnlockedLevel", 1);
                SceneManager.LoadScene($"Level_{maxUnlockedLevel}");
            }
        }
    }
    

一些注意事项

  • 记得在代码顶部引用using UnityEngine.SceneManagement;,不然SceneManager会报错
  • PlayerPrefs存储的数据是明文的,如果你的游戏需要防作弊,可以考虑加密存储(比如简单的XOR加密,或者用第三方存档插件)
  • 如果你的关卡场景是用索引而不是名称加载,把SceneManager.LoadScene(sceneName)改成SceneManager.LoadScene(sceneIndex)即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:30:53