我正在使用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();
}
以下是显示会发生什么情况的图像: