通过脚本加载预制件并将场景保存在Unity Editor中

时间:2019-11-10 15:29:47

标签: c# unity3d unity-editor

我正在使用Unity 2019.2.6f1

我有一个用于主要比赛场地的场景。所有字符均为预制件。每个级别都保存到一个JSON文件中,该文件控制要为场景加载哪些字符以及将其放置在何处。

我有一个编辑器脚本(SaveLevel),它将基于在编辑器中配置场景的方式来创建JSON文件。我还有第二个编辑器脚本(LoadLevel),它将读取JSON文件并为该级别设置场景。

这都是在设计时在编辑器中完成的。我可以保存和加载级别很好。但是,在加载一个关卡后,如果按下播放按钮以测试该关卡,场景将重置为一个空场景(加载关卡之前的情况)。

如何将预制件加载到场景中并保存场景以便测试水平?

这是我用于加载关卡的代码:

-编辑- 根据@Ron的回复,此修复程序是下面LoadLevel()中的代码更改。

private void LoadLevel()
{
    string path = Path.GetFullPath($"{Constants.LEVEL_FILE_PATH}{_world}-{_stage}.json");
    StreamReader reader = new StreamReader(path);
    string levelJson = reader.ReadToEnd();
    Level level = JsonConvert.DeserializeObject<Level>(levelJson);

    var worldText = GameObject.FindObjectsOfType<TextMeshProUGUI>().ToList().FirstOrDefault(t => t.tag.Equals("World"));
    var levelText = GameObject.FindObjectsOfType<TextMeshProUGUI>().ToList().FirstOrDefault(t => t.tag.Equals("Stage"));
    worldText.text = _world;
    levelText.text = _stage;

    level.Bench.ForEach(b => LoadPrefab(b.TypeName, b.Position));
    level.Field.ForEach(f => LoadPrefab(f.TypeName, f.Position));

#if UNITY_EDITOR
        /// The fix is to change the 'Save' call to MarkSceneDirty() as answered by @Ron. 
        // EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();
        EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
#endif
}

private void LoadPrefab(string prefabName, Vector3Simple position)
{
    string prefabPath = $"{Constants.PREFAB_PATH}{prefabName}.prefab";
    var asset = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
    var prefab = (GameObject)PrefabUtility.InstantiatePrefab(asset);
    prefab.transform.position = new Vector3(position.x, position.y, position.z);
    if (position.y > Constants.TOP_OF_PLAYFIELD && prefab.GetComponent<Animal>() != null)
    {
        prefab.GetComponent<Animal>().Locked = false;
    }

    AssetDatabase.SaveAssets();
}

以下是显示会发生什么情况的图像:

Before loading the level in the editor

After loading the level in the editor

After hitting the 'Play' button

0 个答案:

没有答案