Destroy () больше не работает в Unity3D
Я работаю над гоночной игрой, в которой есть спидбустеры на земле. Когда автомобиль касается его, сценарий, прикрепленный к ускорителю скорости, создает экземпляр префаба Fire, а затем уничтожает его через 2 секунды.
Это мой сценарий (на C #), который раньше работал нормально, но теперь функция Destroy () не работает, и я могу видеть экземпляры моего префаба Fire в иерархии игры:
Вы видели случай, когда этот скрипт не уничтожил бы экземпляр Fire1?
3 ответа
Если в _fireDurationMs происходят два события OnTriggerEnter, вы получите два новых экземпляра объектов, и только один будет уничтожен, потому что вы сохраняете ссылку только на последний пожар.
Если бы это была моя игра, я бы немного улучшил дизайн. Вместо того, чтобы возлагать ответственность за уничтожение огня на спидбустеры, вы можете создать скрипт с названием что-то вроде «DestroyAfterMilliseconds», который уничтожает gameObject, к которому он прикреплен, по истечении заданного времени, и прикрепляет его к префабу огня. Тогда каждый пожар будет нести ответственность за само уничтожение, и у спидбустеров будет меньше ответственности. Затем этот же сценарий можно повторно использовать для любых других объектов, которым вы хотите дать ограниченное время жизни. Разделение обязанностей также упростит отладку и сопровождение кода.
Вам просто нужно добавить скрипт для вашего огненного объекта.
Теперь вам не нужно управлять своим огненным объектом в другом скрипте. Просто инициализируйте его, и Firescript обработает метод уничтожения.
Источник
Удаление(Destroy) GameObject не работает
Есть проект на unity. Суть в том, что при подгрузки нового(второго) уровня из префаба старый(первый) уровень с тегом Level я должен удалить. Делаю я это следующим образом:
Но, в результате мой hero падает на первом уровне на старое место, ну, то есть на первый Respawn Что делать — ума не приложу, ибо испробовал уже практически всё, что есть. Спасибо)
UPD: Ещё что хотелось бы отметить — сами объекты скрываются, то есть происходит реально ощущение, что всё удалилось, но программа так не думает.
1 ответ 1
Ну, для начала — не использовать FindWithTag ) трудно найти что-то более ненадежное и менее производительное.
Создайте класс GameLevel и повесьте его на корневой объект ваших уровней. Задайте в этом классе поля со ссылками на все нужные вам на уровне вещи — например, на точку респауна (например, назовём её RespawnPoint ).
Создайте класс LevelManager — путь он знает имена всех уровней и умеет их загружать и создавать в нужном месте. Пусть у него будет поле типа GameLevel , и если на момент смены уровня оно не null — менеджер уничтожает объект из него, после чего загружает, создаёт и назначает в него же новый уровень, а затем спаунит героя в точке, на которую ссылается поле RespawnPoint текущего GameLevel .
Искать объекты на сцене через имя или теги нужно только в самом крайнем случае 🙂 иначе всяческие непредвиденные ситуации будут у вас происходить довольно часто.
Источник