Я использую Unity 2019.2.6f1
У меня есть одна сцена, которую я использую для основного поля игры. Все персонажи являются сборными. Каждый уровень сохраняется в файле JSON, который контролирует, какие символы должны быть загружены для сцены и где они должны быть расположены.
У меня есть скрипт редактора (SaveLevel), который будет создавать файл JSON в зависимости от того, какУ меня есть сцена настроена в редакторе. У меня есть второй скрипт редактора (LoadLevel), который будет читать файл JSON и настраивать сцену для этого уровня.
Все это делается в редакторе во время разработки. Я могу сохранить и загрузить уровни в порядке. Однако после загрузки уровня, если я нажимаю кнопку воспроизведения, чтобы проверить уровень, сцена сбрасывается в пустую сцену (как это было до того, как я загрузил уровень).
Как я могу загрузить свои префабыв мою сцену и сохранить сцену, чтобы я мог проверить уровень?
Вот мой код для загрузки уровня:
- РЕДАКТИРОВАТЬ - Основано на ответе @Ron the fixэто изменение кода в 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();
}
Вот изображения, чтобы показать, что происходит: