Unity Play Mode下自定义关卡编辑器的场景保存方法咨询
Unity Play Mode关卡编辑器场景/数据保存方案
方案一:预先创建空场景,Play Mode修改后直接保存
这是最省心的方式,完全不用手动处理序列化,Unity会自动保存所有对象的嵌套结构、组件参数:
- 在Edit Mode下创建一个空场景(比如命名为
CustomLevel.unity),保存到项目的Assets/Scenes目录下。 - Play Mode启动后,将你通过关卡编辑器创建的所有对象添加到该场景中(直接在场景内创建也可以)。
- 调用Unity的
SceneManagerAPI完成保存:
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原生支持嵌套结构和可序列化字段的自动处理:
- 创建序列化数据类:
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; }
- 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,提问作者Калашников Ян
相关产品推荐
相关产品推荐

