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

Unity Play Mode下自定义关卡编辑器的场景保存方法咨询

Unity Play Mode关卡编辑器场景/数据保存方案

方案一:预先创建空场景,Play Mode修改后直接保存

这是最省心的方式,完全不用手动处理序列化,Unity会自动保存所有对象的嵌套结构、组件参数:

  1. 在Edit Mode下创建一个空场景(比如命名为CustomLevel.unity),保存到项目的Assets/Scenes目录下。
  2. Play Mode启动后,将你通过关卡编辑器创建的所有对象添加到该场景中(直接在场景内创建也可以)。
  3. 调用Unity的SceneManager API完成保存:
using UnityEngine.SceneManagement;

public void SaveCustomLevel()
{
    // 获取目标场景(确保场景已加载)
    Scene levelScene = SceneManager.GetSceneByName("CustomLevel");
    if (!levelScene.isLoaded)
    {
        Debug.LogError("目标场景未加载,无法保存");
        return;
    }
    // 保存场景,第二个参数指定路径,会覆盖原有文件
    bool saveResult = SceneManager.SaveScene(levelScene, "Assets/Scenes/CustomLevel.unity", SaveSceneFlags.None);
    Debug.Log(saveResult ? "关卡保存成功" : "关卡保存失败");
}
  • 优势:自动保留所有GameObject的嵌套层级、组件属性、预制体引用,无需手动处理任何数据解析。
  • 注意:如果是Runtime环境下的关卡编辑器(而非Editor内Play Mode),需要确保场景路径有权限写入,可改用Application.persistentDataPath作为保存路径。

方案二:用ScriptableObject序列化关卡数据

如果不想直接保存场景,可将关卡核心数据序列化到ScriptableObject中,Unity原生支持嵌套结构和可序列化字段的自动处理:

  1. 创建序列化数据类:
using UnityEngine;

[CreateAssetMenu(fileName = "NewLevel", menuName = "Level/Level Data")]
public class LevelData : ScriptableObject
{
    public LevelObject[] objectsInLevel;
}

[System.Serializable]
public class LevelObject
{
    public string prefabResPath; // 预制体资源路径,用于后续加载
    public Vector3 pos;
    public Quaternion rot;
    public Vector3 scale;
    // 按需添加组件的关键参数,比如交互组件的属性
    public bool canInteract;
    public float interactDistance;
}
  1. Play Mode中收集数据并保存:
using UnityEngine;
using System.IO;

public void SaveLevelToScriptableObject()
{
    LevelData levelData = ScriptableObject.CreateInstance<LevelData>();
    // 遍历关卡内所有对象,填充数据到levelData.objectsInLevel
    // 示例逻辑(需根据你的编辑器对象结构调整)
    GameObject[] levelObjects = GameObject.FindGameObjectsWithTag("LevelObject");
    levelData.objectsInLevel = new LevelObject[levelObjects.Length];
    for (int i = 0; i < levelObjects.Length; i++)
    {
        GameObject obj = levelObjects[i];
        Interactable interactComp = obj.GetComponent<Interactable>();
        levelData.objectsInLevel[i] = new LevelObject
        {
            prefabResPath = GetPrefabPath(obj), // 需自行实现获取预制体路径的逻辑
            pos = obj.transform.position,
            rot = obj.transform.rotation,
            scale = obj.transform.localScale,
            canInteract = interactComp != null ? interactComp.enabled : false,
            interactDistance = interactComp != null ? interactComp.range : 0f
        };
    }
    // 将ScriptableObject序列化为JSON保存到本地
    string json = JsonUtility.ToJson(levelData, true);
    string savePath = Path.Combine(Application.persistentDataPath, "CurrentLevel.json");
    File.WriteAllText(savePath, json);
    Debug.Log("关卡数据已保存到:" + savePath);
}
  • 优势:数据与场景分离,便于后续加载和修改单个参数,适合需要灵活编辑关卡数据的场景。

内容的提问来源于stack exchange,提问作者Калашников Ян

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:35:12