Загружайте префабы через скрипт и сохраняйте сцену в Unity Editor - PullRequest
0 голосов
/ 10 ноября 2019

Я использую 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();
}

Вот изображения, чтобы показать, что происходит:

Before loading the level in the editor

After loading the level in the editor

After hitting the 'Play' button

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...