Отключаемый скрипт продолжает работать
| |
Vuvk | Дата: Пятница, 30 Октября 2015, 12:08 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Всем привет! При переходе с Unity 4.x на Unity 5.x у меня возникло множество проблем, большинство которых я решил за несколько дней, но одна просто не поддаётся! Есть у меня в игре зоны-триггеры, при взаимодействии с которыми активируются/деактивируются объекты или компоненты. Ну так вот. После срабатывания такого триггера я хочу его отключить, но не удалять объект. В Unity 4 прекрасно работало:
Код void OnTriggerEnter (Collider col) { ... //отключить скрипт активации if (oneShoot) { GetComponent<TriggerAllInOne> ().enabled = false; } ... } Сейчас у меня версия 5.2.1f. После срабатывания триггера скрипт вроде отключается, но продолжает работать! Например, с отключенным скриптом в игре зона по-прежнему наносит урон игроку и врагам. Если скрипт отключить в редакторе и запустить, то он тоже работает и наносит урон. WTF!!! :
У меня просто идей уже нет, от чего такое возникать может. Пытался гуглить, но ни у кого, похоже, таких проблем не возникало? Пробовал вариации типа this.GetComponent gameObject.GetComponent и всякое такое. Результата ноль
Сообщение отредактировал Vuvk - Пятница, 30 Октября 2015, 12:28 |
|
| |
NEBR | Дата: Пятница, 30 Октября 2015, 13:37 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| не сталкивался с таким... Попробуй вешать скрипт на отдельный пустой объект и отключать его через SetActive
King Size #Gamiron12
|
|
| |
Vuvk | Дата: Пятница, 30 Октября 2015, 13:44 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Если отключать не только скрипт, но и триггер, то получается, что не будет срабатывать событие. Если же отключить только скрипт, то событие триггера продолжает обрабатываться. Сделал вот как:
Код void OnTriggerStay (Collider col) { if (GetComponent<Damager> ().isActiveAndEnabled) { ... } }
Но это какой-то бред! Скрипт неактивен и проверяет активен ли он и если неактивен, то ничего не делать. Как он срабатывает, если он неактивен, я не понимаю :'( %) С одноразовыми скриптами разобрался их удалением, а не отключением:
Код Destroy(GetComponent<TriggerAllInOne> ()); Однако, если захочется потом его включать, то тут явно проблема. Похоже, что это баг самой Unity...
Сообщение отредактировал Vuvk - Пятница, 30 Октября 2015, 14:13 |
|
| |
seaman | Дата: Пятница, 30 Октября 2015, 15:17 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| Цитата Похоже, что это баг самой Unity... Похоже вы просто не знаете, что делает enabled. Он отключает вызов периодически работающих функций - Update/LateUpdate/FixedUpdate/OnGUI. Плюс некоторые специфичные, типа OnPreRendering... Остальные не зависят от enabled. По сути список функций, которые зависят от enable есть на картинке тут: http://docs.unity3d.com/Manual/ExecutionOrder.html
Сообщение отредактировал seaman - Пятница, 30 Октября 2015, 15:25 |
|
| |
Vuvk | Дата: Пятница, 30 Октября 2015, 16:09 | Сообщение # 5 |
заслуженный участник
Сейчас нет на сайте
| Цитата seaman ( ) Похоже вы просто не знаете, что делает enabled Не исключаю и такое. Если
Цитата Enabled Behaviours are Updated, disabled Behaviours are not. то получается, что обрабатываются все события на той схеме ниже Update включительно?
|
|
| |
seaman | Дата: Пятница, 30 Октября 2015, 20:57 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| Нет. FixedUpdate выше и он не обрабатывается, если disable. Еще раз - не обрабатываются все update, плюс несколько других функций, в основном связанных с рендерингом.
|
|
| |
Vuvk | Дата: Пятница, 30 Октября 2015, 21:46 | Сообщение # 7 |
заслуженный участник
Сейчас нет на сайте
| Если честно, то без профита не понимаю, откуда Вы берете информацию. Можно ссылочки? Или это опытным путем выяснялось?
|
|
| |
ShortKedr | Дата: Пятница, 30 Октября 2015, 23:04 | Сообщение # 8 |
Renword Studio
Сейчас нет на сайте
| Цитата seaman ( ) FixedUpdate выше и он не обрабатывается, если disable. Еще раз - не обрабатываются все update, плюс несколько других функций, в основном связанных с рендерингом. Насколько мне известно при enabled = true обрабатываются все циклические функции. Если таких в коде нет, то галочки в инспекторе не будет.
Я думаю, что проблема всё же не в Unity. Косяк либо в коде, либо в сцене. Попробуйте сначала вынести всё это в отдельный объект. Если будет также "не работать", то ищите косяк в коде.
Ещё стоит посмотреть в документации, как и на что срабатывает триггер. Проверить не сбилось ли чего на самой сцене. После перехода с версии на версию может быть много косяков. Причём бывают такие, которые никак не исправить!
Не забываете, что когда Unity дают обновление, то часть структуры меняется. А когда это ещё и связано с построением структуры проектов, то "пиши пропало", т.к. читать уже будет по другому, а значит байты не в том порядке идти будут и информация о вашем проекте будет искажена.
Поэтому лучше до окончания разработки не переходить с версии на версию, т.к. много копать придётся, причём не только в Unity Editor, но и в файлах вашего проекта, а возможно и ещё глубже
Добавлено (30 октября 2015, 23:04) ---------------------------------------------
Цитата ShortKedr ( ) Не забываете, что когда Unity дают обновление, то часть структуры меняется. А когда это ещё и связано с построением структуры проектов, то "пиши пропало", т.к. читать уже будет по другому, а значит байты не в том порядке идти будут и информация о вашем проекте будет искажена.
Я конечно понимаю, что на это можно сказать: "Unity при переходе сам рефакторинг делает". Да вот нет, нефига! Он рефакторит под себя библиотеку ресурсов, а все данные о вашем проекте остаются неизменными. Например ProjectSettings, QualitySettings и т.п.
В переходе с 5.1.1f1 на 5.2.2f1 видел косяк с освещение и OcclusionCucling - всё чёрным становилось, причём без OcclusionCucling всё норм. Это один из косяков связанный с настройками освещения
Если бы вы с 1, 2 или 3 версии перенесли, ваш проект бы покрашился, причём конкретно
Сообщение отредактировал ShortKedr - Пятница, 30 Октября 2015, 23:13 |
|
| |
beril | Дата: Суббота, 31 Октября 2015, 00:18 | Сообщение # 9 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Цитата Vuvk ( ) Если честно, то без профита не понимаю, откуда Вы берете информацию. Можно ссылочки? Или это опытным путем выяснялось? Он же дал ссылку на мануал в котором все написано
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Vuvk | Дата: Суббота, 31 Октября 2015, 00:28 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| beril, гляжу в книгу и вижу фигу. Где здесь отображено, что enabled не затрагивает физику? За OnEnable как раз она и идет в первых рядах, разве нет?
|
|
| |
ShortKedr | Дата: Суббота, 31 Октября 2015, 00:42 | Сообщение # 11 |
Renword Studio
Сейчас нет на сайте
| Цитата Vuvk ( ) beril, гляжу в книгу и вижу фигу. Где здесь отображено, что enabled не затрагивает физику? За OnEnable как раз она и идет в первых рядах, разве нет? Ну вот как раз на схеме показано, что enabled затрагивает все сообщения класса MonoBehaviour, кроме OnDestroy, OnAwake, OnApplicationQuit и перезапуск скрипта в EditorДобавлено (31 октября 2015, 00:42) --------------------------------------------- То есть эти 4 "вещи" вызываются в любом случае
|
|
| |
Vuvk | Дата: Суббота, 31 Октября 2015, 08:22 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Протестировал на новой сцене. Простая сцена с простым триггером
Код using UnityEngine; using System.Collections;
public class TriggerTest : MonoBehaviour { void OnTriggerStay (Collider col) { Debug.Log ("I'm working!"); } }
И у него даже нет галки на отключение, а это доказывает версию товарища seaman. Что ж, буду учитывать эту особенность, но так и не понял, где описание этого всего и описание, какие конкретно события обрабатываются с enabled...
https://yadi.sk/d/wXKcnro2k8rJ8
|
|
| |
shizofren | Дата: Суббота, 31 Октября 2015, 09:15 | Сообщение # 13 |
Starting MS-DOS...
Сейчас нет на сайте
| Цитата Vuvk ( ) но так и не понял, где описание этого всего и описание, какие конкретно события обрабатываются с enabled... Серая стрелочка, которая идет от OnDisable и до OnEnable не охватывает те ивенты, которые не зависят от enabled. То есть это Reset, Awake, OnDestroy и OnApplicationQuit. Это уже сказал ShortKedr.
Моя команда
Сообщение отредактировал shizofren - Суббота, 31 Октября 2015, 09:16 |
|
| |
Vuvk | Дата: Суббота, 31 Октября 2015, 10:16 | Сообщение # 14 |
заслуженный участник
Сейчас нет на сайте
| shizofren, я в курсе, что он сказал и сам это увидел на схеме до его слов, но только это не отображает истину. События OnTrigger и OnCollision, которые по схеме должны быть зависимы от enabled, игнорируют его.
|
|
| |
ShortKedr | Дата: Суббота, 31 Октября 2015, 11:16 | Сообщение # 15 |
Renword Studio
Сейчас нет на сайте
| Цитата Vuvk ( ) shizofren, я в курсе, что он сказал и сам это увидел на схеме до его слов, но только это не отображает истину. События OnTrigger и OnCollision, которые по схеме должны быть зависимы от enabled, игнорируют его.
Может тут ещё срабатывают сторонние факторы. Например другие объекты В любом случае, лучше всегда всё проверять на истинность
Сообщение отредактировал ShortKedr - Суббота, 31 Октября 2015, 11:16 |
|
| |
Vuvk | Дата: Суббота, 31 Октября 2015, 11:19 | Сообщение # 16 |
заслуженный участник
Сейчас нет на сайте
| Я уже писал выше
Цитата Vuvk ( ) https://yadi.sk/d/wXKcnro2k8rJ8 Если хотите проверить, то просто скачайте и откройте у себя. Один шарик и один триггер с одним скриптом. Больше ничего там нет Скрипт отключить невозможно, потому что, видимо, событие OnTrigger не подчиняется enabled...
Сообщение отредактировал Vuvk - Суббота, 31 Октября 2015, 11:21 |
|
| |
ShortKedr | Дата: Суббота, 31 Октября 2015, 11:32 | Сообщение # 17 |
Renword Studio
Сейчас нет на сайте
| Цитата Vuvk ( ) видимо, событие OnTrigger не подчиняется enabled...
Ну да, не подчиняется. Теперь все MonoBehaviour перехватывают это у колайдера и если тот срабатывает, то вызывает сообщение. Отключаете сам колайдер или, если вам нужно, чтобы это работало через промежуток времени, сделаете интервал через Update или отдельный поток(лучше без потока отдельного).
Я не понимаю, зачем вы прописали параметр "Collider collider", если вы его не используете. Это же лишняя трата ресурсов компьютера. В небольших программах это не ощущается, но вот в больших и с большим кол-вом переменных ещё как. Всё должно быть оптимизировано, на будущее.
Сообщение отредактировал ShortKedr - Суббота, 31 Октября 2015, 11:37 |
|
| |
seaman | Дата: Суббота, 31 Октября 2015, 18:33 | Сообщение # 18 |
старожил
Сейчас нет на сайте
| Профит не дам -не могу найти. Просто поверьте - отключаются те функции, которые вызываются периодически не зависимо от внешних обстоятельств. Т.е. все виды Update, все связанные с рендерингом, все связанные с ГУИ. Остальные - вызываемые по внешнему событию остаются работающими. Это коллизии, триггеры, разные OnMouse, изменения видимости...
Цитата Я не понимаю, зачем вы прописали параметр "Collider collider", если вы его не используете. Затем, что без него это будет совсем другая функция, которую никто никогда вызывать не будет. Т.е. просто совершенно бесполезная.
|
|
| |
KamiRonin | Дата: Суббота, 31 Октября 2015, 19:59 | Сообщение # 19 |
почти ветеран
Сейчас нет на сайте
| Цитата Vuvk ( ) И у него даже нет галки на отключение я удалил его и закинул снова - и опять - нет галки на отключение и все! ) вот это меня удивило! сделал новый скрипт - повесил - есть галка!!! Открываю твой скрипт в VS - пишу в твоем классе void Start() {} галка вкл-откл компонента появляется нормально! Причина - тут, написана в абзаце с пометкой Note.
Так что самый простой способ это отключать не скрипт, а сам триггер! ;) Или сделать в скрипте по ОнЕнабле/ОнДизабле - вкл/выключение триггера программно.. ну такая вот у юнити теперь политика.. может это "исправят" по просьбам трудящихся в следующих релизах!?
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
seaman | Дата: Суббота, 31 Октября 2015, 20:27 | Сообщение # 20 |
старожил
Сейчас нет на сайте
| Цитата такая вот у юнити теперь политика. Почему "теперь"? Это всегда так было. Я вот профит не нашел, а ведь читал когда то давно об этом. Тут неправильность в том, что галочки нет, если есть OnPreRender и подобные функции, а они зависят от enable
|
|
| |
|