Глянул пару видосов твоих, очень перспективный Unity dev, подача со старта канала на очень высоком уровне, монтаж/звук/видео ряд. Не забрасывай ни в коем случае, слишком качественно.
Божее мой, это то что я искал!! Здесь наконец то адекватный ответ, что такое наблюдатель в юнити, без интерфейсов и т.п.. Спасибо просто огромное!!!!!!!!!!! P.s. я уже приметил зенжекты, визитер, и другие видео.. Погнал смотреть, и всем рекомендую, кто пытается разобраться в паттернах и т.п.!))
Большое спасибо, не думал, что это есть в Юнити. Этот паттерн прям очень важный момент в Garry's Mod, именно он чаще всего используется там, реализуется через hook. Тут ещё особенность, что в Lua, функция - это тип данных, и ты можешь его спокойно передавать и переназначать и так далее. И через hook (аналог event в шарпе) прописываются действия для каких-то функции, ну та же стрельба, в самой её функции OnAttackStarted и OnAttackStopped, и уже потом любой другой разработчик, может в эти хуки засовывать свои функции, какие пожелает. То есть: 1 - Не надо ломать те скрипты, где находится нужная тебе функция. 2 - Не надо искать, чтобы сломать те скрипты, где находится нужная тебе функция, ибо файлов может быть и 100 и 1000. 3 - Удобно и практично для масштабирования. Ещё интересная практика обсервера, это разрешение на срабатывания исходного метода через Can. Допустим, CanAttack. Если он nil (не назначен) или true - всё норм, срабатывает. Если он false, значит исходный метод (Атака) не сработает.
Спасибо, стараюсь! 🤙 Это хорошо, что преисполнился 😎 Ля, ну хоть какой-то интерактив для тренировки реакции случайно получился Мини игра на движке RUclips с визуальным программированием 🤣
Не знаю как новичкам, Но мне как програмисту (java/python) очень зашло. По вашим видео в очень сжатые сроки можно понять на что похоже программирование в Unity. Что по сути все программирование это работа с callback. Все сжато и класно.
@@NightTrainCode Не все же сразу :). До этого думал что в Kotlin с groovy все послизывали, а оказывается с решетки: тот же безопасный вызов ?. и when as expression
Я где-то год назад наталкивался на ваши видео, очень понравились. Жаль что перестали выпускать. Но вот можно сделать видос рефакторинг для reuse equivalent principle - На 4:14 weaponaudio все равно осталась зависимость от weapon и weaponattack. Да Srp сделано, но было бы хорошо сделать этот компонент переиспользуемым. Где будет startaudio(weaponshot) , clipisempty, playsoundloop. Ну или применить isp и разделить на ещё более мелкие переиспользуемые компоненты. Конечно можно сказать что cohesion тогда будет маденьким для пакета weapon. Но все же можно было бы переиспользовать новые компоненты и создать новый пакет.
Да уже столько времени прошло с этого видео, мой стиль кода тоже сильно поменялся. Сейчас у меня есть просто универсальные AudioPlayer и AudioPool (не моно) как надстройки над AudioSource. Почему перестал выпускать? Не перестал и прямо сейчас потихоньку новое видео монтирую)
@@dimadancev714 Нет, 1-2 месяца назад последнее выкладывал) AudioPlayer особо ничего интересного не хранит. А AudioPool - класс, в котором есть Capacity (количество AudioSource в пуле) и метод Play(AudioPreset preset, in Vector3 position) с различными перегрузками AudioPreset - SO, в котором можно указать AudioClip, задать volume. Так же можно указать несколько клипов и включить параметр random. Своеобразный сахар
Привет! Очень крутые видео! Но зачем это возводить в отдельный паттерн? Все и так используют ивенты. Типо если я использую ивенты, то я знаю про паттерн observer? )
4:45 В статике коллекции лучше не хранить, так еще Рихтер в "CLR via C#" писал - сборщик мусора потом часто не может собрать объекты, ктр туда пихали, и память течет. И еще вопрос, а почему используешь публичный Action, а не event Action ?
не понятно зачем ты подписываешься на изменение здоровья, обычно делают компоненты Нанесения урона или Восстановление хп и там делают подписку. Т.е. в каждом конкретном случае своя и она что то реализует. С неймингом не понятно OnHealthChanged - OnValueChanged, там у тебя класс UnitHealth - зачем дублировать Health
Мне кажется , что удобней и понятней будет сделать событие смерти игрока, чем каждый раз проверять его здоровье если нужно выполнить какие-то действия после смерти юнита
Так у нас и так есть событие смерти какого-то юнита (OnDeath), будь то игрок или враг 😉 И попытка его вызова происходит только при изменении здоровья (если оно
привет, я хочу загрузить игру в assetstore. Я хочу, чтобы это выглядело как игра, в которой Unity выпускает свои игры, и после загрузки игра открывается мгновенно, скажите, пожалуйста, как это сделать. (использовал гугл-переводчик)
Глянул пару видосов твоих, очень перспективный Unity dev, подача со старта канала на очень высоком уровне, монтаж/звук/видео ряд. Не забрасывай ни в коем случае, слишком качественно.
Спасибо большое, не заброшу)
Божее мой, это то что я искал!! Здесь наконец то адекватный ответ, что такое наблюдатель в юнити, без интерфейсов и т.п.. Спасибо просто огромное!!!!!!!!!!!
P.s. я уже приметил зенжекты, визитер, и другие видео.. Погнал смотреть, и всем рекомендую, кто пытается разобраться в паттернах и т.п.!))
На здоровье)
Рекомендую ещё почитать про ключ "event"
Большое спасибо, не думал, что это есть в Юнити. Этот паттерн прям очень важный момент в Garry's Mod, именно он чаще всего используется там, реализуется через hook.
Тут ещё особенность, что в Lua, функция - это тип данных, и ты можешь его спокойно передавать и переназначать и так далее. И через hook (аналог event в шарпе) прописываются действия для каких-то функции, ну та же стрельба, в самой её функции OnAttackStarted и OnAttackStopped, и уже потом любой другой разработчик, может в эти хуки засовывать свои функции, какие пожелает. То есть:
1 - Не надо ломать те скрипты, где находится нужная тебе функция.
2 - Не надо искать, чтобы сломать те скрипты, где находится нужная тебе функция, ибо файлов может быть и 100 и 1000.
3 - Удобно и практично для масштабирования.
Ещё интересная практика обсервера, это разрешение на срабатывания исходного метода через Can. Допустим, CanAttack. Если он nil (не назначен) или true - всё норм, срабатывает. Если он false, значит исходный метод (Атака) не сработает.
Очень круто! За 7 минут настолько преисполнился... А ещё чуть с ума не сошёл, пока поймал "Тавтологичную тавтологию")))
Спасибо, стараюсь! 🤙
Это хорошо, что преисполнился 😎
Ля, ну хоть какой-то интерактив для тренировки реакции случайно получился
Мини игра на движке RUclips с визуальным программированием 🤣
Как всегда полезно. ЛУЧШИЙ 👍
Спасибо и от души душевно в душу)0)) 😋🔥
Годнота, видно, что запарился со звуком и монтажем, подписка)
Спасибо)
Не знаю как новичкам, Но мне как програмисту (java/python) очень зашло. По вашим видео в очень сжатые сроки можно понять на что похоже программирование в Unity. Что по сути все программирование это работа с callback. Все сжато и класно.
Благодарю)
Единственное, в этом видео я не рассказал про ключ event, но про это есть в последнем
@@NightTrainCode Не все же сразу :). До этого думал что в Kotlin с groovy все послизывали, а оказывается с решетки: тот же безопасный вызов ?. и when as expression
Почему Action а не event Action? Если не делать event, то любой компонент сможет обнулить подписки вызвав OnSomething = null
Нет слов, просто отличный ролик!
Благодарю за тёплые слова!
Спасибо, было интересно) и позновательно
Топ контент....теперь то я точно знаю куда SR принцип не пойдет ;)
Благодарю)
Реально 🤣
Понятный и очень полезный контент! Спасибо!
На здоровье)
Я где-то год назад наталкивался на ваши видео, очень понравились. Жаль что перестали выпускать. Но вот можно сделать видос рефакторинг для reuse equivalent principle - На 4:14 weaponaudio все равно осталась зависимость от weapon и weaponattack. Да Srp сделано, но было бы хорошо сделать этот компонент переиспользуемым. Где будет startaudio(weaponshot) , clipisempty, playsoundloop. Ну или применить isp и разделить на ещё более мелкие переиспользуемые компоненты. Конечно можно сказать что cohesion тогда будет маденьким для пакета weapon. Но все же можно было бы переиспользовать новые компоненты и создать новый пакет.
Да уже столько времени прошло с этого видео, мой стиль кода тоже сильно поменялся. Сейчас у меня есть просто универсальные AudioPlayer и AudioPool (не моно) как надстройки над AudioSource.
Почему перестал выпускать? Не перестал и прямо сейчас потихоньку новое видео монтирую)
@@NightTrainCode Мне показалось что последнее видео было полгода назад. Было бы интересно посмотреть видео про универсальные AudioPlayer и AudioPool
@@dimadancev714 Нет, 1-2 месяца назад последнее выкладывал)
AudioPlayer особо ничего интересного не хранит. А AudioPool - класс, в котором есть Capacity (количество AudioSource в пуле) и метод Play(AudioPreset preset, in Vector3 position) с различными перегрузками
AudioPreset - SO, в котором можно указать AudioClip, задать volume. Так же можно указать несколько клипов и включить параметр random. Своеобразный сахар
@@NightTrainCode Понял. Спасибо! Ну, буду ждать другое видео!
Привет! Очень крутые видео! Но зачем это возводить в отдельный паттерн? Все и так используют ивенты. Типо если я использую ивенты, то я знаю про паттерн observer? )
4:45 В статике коллекции лучше не хранить, так еще Рихтер в "CLR via C#" писал - сборщик мусора потом часто не может собрать объекты, ктр туда пихали, и память течет. И еще вопрос, а почему используешь публичный Action, а не event Action ?
Несите кислород, задыхаюсь от количества годноты за последнее время :3
Благодарю 😎🔥
не понятно зачем ты подписываешься на изменение здоровья, обычно делают компоненты Нанесения урона или Восстановление хп и там делают подписку. Т.е. в каждом конкретном случае своя и она что то реализует. С неймингом не понятно OnHealthChanged - OnValueChanged, там у тебя класс UnitHealth - зачем дублировать Health
А почему вы не пишете event перед Action?
Молодой был, глупый)
В новом видосе про это есть
@@NightTrainCode Можно ссылку на видос?)
@@BLITZBURY Самый новый на канале
Насчет держать переменную(ые) для того, чтобы проверить не подписан ли может быть лишним, чаще вижу что люди просто отписываются перед подпиской
Вариант интересный, но не лучшее решение
В идеале подписаться в старте и отписаться в OnDestroy, если есть возможность
Мне кажется , что удобней и понятней будет сделать событие смерти игрока, чем каждый раз проверять его здоровье если нужно выполнить какие-то действия после смерти юнита
Видос классный, молодец.
Так у нас и так есть событие смерти какого-то юнита (OnDeath), будь то игрок или враг 😉
И попытка его вызова происходит только при изменении здоровья (если оно
@@unreidunity2737 Благодарю)
Тут мы именно методы в делегат засовываем? А в каком случае применяется слово event?
Да, методы, Action - это delegate void. Event тоже для событий юзается
Event не даёт вызывать делегат извне класса в котором он объявлен, и устанавливать значение извне через =, только через += или -=
@TheBigGangstaMouse А ещё подсвечивается в Rider'е по-другому и получает значок в виде молнии 😄
@@NightTrainCode В VS Code тоже, но это уже мелочь
привет, я хочу загрузить игру в assetstore. Я хочу, чтобы это выглядело как игра, в которой Unity выпускает свои игры, и после загрузки игра открывается мгновенно, скажите, пожалуйста, как это сделать. (использовал гугл-переводчик)
"Как игра, в которой Unity выпускает свои игры" - не могу понять)
@@NightTrainCode ruclips.net/video/SePwM2g_O3k/видео.html
Ruby Amanfu - Didn't
Я утанул