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

游戏跨场景数据存储求助:关卡与教程状态持久化需求

跨场景数据存储解决方案

针对你需要保存关卡完成状态、教程完成状态,实现跨场景数据共享且避免重置的需求,以下是几种实用的游戏开发方案(以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:07:38