События в Unity. Как использовать? Делегаты Action и Func.

  Рет қаралды 28,931

Noob Game Dev

Noob Game Dev

2 жыл бұрын

Просто о событиях в Unity, используя делегаты Action, Func и шину событий (EventBus). События с параметрами и возвращаемым значением.
Discord: / discord

Пікірлер: 112
@user-iq3gu1ld6x
@user-iq3gu1ld6x 2 ай бұрын
Реально респект, наконец-то я нашёл достойный ролик по этой теме!!!
@1NewUser1
@1NewUser1 2 жыл бұрын
Респект автору! прям огромный, столько туториалов пересмотрел и только тут наконец понял что к чему
@NoobGameDev
@NoobGameDev 2 жыл бұрын
Спасибо! Это и было моей целью)
@piperka_animate
@piperka_animate Жыл бұрын
я такая же х-ня
@KlaoLord
@KlaoLord Жыл бұрын
same
@Ghost_Paladin
@Ghost_Paladin 5 ай бұрын
+++
@user-rl2ox1bu4c
@user-rl2ox1bu4c 13 күн бұрын
Идеальный урок! Спасибо. Очень помог. Мне события сложно было понять, а к Action я вообще боялся притрагиваться.
@eightuponatime
@eightuponatime 3 ай бұрын
Это самый шикарный урок. Все встало на свои места, спасибо!
@user-fd8zi5ib2b
@user-fd8zi5ib2b 6 күн бұрын
спасибо, полезная штука! Листал всякие гайды по юнити, просто от нефиг делать, только подумал "и так достаточно знаю" и тут на это наткнулся, впервые о таком слышу, после ролика сразу все понял, респект!
@spectatorspectator9079
@spectatorspectator9079 Ай бұрын
Обалдеть. Я зря все это время думал над тем, как связать свой GameManager с существующими монстрами!!! Спасибо за гайд!!
@winterflamestudio
@winterflamestudio Жыл бұрын
Блин реально это наверное самый понятный туториал)) Спасибо большое))
@djabramovskih
@djabramovskih 2 жыл бұрын
Работаю над проектом и решил оживить в памяти изученные события так как нужно использовать именно их, а тут на тебе все разжованно! Посмотрел и оживил в памяти все что нужно! Спасибо тебе большое!
@SergeyBobrov240
@SergeyBobrov240 Жыл бұрын
Вот оно - видео, которое дало начальное понимание о события в Unity!! Много разного пытался прочитать, посмотреть, но что-то все равно не лезло в голову, много вопросов оставалось. А в этом видео я услышал ответы на все эти вопросы. Спасибо за труды! 🔥👍
@johnleo7
@johnleo7 2 жыл бұрын
Это именно то, что мне было нужно. Всё, на чем ты сделал акценты, было не напрасно. Ответил на кучу вопросов, возникших в попытках разобраться. (Про разные варианты записи, про статику, про то зачем события, если можно просто указать ссылку на объект и тд). Спасибо большое за отличное объяснение.
@user-qc2rc8vg1p
@user-qc2rc8vg1p Ай бұрын
я тоже хочу выразить большую благодарность за прекрасно поданный материал.
@JohnAdamson-tw4wt
@JohnAdamson-tw4wt Жыл бұрын
Топ контент по юнити, просто огромное спасибо. Недавно досмотрел шарп на основе юнити по курсу Сакутина и начал искать себе материал для изучения юнити и наткнулся на этот канал - по юнити лучше пока что ничего не нашел. Спасибо огромное!
@armm6437
@armm6437 Жыл бұрын
Полезный видос. Я много видео громоздких смотрел на эту тему, первый раз вижу такое объяснение. Респект автору)
@katarsis6541
@katarsis6541 2 жыл бұрын
Спасибо, очень доступно всё объясняешь
@valentinsuyarov7345
@valentinsuyarov7345 Жыл бұрын
Спасибо за твою работу, очень помог !
@nikitanikita8843
@nikitanikita8843 3 ай бұрын
Самое понятное объяснение, спасибо!!!
@vladiy241
@vladiy241 Жыл бұрын
Пожалуй самое понятное видео по данной теме
@icefox2853
@icefox2853 Жыл бұрын
Спасибо, лучше всех объяснил! 😘
@user-lf1mx4og3x
@user-lf1mx4og3x 8 ай бұрын
Очень удобно. Разжовано, но для понимания так и нужно. То что разжевано - это комплимент.
@user-oe1hf4lu3x
@user-oe1hf4lu3x 2 жыл бұрын
Спасибо очень пригодилось. Я делаю игру на дипломный проект, и при заходе игрока в сессию мне нужно обновлять список игроков поэтому в сценарии где происходит обновлении списка я подписываюсь и очень хорошо работает.
@user-tn4zf8rz5l
@user-tn4zf8rz5l 6 ай бұрын
Спасибо! Очень доходчиво.
@maxlevashov7565
@maxlevashov7565 Жыл бұрын
Це найкращий гайд по івентам який я бачив, я боявся цих івентів все своє життя, а тут оказується, якщо гарно пояснити - то і я зрозумію, дякую та респект автору!
@Ghost_Paladin
@Ghost_Paladin 5 ай бұрын
Спасибо за урок, всё понял!!!
@JevLogin
@JevLogin Жыл бұрын
Хороший материал! Достойно )
@user-xy3xd8vh6n
@user-xy3xd8vh6n Жыл бұрын
спасибо большое! очень хорошо объяснил все
Жыл бұрын
Вроде вдуплил, осталось реализовать в существующем проекте и точно пойму. Спасибо ❤️
@heyyy8639
@heyyy8639 6 ай бұрын
Спасибо, отличное видео.
@user-eb2rz1ko8p
@user-eb2rz1ko8p 2 жыл бұрын
Привет тёска, давно тя не было слышно, с наступившим, всех благ, 👍👍👍
@NoobGameDev
@NoobGameDev 2 жыл бұрын
Привет) Появилось времени немного - решил напомнить о себе)) Спасибо, взаимно!) 👍
@bogdan9423
@bogdan9423 10 ай бұрын
Спасибо за объяснения. Пока хорошо понял только о static ) но видео очень интересное, когда-то пойму и всё остальное
@NoobGameDev
@NoobGameDev 10 ай бұрын
Могу посоветовать присоединиться к нашему дискорду (в описании канала есть ссылка) - общение с единомышленниками сильно повышает шансы на понимание многих тем)
@RomanUnreal
@RomanUnreal 11 ай бұрын
Спасибки!
@UnityCsharp
@UnityCsharp Жыл бұрын
Спасибо за видео.
@joehunter1971
@joehunter1971 2 жыл бұрын
Спасибо, чувак, очень помог
@thefox7734
@thefox7734 2 жыл бұрын
Супер Топ объяснение
@piperka_animate
@piperka_animate Жыл бұрын
огромное спасибо. только с твоей помощью разобрался. но в конце пришлось скорость на 0.75 ставить)))
@only_up
@only_up 2 жыл бұрын
Блин пасиба тебе ща все очень помог!
@nikitahlinsky7455
@nikitahlinsky7455 Жыл бұрын
Я понял события, спасибо чеелл)))
@user-kb4qv2zx9b
@user-kb4qv2zx9b Ай бұрын
От души, за видео!
@reise35
@reise35 2 жыл бұрын
Наконец то новое видео
@Tumanop
@Tumanop Жыл бұрын
Посмотрел видео про события и решил посмотреть что за канал и заодно подписаться, а тут херак я почти все видео просмотрел с туториалами но без подписки а за счет предложке ютуба)) Срочно исправил данный баг.
@NoobGameDev
@NoobGameDev Жыл бұрын
Благодарен))
@evgeniyivanov3973
@evgeniyivanov3973 Жыл бұрын
Выдайте автору медаль за труд!
@user-ij8vr8ss8s
@user-ij8vr8ss8s 2 жыл бұрын
суппер! спасибо!
@BattlebornSons
@BattlebornSons 4 ай бұрын
Спасибо!!!
@arylk4
@arylk4 11 ай бұрын
спасибо большое
@AnastasiKoko
@AnastasiKoko Жыл бұрын
Спасибо!
@nightkot4917
@nightkot4917 Жыл бұрын
При количестве возвращающих тип сущностей больше одной, от Func, и подозреваю, от Predicate толку никакого (если требуется выборка). Реальный пример - нужно вернуть Transform по имени поля. Имя поля - естественно enum. Сравниваем, возвращаем.К примеру имеется десять сущностей, нужный где то посередине. Ставим условие, что остальные вернут null, т.к. возвращаемый метод обязан в любом случае что то вернуть. Так вот, в этом случае вернется null. Его вернет последняя сущность, не овечающая условию. Плюнул, переделал обратно на старый надежный Action.
@TheKr0ckeR
@TheKr0ckeR 2 жыл бұрын
I've looked for english sources first, and there are not many good tutorials about Func. But even if i know a little russian, i got what the func is finally.
@NoobGameDev
@NoobGameDev 2 жыл бұрын
Wow! I'm glad I could help you in some way. This is inspiring, thanks)
@ktotakoi6037
@ktotakoi6037 Жыл бұрын
Хоть кто то проговорил про необходимость отписки от делегатов.
@gendgee
@gendgee Жыл бұрын
только здесь понял 🎉
@minne9065
@minne9065 Жыл бұрын
Это хороший. Даже кишка не выпала
@tomasgammister5776
@tomasgammister5776 Жыл бұрын
Привет автор. хорошие видосы у тебя ! не мог бы ты снять видос про урон одного объекта другому обойдя необходимость использования "тяжелого" GetComponent? сначала думал, что помогут события и слабая связность кода. но по мучавшись несколько дней, понял, что тут вопрос в архитектуре а не в связности компонентов. ))
@NoobGameDev
@NoobGameDev Жыл бұрын
Привет) Я не особо в этом разбираюсь, но не думаю, что GetComponet - это такая уж тяжёлая операция - всего-то сравнить типы компонентов на объекте, а их обычно не так много (Transform, SpriteRenderer, Animator, AudioSource, Collider и какой-нибудь скрипт). Другое дело - это свести к минимуму все эти поиски, т.е. чтобы искать не у всех объектов нужный компонент, а лишь у тех, у которых он может находиться. У меня обычно есть один-два слоя для врагов, и разрушаемых предметов. Так же есть интерфейс типа IDamageable, у которого есть метод TakeDamage(int value). И во время нанесения удара, на короткий момент я проверяю попали ли под удар объекты на слое, а потом уже ПЫТАЮСЬ найти компонент у нужных объектов: Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, damageRadius, damagebleLayers); if (colliders == null) { return; } foreach (Collider2D col in colliders) { if (col.gameObject.TryGetComponent(out IDamageable iDamage)) { iDamage.TakeDamage(damageValue); } } То же самое можно делать и с рейкастами и при коллизиях. А можно и вовсе искать не интерфейс, а необходимый скрипт.
@tomasgammister5776
@tomasgammister5776 Жыл бұрын
@@NoobGameDev спасибо что, так детально ответили !)
@borisnaftaliev2911
@borisnaftaliev2911 8 ай бұрын
👍
@NoobGameDev
@NoobGameDev 8 ай бұрын
Хорош! Спасибо))
@user-sz7ul6cw2n
@user-sz7ul6cw2n Жыл бұрын
Спасибо за подсказку со статическим событием, тоже столкнулся с неудобством, что нужно Игроку подписываться на события, когда Враг попадает по игроку 2 руками и 2 ногами(что бы у игрока отнять ХитПоинты) т.е это 4 подписки, а если врагов 10, это уже делать 40 подписок. Да, можно без событий при попадании получать скрипт Игрока и вызывать метод УменшитьХитПоинты. Как правильнее? Тут я озадачился, когда использование событий является лишним, а когда необходимым...?
@NoobGameDev
@NoobGameDev Жыл бұрын
Обычно, описанную Вами ситуацию решают вообще без событий) А например через интерфейсы. Но если в игре урон будет получать только перс (или перс и всего один-два типа врагов), то можно и вовсе без интерфейсов. У игрока делается публичный метод, например: public void TakeDamage (int value) { health -= value; // а дальше обычно идёт проверка: если здоровье перса ниже нуля, то... отключение, дестрой или что хотите. } А у самих врагов в методах проверки коллизий или триггеров ищется класс игрока и вызывается метод нанесения урона. Например, если скрипт, отвечающий за здоровье и урон у игрока, назван как "HeroHealth": private void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.TryGetComponent(out HeroHealth heroHealth)) { heroHealth.TakeDamage(20); // где в скобках передаётся величина урона. } }
@Manaworm
@Manaworm 2 жыл бұрын
Привет, твой гайд как сделать платформер топ!, можно гайд как кнопки добавить для телефона?!!
@rok1et74
@rok1et74 2 жыл бұрын
кто хочет делать игру в unity? все подробности расскажу в лс, но надо под комментарием написать +. Нужны:художники, аниматоры, кодер еще один, музыкант(писать музыку под фон и короткие звучания)
@nomadirl3380
@nomadirl3380 2 жыл бұрын
Привет. Спасибо за видео. Но у меня философская проблема. Ты привел хороший пример, когда на сцене 100 врагов, и надо нанести урон конкретному. Я хочу сделать это через событийную модель, где все 100 врагов подписаны на событие нанесения урона. Но неужели мне у каждого врага надо проверять "меня ли ударили?". Я не совсем понимаю, как бы сделать оптимизированно так, чтобы событие получения урона вызывалось у конкретного врага среди множества... (без лишних 100 `if`, которые тратят драгоценные такты процессора) Также я подозреваю, что есть несколько ограничений: 1) Лучше не использовать UnityEvent, потому что он в несколько раз медленнее встроенных C#-событий 2) Лучше не использовать GetComponent в менеджере событий, потому что это дорогой вызов, который обходит всё дерево компонентов объекта
@dmitrvy
@dmitrvy 2 жыл бұрын
Не нужно делать получение урона конкретным врагом через события.
@user-od2ti8lg6z
@user-od2ti8lg6z 2 жыл бұрын
Спасибо за видео) А где лучше отписываться от события?
@NoobGameDev
@NoobGameDev 2 жыл бұрын
Лучше в OnDisable, так как при удалении объекта (onDestroy) всё равно будет сначала вызван onDisable. А в обратную сторону такое не сработает. Похожая ситуация и при создании объекта - в нём будет вызван onEnable. Так что связка onEnable / onDisable, на мой взгляд самая надёжная)
@user-od2ti8lg6z
@user-od2ti8lg6z 2 жыл бұрын
@@NoobGameDev окей, пасибо)
@The_Mavrik
@The_Mavrik 2 жыл бұрын
а как же UnityEvent ?
@realmukaUnity
@realmukaUnity Жыл бұрын
Помогите пожалуйста! У меня есть несколько врагов. Я стреляю по ним из автомата(стрельба сделана с помощью рэйкаста) и по ним наносится урон при попадании. Однако урон наносится сразу всем врагам а не одному, хотя я остальных не трогал.
@NoobGameDev
@NoobGameDev 11 ай бұрын
Точно знать не могу, но сдаётся мне, что у Вас переменная, в которой хранится здоровье врага, имеет модификатор доступа "static", в таком случае это переменная будет общей для всех экземпляров класса (копий врага). На 4:28 я именно об этом и говорил)
@MegaMaxxa
@MegaMaxxa 2 жыл бұрын
Как на 10:45 у меня так событие не инвокается, компилятор не дает. Пишет, что событие EventBus.OnTest может присутствовать только в левой части выражания перед -= и +=. Инвокается только в самом классе EventBus. Поэтому приходится под каждое событие в EventBus метод создавать для вызова, и к нему уже обращаться при надобности
@NoobGameDev
@NoobGameDev 2 жыл бұрын
Это происходит потому что в видео не используется ключевое слово event - это даёт возможность вызвать делегат из другого класса. Однозначно, Ваш способ корректнее и потенциально может вызвать меньшее количество ошибок и исключений!, просто способ описанный в видео более гибкий и, сугубо на мой взгляд, не плохо подходит для беглого ознакомления с делегатами и быстрого использования в любительских проектах.
@egtgwithpathv.2763
@egtgwithpathv.2763 Жыл бұрын
Два раза пересмотрел лекцию из GB по теме делегатов и событий - нихрена не понял. Заютубил, нашел это видео на 11 минут. Понял. Как это блин работает?)
@Mixman-_-
@Mixman-_- 2 жыл бұрын
: )
@NoobGameDev
@NoobGameDev 2 жыл бұрын
( :
@user-tu4lx7ou3s
@user-tu4lx7ou3s 2 жыл бұрын
Как сделать стрельбу и удар в 2д игре? Расскажи пожалуйста.
@NoobGameDev
@NoobGameDev 2 жыл бұрын
На самом деле это тема на несколько видео. В планах конечно же они есть. Но в комментариях нам с вами не хватит нервов, чтобы и объяснить, и понять) Так что советую посмотреть других авторов (т.к. у меня не знаю, когда затронутся эти темы), например, у Brackeys я, кажется, видел и стрельбу и удары, рекомендую: kzbin.infovideos
@Bushido_Cat
@Bushido_Cat 9 ай бұрын
Автор прошу тебя помочь! Может кто мне обяснить? Как это возможно создать событие в одном классе, а вызвать его в другом? У меня студия ругается и не дает вызвать. Пробовал все переписать один в один и ничего. Искал решение в инете, говорят что событие вызывается только в классе где он был создан.
@NoobGameDev
@NoobGameDev 9 ай бұрын
Возможно, что я Вас запутал... Потому что под событиями может подразумеваться, как вызов делегата, так и само событие. В видео я использую встроенные делегаты, такие как Action и Func. Если Вы объявите их без ключевого слова event, то сможете вызвать так же, как события, но из любого класса. По сути - это будет событие, но по факту - это просто делегат (даже молнии не будет в студии, а просто как поле будет подсвечиваться)
@danismingaleev4686
@danismingaleev4686 Жыл бұрын
Вызов события (Invoke) почему-то не работает в методе Awake, но работает в методе Start 😒
@NoobGameDev
@NoobGameDev Жыл бұрын
Могу ошибаться, но в Awake такое не делают) Потому что нет гарантий, что вызов события произойдёт после инициализации класса в котором описан делегат. Awake вызывается первым при активации объекта (какой объект вызовется раньше не понятно), поэтому в Awake можно получить компоненты с самого себя, скажем там найти Аниматор или SpriteRenderer, а вот получать те же компоненты с другого объекта лучше из Start (т.е. гарантированно после того, как активируется целевой объект). Рассказал, как мог, уж простите, сам со всеми тонкостями не знаком, но думаю Вам это будет интересно: docs.unity3d.com/Manual/ExecutionOrder.html или старый вариант на русском docs.unity3d.com/ru/530/Manual/ExecutionOrder.html
@danismingaleev4686
@danismingaleev4686 Жыл бұрын
@@NoobGameDev то есть, если например я хочу найти компонент через FindObjectOfType(); то лучше его засунуть в Start() а не в Awake(), так как, класс игрока в этот момент может быть не создан?
@NoobGameDev
@NoobGameDev Жыл бұрын
@@danismingaleev4686 Да, всё верно (экземпляр класса). Это у Вас может случайно сработать, но нет гарантий, что сработает на другом компе или после изменений в Иерархии. По крайней мере, я так понимаю работу движка)
@leafchanel7260
@leafchanel7260 2 жыл бұрын
Привет.Ты случаем не прльзовался Photon pun?если да,то не знаешь как сделать список серверов в игре?ни одного нормального видео не нашел
@NoobGameDev
@NoobGameDev 2 жыл бұрын
Привет! Не, к сожалению я до мультиплеера всё никак не доберусь. У нас на дискорд-сервере (в шапке есть ссылка) есть пару проектов, в которых ребята в онлайн пытаются, но там вроде Mirror мелькал, но может они смогут подсказать...
@othelnik6659
@othelnik6659 Жыл бұрын
Всем привет ищу друга для совместного создания игр и обучения юнити, опыт не важен
@saobao4796
@saobao4796 2 жыл бұрын
А сколько тебе лет мне просто интересно по голосу тебе лет 25
@NoobGameDev
@NoobGameDev 2 жыл бұрын
Недотягиваю получается) Мне 29.
@user-dl9bu5dt2m
@user-dl9bu5dt2m 9 ай бұрын
лучший нуб
@MrVoronaExtra
@MrVoronaExtra Жыл бұрын
Ещё быстрее, пожалуйста, а то некоторые слова можно понять
@finishsuffering
@finishsuffering Жыл бұрын
ферштейн
@SekundaPrikola
@SekundaPrikola Жыл бұрын
Я не могу подписатся из-за лимита(
@beggog4562
@beggog4562 2 жыл бұрын
Чиииилл
@OneKekc
@OneKekc Жыл бұрын
Ты сказал про проблему статики, а как круто избавиться не показал(
@NoobGameDev
@NoobGameDev Жыл бұрын
Так я, вроде и не обещал, что покажу 😅 Статики вещь не плохая. Просто Вы много смотрите Романа Сакутина)) Я согласен, что не стоит их писать для каждой переменной (в видео есть пример), но в случае с делегатами, это вообще мегаудобная штука, учитывая, что событие обычно единственное в своём роде и доступное из любого места проекта.
@OneKekc
@OneKekc Жыл бұрын
@@NoobGameDev не знаю причем тут сакутин, проблему про инкапсуляцию подняли вы)
@firewatch123
@firewatch123 Жыл бұрын
@@OneKekc что такое инкапсуляция в твоем понимании?
@OneKekc
@OneKekc Жыл бұрын
@@firewatch123 свойство кода, которое не позволяет пьяному чинить кофемашину, потому что на ней замок)
@user-lr6jd4og3f
@user-lr6jd4og3f Жыл бұрын
Как-то слишком быстро объясняете, не понятно, как работает, сложно разобраться. Может быть, просто я тупой.
@user-lr6jd4og3f
@user-lr6jd4og3f Жыл бұрын
Но лайк поставил, в целом, урок хороший.
@ravenempty3562
@ravenempty3562 Жыл бұрын
Не тупой, просто урок не для новичков
@GGamess
@GGamess Жыл бұрын
закрываю видео когда слышу про геймменеджер
@nomadirl3380
@nomadirl3380 2 жыл бұрын
Привет. Спасибо за видео. Но у меня философская проблема. Ты привел хороший пример, когда на сцене 100 врагов, и надо нанести урон конкретному. Я хочу сделать это через событийную модель, где все 100 врагов подписаны на событие нанесения урона. Но неужели мне у каждого врага надо проверять "меня ли ударили?". Я не совсем понимаю, как бы сделать оптимизированно так, чтобы событие получения урона вызывалось у конкретного врага среди множества... (без лишних 100 `if`, которые тратят драгоценные такты процессора)
@NoobGameDev
@NoobGameDev 2 жыл бұрын
А зачем так делать?) Зачем всем противникам знать, что кого-то ударили, а потом проверять не его ли случаем?) Обычно всё проще - через коллайдеры, триггеры, рейкасты, оверлапы. Любым из этих способов можно вызвать какой-нибудь метод TakeDamage (который будет одинаковым у всех врагов) и в итоге урон получит тот противник, по которому попала пуля, ударила палка и прочее. Единственное для чего может понадобиться всем врагам знать о том, что кого-то бьют - это чтобы получить координаты того, кого ударили, чтобы сагриться и помчаться к месту нахождения обидчика))
@nomadirl3380
@nomadirl3380 2 жыл бұрын
@@NoobGameDev спасибо за ответ. Меня от этих способов останавливало то, что Jetbrains Rider подчеркивал мне "красным" методы GetComponent, SendMessage, Broadcast и т.д. Наверное, потому что у меня нажатие кнопок отслеживается в Update, и IDE понимает, что эти дорогие методы вызываются каждый кадр. Тогда переделаю input на новую событийную модель в Юнити, надеюсь получится выжать что-нибудь! Но меня не покидает мысль, что устройство будет "тупить", что я каждый раз вызываю collider.GetComponent - который заново обходит дерево 🌲 компонентов и ищет нужный. Особенно это тупо, когда стреляешь из автоматического оружия с высокой скоростью. Ох, горе мне горе! Надо придумать как это всё закешировать
@NoobGameDev
@NoobGameDev 2 жыл бұрын
​@@nomadirl3380 Я бы сделал так. У пули есть скрипт, в котором при коллизии она будет проверять есть ли на объекте с которым она столкнулась скрипт противника и если есть, то вызывает в нём метод, который наносит врагу урон. Примерно так это может выглядеть, если скрипт врага будет называться EnemyDamage, а метод в нём, который будет наносить сам урон - TakeDamage: private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.TryGetComponent(out EnemyDamage enemy)) { enemy.TakeDamage(damageValue); } Destroy(gameObject); // уничтожение пули }
@nomadirl3380
@nomadirl3380 2 жыл бұрын
@@NoobGameDev спасибо за твой пример. В большинстве случаев он решает все проблемы, но я напишу несколько нюансов для тех, кто будет читать эту ветку комментариев: 1) иногда пули (объекты) летят слишком быстро, и при низкой частоте кадров не соприкасаются с коллайдерами - в след. кадре пуля как бы уже за целью, хотя в предыдущем была перед ней 2) иногда дешевле стрелять "лучами", а не пулями (объектами); также у лучей можно указать layerMask - слой объектов, например Damagable, у которых гарантировано будут MyScript, и их коллайдер не придется проверять через if 3) Методы семейства GetComponent - дорогие, потому что каждый раз выполняют поиск нужного компонента среди всех компонентов объекта. Их не стоит использовать в цепочке Update()
@NoobGameDev
@NoobGameDev 2 жыл бұрын
​@@nomadirl3380 Со 2 и 3-м пунктом полностью согласен) А для решения первого есть простое, но не самое дешёвое (но и не прям уж дорогущее) решение: если на объекте, будь то пуля или противник есть Rigidbody, то можно изменить просчёт коллизий (Collision Detection) с Discrete на Continuous. Ну, и то, что они пролетаю сквозь коллайдеры не зависит от частоты кадров, так как у FixedUpdate, OnTriggerXXX, OnCollisionXXX, просчёт происходит через фиксированный промежуток времени (0.02 сек. по умолчанию) и не зависит от того насколько быстро обновляются кадры. Я могу, конечно, где-то ошибаться, но вроде бы так))
⚡ Всё про события в Unity 3D
21:38
Emerald Powder
Рет қаралды 102 М.
C# Events События
14:36
codaza
Рет қаралды 49 М.
КАРМАНЧИК 2 СЕЗОН 7 СЕРИЯ ФИНАЛ
21:37
Inter Production
Рет қаралды 423 М.
Универ. 13 лет спустя - ВСЕ СЕРИИ ПОДРЯД
9:07:11
Комедии 2023
Рет қаралды 6 МЛН
OMG🤪 #tiktok #shorts #potapova_blog
00:50
Potapova_blog
Рет қаралды 17 МЛН
Osman Kalyoncu Sonu Üzücü Saddest Videos Dream Engine 170 #shorts
00:27
What are Events? (C# Basics)
15:05
Code Monkey
Рет қаралды 378 М.
C# в Unity: События (UnityEvents)
12:49
VR&AR Dreamer
Рет қаралды 393
Делегаты и события на практике
9:20
ExtremeCode
Рет қаралды 150 М.
MonoBehaviour и ScriptableObject. Для чего нужны и как использовать?
19:38
Руслан Смирнов • Game Development
Рет қаралды 8 М.
C# Delegates Делегаты
18:14
codaza
Рет қаралды 82 М.
Animation vs. Geometry
9:17
Alan Becker
Рет қаралды 4,1 МЛН
ВЫПАЛ НОВЫЙ БРАВЛЕР БЕРРИ В BRAWL STARS
14:25