游戏跨场景数据存储求助:关卡与教程状态持久化需求
跨场景数据存储解决方案
针对你需要保存关卡完成状态、教程完成状态,实现跨场景数据共享且避免重置的需求,以下是几种实用的游戏开发方案(以Unity为例,其他引擎可类比适配):
1. 单例模式(内存级跨场景共享 + 可选持久化)
这是最常用的跨场景数据管理方式,通过全局唯一的MonoBehaviour对象存储数据,确保场景切换时不被销毁:
public class GameDataManager : MonoBehaviour { public static GameDataManager Instance; // 存储核心数据 public bool isTutorialCompleted; public int unlockedLevel = 0; // 0=未解锁关卡,1=解锁第一关,依此类推 void Awake() { // 单例初始化逻辑 if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); // 标记对象不随场景销毁 LoadPersistentData(); // 启动时加载本地存储数据 } else { Destroy(gameObject); // 销毁重复实例 } } // 更新教程完成状态 public void MarkTutorialCompleted() { isTutorialCompleted = true; SavePersistentData(); } // 解锁下一关 public void UnlockNextLevel() { unlockedLevel++; SavePersistentData(); } // 从本地加载数据 private void LoadPersistentData() { isTutorialCompleted = PlayerPrefs.GetInt("TutorialCompleted", 0) == 1; unlockedLevel = PlayerPrefs.GetInt("UnlockedLevel", 0); } // 保存数据到本地 private void SavePersistentData() { PlayerPrefs.SetInt("TutorialCompleted", isTutorialCompleted ? 1 : 0); PlayerPrefs.SetInt("UnlockedLevel", unlockedLevel); PlayerPrefs.Save(); } }
- 使用方式:在任意场景中,通过
GameDataManager.Instance.isTutorialCompleted读取状态,调用GameDataManager.Instance.MarkTutorialCompleted()更新状态。 - 注意:将挂载该脚本的物体放在初始加载的场景(如菜单场景),确保全局唯一。
2. ScriptableObject(Unity专属,可编辑+持久化)
适合需要在编辑器中预设初始数据,同时支持跨场景共享的场景:
using UnityEngine; [CreateAssetMenu(fileName = "GameData", menuName = "Game/Game Data")] public class GameData : ScriptableObject { public bool isTutorialCompleted; public int unlockedLevel = 0; // 保存到本地存储 public void SaveToLocal() { PlayerPrefs.SetInt("TutorialCompleted", isTutorialCompleted ? 1 : 0); PlayerPrefs.SetInt("UnlockedLevel", unlockedLevel); PlayerPrefs.Save(); } // 从本地加载数据 public void LoadFromLocal() { isTutorialCompleted = PlayerPrefs.GetInt("TutorialCompleted", 0) == 1; unlockedLevel = PlayerPrefs.GetInt("UnlockedLevel", 0); } }
- 使用方式:在Project窗口右键创建
Game/Game Data实例,在任意脚本中引用该实例,直接读写数据。场景切换时,ScriptableObject的内存数据不会重置;若需重启游戏保留数据,需调用LoadFromLocal()和SaveToLocal()。
3. 静态类(无Mono依赖,轻量内存共享)
适合不需要MonoBehaviour生命周期、仅需内存级跨场景共享的简单数据:
public static class GameStaticData { public static bool IsTutorialCompleted { get; set; } public static int UnlockedLevel { get; set; } = 0; // 保存数据到本地 public static void Save() { PlayerPrefs.SetInt("TutorialCompleted", IsTutorialCompleted ? 1 : 0); PlayerPrefs.SetInt("UnlockedLevel", UnlockedLevel); PlayerPrefs.Save(); } // 从本地加载数据 public static void Load() { IsTutorialCompleted = PlayerPrefs.GetInt("TutorialCompleted", 0) == 1; UnlockedLevel = PlayerPrefs.GetInt("UnlockedLevel", 0); } }
- 使用方式:在游戏启动时(如菜单场景的
Start方法)调用GameStaticData.Load(),更新数据后调用GameStaticData.Save(),任意场景直接通过GameStaticData.IsTutorialCompleted访问数据。
核心注意事项
- 内存级存储(单例、静态类、ScriptableObject)仅在游戏运行期间保留数据,重启游戏会丢失,必须结合
PlayerPrefs(或自定义JSON文件、数据库)实现持久化。 - 若使用其他引擎(如Unreal),可对应使用引擎内置的全局对象(如Unreal的GameInstance)实现跨场景数据共享。
内容的提问来源于stack exchange,提问作者Car_Pea
相关产品推荐
相关产品推荐

