Пятница, 22 Ноября 2024, 22:40

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Отключаемый скрипт продолжает работать
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
и всякое такое. Результата ноль cry


Сообщение отредактировал 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)
  {
    ...
  }
}

Но это какой-то бред! Скрипт неактивен и проверяет активен ли он и если неактивен, то ничего не делать. Как он срабатывает, если он неактивен, я не понимаю cry :'( %)
С одноразовыми скриптами разобрался их удалением, а не отключением:
Код
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 ()
Если честно, то без профита не понимаю, откуда Вы берете информацию. Можно ссылочки? Или это опытным путем выяснялось?

Он же дал ссылку на мануал в котором все написано wink




Накодил? Убери за собой!
Инвентарь в 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, игнорируют его. dry
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

Если хотите проверить, то просто скачайте и откройте у себя. Один шарик и один триггер с одним скриптом. Больше ничего там нет smile Скрипт отключить невозможно, потому что, видимо, событие 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
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг