Unity开发需求:点击开始按钮加载最后解锁或上次游玩的关卡
嘿,这两个需求都是Unity游戏里很常见的存档逻辑,我给你拆解成两个独立的实现方案,你可以根据需求组合起来用:
一、实现「点击播放按钮加载最后解锁关卡」的逻辑
核心思路是持久化存储玩家的最高解锁关卡进度,点击播放时读取这个值并加载对应场景:
存储解锁进度
当玩家完成一个关卡并解锁下一关时,更新存档里的最高解锁关卡号。用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(); // 确保数据写入本地 } } }播放按钮的加载逻辑
在你的主菜单播放按钮上绑定点击事件,读取存档里的最高解锁关卡并加载: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}"); } }
二、实现「重启游戏后加载上次游玩的最后关卡」的逻辑
核心思路是在玩家退出游戏或切换关卡时,记录当前所在的场景,下次启动游戏点击播放时读取这个记录:
记录当前游玩的场景
推荐在两个时机记录:一是切换关卡前,二是游戏退出前(双保险,避免崩溃导致记录丢失):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(); } }播放按钮的加载逻辑(结合解锁关卡的逻辑)
如果有上次游玩的记录就加载该场景,没有则加载最后解锁的关卡: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
相关产品推荐
相关产品推荐

