Удаление(Destroy) GameObject не работает

184
06 марта 2019, 05:50

Есть проект на unity. Суть в том, что при подгрузки нового(второго) уровня из префаба старый(первый) уровень с тегом Level я должен удалить. Делаю я это следующим образом:

    GameObject[] objects = GameObject.FindGameObjectsWithTag("Level");
    foreach (GameObject item in objects)
    {
        Destroy(item);
        Debug.Log("Destroy1");
    }
    objects = GameObject.FindGameObjectsWithTag("Respawn");
    foreach (GameObject item in objects)
    {
        Destroy(item);
        Debug.Log("Destroy2");
    }
    hero.level = Instantiate(AssetDatabase.LoadAssetAtPath(string.Format("Assets/Resources/Levels/{0}lvl.prefab",hero.lvl), typeof(GameObject))) as GameObject;
    hero.level.transform.position = new Vector3(0, 0, -1);
    Debug.Log(GameObject.FindGameObjectsWithTag("Level").Length);
    hero.gameObject.transform.position = GameObject.FindWithTag("Respawn").transform.position;

Но, в результате мой hero падает на первом уровне на старое место, ну, то есть на первый Respawn Что делать - ума не приложу, ибо испробовал уже практически всё, что есть. Спасибо)

UPD: Ещё что хотелось бы отметить - сами объекты скрываются, то есть происходит реально ощущение, что всё удалилось, но программа так не думает.

Answer 1

Ну, для начала - не использовать FindWithTag) трудно найти что-то более ненадежное и менее производительное.

Создайте класс GameLevel и повесьте его на корневой объект ваших уровней. Задайте в этом классе поля со ссылками на все нужные вам на уровне вещи - например, на точку респауна (например, назовём её RespawnPoint).

Создайте класс LevelManager - путь он знает имена всех уровней и умеет их загружать и создавать в нужном месте. Пусть у него будет поле типа GameLevel, и если на момент смены уровня оно не null - менеджер уничтожает объект из него, после чего загружает, создаёт и назначает в него же новый уровень, а затем спаунит героя в точке, на которую ссылается поле RespawnPoint текущего GameLevel.

Искать объекты на сцене через имя или теги нужно только в самом крайнем случае :) иначе всяческие непредвиденные ситуации будут у вас происходить довольно часто.

READ ALSO
Подключение GetComponent<Renderer>()

Подключение GetComponent<Renderer>()

Прохожу уроки по Unity и столкнулся с такой проблемой:

168
Получение данных из COM порта в Unity

Получение данных из COM порта в Unity

стоит задача получения данных из COM портаНаписал код на C# для консольного приложения прямо по инструкции на MSDN и всё замечательно работает

165