forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   DestroyImmediate (http://forum.boolean.name/showthread.php?t=20194)

ABTOMAT 17.02.2016 17:46

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.
Таким образом, я выдавил из себя вот что:

PHP код:

if (Application.isEditor)
            {
                
DestroyImmediate(go);
            }
            else
            {
                
Destroy(go);
            } 

Вопрос: не фигню ли я сделал? Почему редактор так упорно не хочет делать Destroy, какие причины? И если всё так уж однозначно (в редакторе сабж, не в редакторе Destroy), то почему оно не делается так автоматически?

Mr_F_ 17.02.2016 17:56

Ответ: DestroyImmediate
 
да вроде всё верно, просто Destroy может откладываться на попозже для уменьшения лага по-моему

pax 17.02.2016 18:20

Ответ: DestroyImmediate
 
Mr_F_ правильно сказал, Destroy выполняется не мгновенно. На скриптах объектов срабатывают события OnDisable и OnDestroy в конце кадра. Так же в Destroy можно передать задержку, если нужно (она по умолчанию равна нулю).

ABTOMAT 17.02.2016 19:46

Ответ: DestroyImmediate
 
В-общем, оказалось, что теперь в редакторе при OnDisable скрипт какает вот этим:
Цитата:

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

Nex 17.02.2016 20:26

Ответ: DestroyImmediate
 
Как вариант или как костыль можно твои создаваемые объекты схоронить в массиве/листе, и создавать только если они еще не созданы иначе обновить позицию, стейты и тд. Эдакий pool объектов сделать.

ABTOMAT 18.02.2016 00:01

Ответ: DestroyImmediate
 
Цитата:

Сообщение от Nex (Сообщение 304127)
Как вариант или как костыль можно твои создаваемые объекты схоронить в массиве/листе, и создавать только если они еще не созданы иначе обновить позицию, стейты и тд. Эдакий pool объектов сделать.

Ну, это довольно костыльно, учитывая, что у меня регулируется их количество (т.е. удалять всё-таки может понадобиться).

pax 18.02.2016 02:28

Ответ: DestroyImmediate
 
Можно наверное вместо удаления пометить объект как ненужный...
PHP код:

go.hideFlags HideFlags.HideAndDontSave

А в целом можно наверное эти созданные объекты активировать и деактивировать, вместо удаления. Записывая их например в чайлды к основному объекту. В следующий раз делать поиск и активацию вместо создания.


Часовой пояс GMT +4, время: 06:58.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot