Отключаемый скрипт продолжает работать
| |
ShortKedr | Дата: Суббота, 31 Октября 2015, 20:43 | Сообщение # 21 |
Renword Studio
Сейчас нет на сайте
| Цитата seaman ( ) Затем, что без него это будет совсем другая функция, которую никто никогда вызывать не будет. Т.е. просто совершенно бесполезная. С чего вы это взяли. Всё спокойно вызывает. Для вашего кода это функция, для класса MonoBehavior это сообщение (что то типа делегата). То есть класс MonoBehavior вызывает 2 сообщения где то у себя в коде, если они прописаны в вашем коде(то есть присвоены). Но в OnTriggerStay(Collider collider) передаётся коллайдер игрока, а в OnTriggerStay() нечего не передаётся, что делает его более лёгким(так сказать)
Добавлено (31 октября 2015, 20:43) --------------------------------------------- Раньше о таком 2 варианте этого сообщение, вроде как, было даже записано в документации. И с тех пор, до сих пор существует)
Сообщение отредактировал ShortKedr - Суббота, 31 Октября 2015, 20:44 |
|
| |
seaman | Дата: Суббота, 31 Октября 2015, 20:47 | Сообщение # 22 |
старожил
Сейчас нет на сайте
| У делегатов тоже есть сигнатура и по идее метод не должен вызываться. Более того, если есть нормальный метод (с параметром) - он и не вызывается. В документации нет сообщения без параметра. Видимо - это недостаток документации. Интересно много ли таких методов, которые вызываются, наплевать на сигнатуру? ЗЫ: если раньше было в документации - возможно метод без параметра устаревший. Значит в любой момент может пропасть...
Сообщение отредактировал seaman - Суббота, 31 Октября 2015, 20:48 |
|
| |
ShortKedr | Дата: Суббота, 31 Октября 2015, 21:04 | Сообщение # 23 |
Renword Studio
Сейчас нет на сайте
| Цитата seaman ( ) Более того, если есть нормальный метод (с параметром) - он и не вызывается. Unity на вторую вариацию метода поругается(по идее). То есть он может быть только один. Следовательно, если нам нужно обращаться к стороннему коллайдеру, то мы прописываем этот параметр, если не нужно, то не прописываем.
Похоже, что это даже не делегаты и не просто функции класса, тк нет ни какой перезаписи методов и сигнатуры разные. Похоже это само ядро Unity их обрабатывает, как в чистом C# функция входа в программу. Мы ведь ей не пишем override или ещё что то, тк это ядро языка. Поэтому и допускается такая запись
Добавлено (31 октября 2015, 21:01) ---------------------------------------------
Цитата seaman ( ) ЗЫ: если раньше было в документации - возможно метод без параметра устаревший. Значит в любой момент может пропасть... не факт, что оно было) Я впервые это не из документации взял)
Цитата seaman ( ) Интересно много ли таких методов, которые вызываются, наплевать на сигнатуру? Вроде только связанные с триггерами и коллизиями, больше не видел пока
Сообщение отредактировал ShortKedr - Суббота, 31 Октября 2015, 21:08 |
|
| |
seaman | Дата: Суббота, 31 Октября 2015, 21:33 | Сообщение # 24 |
старожил
Сейчас нет на сайте
| Цитата Unity на вторую вариацию метода поругается(по идее). Не ругается. Во всяком случае ошибки нет.
|
|
| |
ShortKedr | Дата: Суббота, 31 Октября 2015, 21:34 | Сообщение # 25 |
Renword Studio
Сейчас нет на сайте
| Цитата seaman ( ) Не ругается. Во всяком случае ошибки нет. Ну, прикольно) разобрались)
|
|
| |
KamiRonin | Дата: Суббота, 31 Октября 2015, 21:55 | Сообщение # 26 |
почти ветеран
Сейчас нет на сайте
| ИСПРАВЛЕНО 01/11/15:
OnTriggerEnter без параметров не сработает при попадании стороннего коллайдера в триггер, т.е. не будет вызвано. Ругаться юнити не будет - т.к. это просто "другая" функция для него.
Т.ч. сигнатура неизменна! Никаких "если не надо обращаться к столкнувшемуся коллайдеру то можно опустить" - все четко и ясно.. Если событие вообще должно отлавливаться - то пишем по сигнатуре - с параметром Коллайдер! ) Unity разрешает обе формы записи - и параметрическую и безпараметрическую всех событий по коллизиям.
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Суббота, 31 Октября 2015, 23:31 |
|
| |
ShortKedr | Дата: Суббота, 31 Октября 2015, 23:13 | Сообщение # 27 |
Renword Studio
Сейчас нет на сайте
| Цитата KamiRonin ( ) OnTriggerEnter без параметров не сработает при попадании стороннего коллайдера в триггер, т.е. не будет вызвано. Ругаться юнити не будет - т.к. это просто "другая" функция для него. То есть? Всё скокойно работает, если другие коллайдеры попадают в триггер. У вас просто не будет доступа к колайдерам, которые вошли в триггер. Точно также и с коллизиями.
Я не понимаю, откуда вы берете такую инфу? Причём совершенно не соответствующую истине!
Смотри внимательно на скриншоты:
Добавлено (31 октября 2015, 22:58) --------------------------------------------- Прежде чем говорить чужие глупости, сами проверьте истинность утверждения! Нечему нельзя верить наслово Да, и это немного другое событие! Их по 2 типа существует. Большинство людей, которые программировали в 3 версии знают об этом приколе) Это всего лишь 2 разных записи метода. В один передаётся коллайдер, с которым мы столкнулись. В другой нечего не передаётся, он просто вызывается без параметров, а значит как один из доступных вариаций. Перезагрузка метода, если не знаете.
Добавлено (31 октября 2015, 23:13) ---------------------------------------------
Цитата ShortKedr ( ) пишем по сигнатуре - с параметром Коллайдер! ) Существуют 2 сигнатуры, так сказать. Они обе рабочие и используются ядром Unity для вызова соответствующих сообщений (событий) В самом ядре Unity они прописаны по разному: например:
Код delegate void OnTriggerEnter(); delegate void OnTriggerEnterParam(Collider collider);
Т.к. OnTriggerEnter просто функция в MonoBehaviour, следует, что Unity сам соединяет их с нужными делегатами
Сообщение отредактировал ShortKedr - Суббота, 31 Октября 2015, 23:22 |
|
| |
KamiRonin | Дата: Суббота, 31 Октября 2015, 23:25 | Сообщение # 28 |
почти ветеран
Сейчас нет на сайте
| мдааа.. скриншотов насовал на целую презентацию.. не лень жеж было.. )
Цитата ShortKedr ( ) Я не понимаю, откуда вы берете такую инфу? честно сказать - старый опыт.. когда писал в скриптах без переменных - не мог понять почему не ловились события.. и приучил себя ставить с сигнатурными переменными.. меня удивило конечно что 3 версия упоминается - я как раз там словил этот опыт.. хотя столько времени прошло... нарывался тогда несколько раз на неполном написании - точно помню... )
так что Цитата ShortKedr ( ) сами проверьте истинность утверждения - это как раз оттуда.. сейчас конечно смысла спорить нет - действительно две сигнатуры позволяет.. причем если ставить одновременно в скрипте и безпараметрическую и параметрическую версию - то срабатывает только первая по записи в скрипте! Для меня это все еще странно.. Мелочь, а неприятно..
так что о могучий скриншотер ShortKedr, признаю, возможны два варианта сигнатур! )
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
ShortKedr | Дата: Суббота, 31 Октября 2015, 23:31 | Сообщение # 29 |
Renword Studio
Сейчас нет на сайте
| Ну кстати, я тут покапался в коде MonoBehaviour. У него есть функции оправки сообщений и их обработки. Это и объясняет то, что Update, Start и т.д. - это никакие не делегаты. Насколько я помню в 3 версии тоже работало 2 варианта. Но может вы с более старой версии начали. У меня была где-то 3.4
Пожалуй шикарный механизм с сообщениями)Добавлено (31 октября 2015, 23:31) ---------------------------------------------
Цитата KamiRonin ( ) причем если ставить одновременно в скрипте и безпараметрическую и параметрическую версию - то срабатывает только первая по записи в скрипте! Для меня это все еще странно.. Ну похоже ловит только первую найденную вариацию, выполняет и прекращает функцию отлова подобных методов
Сообщение отредактировал ShortKedr - Суббота, 31 Октября 2015, 23:30 |
|
| |
KamiRonin | Дата: Суббота, 31 Октября 2015, 23:33 | Сообщение # 30 |
почти ветеран
Сейчас нет на сайте
| Цитата ShortKedr ( ) Пожалуй шикарный механизм с сообщениями) бродкастинг.. я не стал об этом писать - думал это и так понятно раз оверрайдеры не используются.. :)
Цитата ShortKedr ( ) У меня была где-то 3.4 да, у меня 3.5 версия в которой я с коллизиями заморочился..
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
ShortKedr | Дата: Суббота, 31 Октября 2015, 23:36 | Сообщение # 31 |
Renword Studio
Сейчас нет на сайте
| Цитата KamiRonin ( ) бродкастинг.. я не стал об этом писать - думал это и так понятно раз оверрайдеры не используются.. :) Да, знаю
Пока Unity будут улучшать и улучшать, такие споры не будут кончаться
Сообщение отредактировал ShortKedr - Воскресенье, 01 Ноября 2015, 00:01 |
|
| |
seaman | Дата: Воскресенье, 01 Ноября 2015, 13:32 | Сообщение # 32 |
старожил
Сейчас нет на сайте
| О! и KamiRonin на этом попался. Я тоже сначала написал достаточно жестко, что без параметров работать не будет. И тоже из какого-то предыдущего опыта. Потом прежде чем отправить решил проверить и был неприятно удивлен! Оказывается будет...
|
|
| |
ShortKedr | Дата: Воскресенье, 01 Ноября 2015, 13:59 | Сообщение # 33 |
Renword Studio
Сейчас нет на сайте
| Ну, нечего! Главное, что опыта прибавилось и во всём разобрались. Мы же не будем ругаться из за этого
Сообщение отредактировал ShortKedr - Воскресенье, 01 Ноября 2015, 14:00 |
|
| |
|