Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 17.02.2016, 14:46   #1
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,308
Написано 5,156 полезных сообщений
(для 14,893 пользователей)
DestroyImmediate

Господа, у меня снова вопрос из серии "Не фигню ли я делаю?".

В-общем, на меня напала блажь, и я решил видеть прямо в редакторе результаты действия моего компонента при помощи [ExecuteInEditMode].

Компонент у меня создаёт в OnEnable несколько gameObject'ов, которые свистят и пердят определённым образом.

Так как юнити в редакторе делает OnDisable/OnEnable каждый раз, как я вношу правки в скрипт, они у меня по OnEnable плодятся и плодятся. Посему я стал "подтирать за собой" в методе OnDisable, при помощи Destroy уничтожая наплодившуюся братву и освобождая место для новой.

Тут меня ждал сюрприз: в редакторе Юнити не хочет работать Destroy, вместо него рекомендуют примернять DestroyImmediate:

Destroy may not be called from edit mode! Use DestroyImmediate instead.
Also think twice if you really want to destroy something in edit mode. Since this will destroy objects permanently.
Дважды подумав, как мне порекомендовал текст ошибки, я залез в справку по сабжу и прочитал там следующее:
You are strongly recommended to use Destroy instead.
Таким образом, я выдавил из себя вот что:

if (Application.isEditor)
            {
                
DestroyImmediate(go);
            }
            else
            {
                
Destroy(go);
            } 
Вопрос: не фигню ли я сделал? Почему редактор так упорно не хочет делать Destroy, какие причины? И если всё так уж однозначно (в редакторе сабж, не в редакторе Destroy), то почему оно не делается так автоматически?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (17.02.2016)
Старый 17.02.2016, 14:56   #2
Mr_F_
Легенда
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,867
Написано 2,126 полезных сообщений
(для 5,704 пользователей)
Ответ: DestroyImmediate

да вроде всё верно, просто Destroy может откладываться на попозже для уменьшения лага по-моему
__________________
бложик
geom.io
твиттер
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
ABTOMAT (17.02.2016), Randomize (17.02.2016)
Старый 17.02.2016, 15:20   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,494
Написано 2,952 полезных сообщений
(для 5,214 пользователей)
Ответ: DestroyImmediate

Mr_F_ правильно сказал, Destroy выполняется не мгновенно. На скриптах объектов срабатывают события OnDisable и OnDestroy в конце кадра. Так же в Destroy можно передать задержку, если нужно (она по умолчанию равна нулю).
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
ABTOMAT (17.02.2016), Randomize (17.02.2016)
Старый 17.02.2016, 16:46   #4
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,308
Написано 5,156 полезных сообщений
(для 14,893 пользователей)
Ответ: DestroyImmediate

В-общем, оказалось, что теперь в редакторе при OnDisable скрипт какает вот этим:
Cannot destroy GameObject while it is being activated or deactivated.
И удалять созданное не желает. Гугление по ошибке дало топики на стек-эксченджах, что чуваки пытаются проделывать это с null'ами, но это не мой случай, и проверка на null не помогает. Разбираться сейчас некогда, поэтому отключил исполнение в эдит-моде (в принципе оно нафиг не нужно, но хотелось бы всё же разобраться). Если кому-то есть что сказать, я бы послушал.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 17.02.2016, 17:26   #5
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,887
Написано 1,182 полезных сообщений
(для 3,287 пользователей)
Ответ: DestroyImmediate

Как вариант или как костыль можно твои создаваемые объекты схоронить в массиве/листе, и создавать только если они еще не созданы иначе обновить позицию, стейты и тд. Эдакий pool объектов сделать.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Nex за это полезное сообщение:
ABTOMAT (17.02.2016), Mr_F_ (17.02.2016)
Старый 17.02.2016, 21:01   #6
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 25.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,308
Написано 5,156 полезных сообщений
(для 14,893 пользователей)
Ответ: DestroyImmediate

Сообщение от Nex Посмотреть сообщение
Как вариант или как костыль можно твои создаваемые объекты схоронить в массиве/листе, и создавать только если они еще не созданы иначе обновить позицию, стейты и тд. Эдакий pool объектов сделать.
Ну, это довольно костыльно, учитывая, что у меня регулируется их количество (т.е. удалять всё-таки может понадобиться).
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 17.02.2016, 23:28   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,494
Написано 2,952 полезных сообщений
(для 5,214 пользователей)
Ответ: DestroyImmediate

Можно наверное вместо удаления пометить объект как ненужный...
go.hideFlags HideFlags.HideAndDontSave
А в целом можно наверное эти созданные объекты активировать и деактивировать, вместо удаления. Записывая их например в чайлды к основному объекту. В следующий раз делать поиск и активацию вместо создания.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 04:33.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com