Архитектура игры C# и Unity! 3 простых совета по улучшению архитектуры проекта!

  Рет қаралды 15,295

Яковлев Илья - IT и игры

Яковлев Илья - IT и игры

Күн бұрын

Пікірлер: 72
@bogotoff
@bogotoff Жыл бұрын
1:24 А теперь попробуй ползунок Min Limit перетащить на 100 :)
@IvanY5
@IvanY5 Жыл бұрын
тоже подумал об этом
@ВасилийПотапов-ч3ч
@ВасилийПотапов-ч3ч Жыл бұрын
null-coalesing операторы типа ??, ?. нельзя использовать с объектами юнити по идее
@asli9152
@asli9152 Жыл бұрын
Очень жду следующую часть, твои уроки бесценны!
@testservicesssss
@testservicesssss Жыл бұрын
бесценны, потому что монетизация отключена?
@LemuR4ek
@LemuR4ek Жыл бұрын
Видос отличный, продолжение хотим :)
@DarkIllusoire
@DarkIllusoire Жыл бұрын
По мин\макс лучше написать _minLimit = Mathf.Min(_minLimit, _maxLimit); _maxLimit = Mathf.Max(_minLimit, _maxLimit); или совместить, это на случай если значения будут изменяться не слайдером
@USSR-Lenin-Stalin-Forever
@USSR-Lenin-Stalin-Forever 2 ай бұрын
9:05 только это нужно не наследовать а использовать композицию и таким способом мы убираем проблему дублирования кода
@_kephir_4333
@_kephir_4333 10 ай бұрын
Вот по c# естт метанит , нет какого то похожего для юнити в целом помимо офицальной документации
@IvanY5
@IvanY5 Жыл бұрын
классный видос! в следующий можно добавить интерактив: пример реализации архитектуры и вопрос: что тут может пойти не так? P.S.: на 1:24 это было бы уместно :)
@bonbad612
@bonbad612 Жыл бұрын
Не очень хорошо когда один класс занимается всем подряд, класс будет разрастаться и это приведёт к долгому поиску метода который тебя интересует. Вместо использования IAttacker, IMovable, Damageable, лучше завести классы EnemyAttack, EnemyMove, EnemyHealth и этим самым мы ограничим ответственность и можем передавать только эти компоненты. Например когда нам мы захотим ударить врага, нам нужно будет передать только один EnemyHealth. Понятное дело нет каких-то абсолютных правил по написанию кода, но из практики если вы захотите делать не маленькую игру, удобнее дробить ответственности
@-it394
@-it394 Жыл бұрын
Соглашусь, но в целом мы точно также можем передавать IDamagable. Вообще этот пример довольно абстрактный, на нем я хотел показать, что надо задумываться над разделением интерфейсов и ограничивать сущности
@klimklymenko3585
@klimklymenko3585 Жыл бұрын
Тебе бы подошло Data oriented programming)
@USSR-Lenin-Stalin-Forever
@USSR-Lenin-Stalin-Forever 2 ай бұрын
@@-it394 с IEnemyTarget хорошо получилось его было достаточно а вот второй вариант уже неудачный
@artyom3131
@artyom3131 Жыл бұрын
Привет, а дай ссылку на свое резюме пж, стало интересно изучить твой опыт)
@hemmikotlin2589
@hemmikotlin2589 Жыл бұрын
Продолжай) может наконец научусь нормально писать код)
@TheHellguitarplayer
@TheHellguitarplayer Жыл бұрын
по поводу спавна врагов: не проще ли сделать пул закидывать туда врагов на старте, а при перезагрузке очищать пул?
@-it394
@-it394 Жыл бұрын
Если нужен пул в игре, то можно и пул сделать, логика такая же
@ЮринПавел
@ЮринПавел Жыл бұрын
Очень хорошо, спасибо!
@aglittertool5184
@aglittertool5184 9 ай бұрын
Реально крутое и полезное видео, спасибо большое!👍🔥🔥
@digran648
@digran648 3 ай бұрын
Не совсем понял про "Принцип разделения интерфейсов", точнее есть логическая не стыковка: 1. Нельзя создавать кучу интерфейсов с одним методом, так как по итогу класс будет состоять только из интерфейсов. 2. Если делаем разных врагов с методами в интерфейсах одинаковыми и потом турель которая не двигается и не реализует некоторые методы движения из интерфейса, то потом разделяем интерфейсы по одному методу, и получается что враги состоит из интерфейсов.
@USSR-Lenin-Stalin-Forever
@USSR-Lenin-Stalin-Forever 2 ай бұрын
пример был неудачный, в таких случаях используется не наследование а композиция. То есть эти интерфейсы не башня реализовывать должна а отдельные классы
@digran648
@digran648 2 ай бұрын
@@USSR-Lenin-Stalin-Forever Спасибо за ответ! Да, такой подход решает проблему)
@Filimon_enc
@Filimon_enc 11 ай бұрын
А если я поставлю минимум 100, то что будет
@-it394
@-it394 11 ай бұрын
Будет 101, тут либо рендж ставить на 1 больше, либо доп валидация
@ReimsForYou
@ReimsForYou Жыл бұрын
Есть один момент, честно не знаю как оно себя поведет. 1й совет 1 пример с мин-макс, а если мы для мин выставим 100, то для макс будет 101, или все же 100 (ибо мы его в Range ограничили)???
@krivodeling7925
@krivodeling7925 10 ай бұрын
+
@FishMan102
@FishMan102 7 ай бұрын
Спасибо автору за простую и, что не мало важно, понятную подачу!
@evggg
@evggg Жыл бұрын
Обращаться к другому объекту в Awake не есть гуд.
@DirtyBasta
@DirtyBasta 9 ай бұрын
Воу воу воу! Откуда ты взялся? Я подписываюсь!
@dohirakgame6380
@dohirakgame6380 Жыл бұрын
Ля, это гениальные видосики! Продолжай их делать, узнаю то, о чём раньше и не знал)
@СергейКурилов-з9г
@СергейКурилов-з9г Жыл бұрын
Жалко, что только один лайк можно поставить! Контент супер!!! 😊
@zugzug90
@zugzug90 7 ай бұрын
Почти тысяча лукасов ;-)
@Vorono4ka
@Vorono4ka 11 ай бұрын
Очень жду следующие советы!
@gamedevGod
@gamedevGod Жыл бұрын
Очень хороший тутор!)
@igormakegames9492
@igormakegames9492 9 ай бұрын
Круто обьясняешь!
@fxrgxtten966
@fxrgxtten966 9 ай бұрын
отличное видео, спасибо автору 🥰
@BattlebornSons
@BattlebornSons 7 ай бұрын
Стоит, делай 👍
@LionbI4
@LionbI4 Жыл бұрын
StealMana сильно не очевидно что должен делать. Можно понять, что если я как OrcMage хочу например при движении стилить ману у всех вокруг - я должен вызвать у них StealMana. Поэтому хорошо бы описать вообще идеальную систему настраиваемых спелов у мобов и игрока. И систему ИИ которая будет решать за моба какие спелы использовать.
@-it394
@-it394 Жыл бұрын
Не стоит воспринимать этот пример как абсолютный. На нем я просто хотел показать, что надо задумываться над разделением интерфейсов. Естественно, когда вы делаете абилки для игры, это может выглядеть по иному. Все зависит от конкретной ситуации
@shvets.gamedev
@shvets.gamedev Жыл бұрын
атакую по-оркски
@Filimon_enc
@Filimon_enc 11 ай бұрын
Хотелось бы узнать архитектуру, в плане рекомендации по структуре проекта, где какие папки и файлы +-
@-it394
@-it394 11 ай бұрын
Вообще это все у всех довольно по разному оформлено, поэтому не вижу смысла сильно зацикливаться - делай как удобно) Если увижу видос на эту тему - закину сюда в комменты
@Speed-Run-Facts
@Speed-Run-Facts Жыл бұрын
Видос супер!
@klimklymenko3585
@klimklymenko3585 Жыл бұрын
Что насчет реализации методов по умолчанию, оставляя их пустыми? Таким образом мы сможем выбирать какие методы нам нужно реализовывать в нужном классе enemy.
@-it394
@-it394 Жыл бұрын
В целом иногда можно оставлять методы пустыми, однако все равно весь этот ворох методов придется тащить в каждый класс и если, допустим вы заходите поменять как-то сигнатуру какого-то метода, то придется потом лезть в каждый класс и править это дело + не всегда логически верно работает код с пустой реализацией (вызывается какой-то метод по типу сделай анимацию, а анимации нет - это не очень понятно)
@klimklymenko3585
@klimklymenko3585 Жыл бұрын
Согласен, спасибо. Если что, я имел не пустую реализацию метода в классе, а реализацию методов по умолчанию (прямо в самом интерфейсе) оставлять методы пустыми. Но вариант не очень. Я бы использовал получения ссылки на определённый интерфейс, который реализует объект класса, полученный в ссылку интерфейса, а затем, если нужно достучаться до другого реализуемого интерфейса, то использовать ключевое слово is, чтобы преобразовать ссылку, чтобы иметь доступ к методам нужным. А так очень информативное видео, спасибо большое!
@SCHCOMM
@SCHCOMM Жыл бұрын
дефолтная реализация методов в интерфейсах - жутчайшее зло)
@klimklymenko3585
@klimklymenko3585 Жыл бұрын
@@SCHCOMM согласен)
@VADIM-SOLOV
@VADIM-SOLOV Жыл бұрын
Спасибо за видео!
@Vladimir_Senkovets
@Vladimir_Senkovets Жыл бұрын
Как правильно передавать объект? Каждый раз в инспекторе перетягивать нужный? Или FindGameObject by TAG? Мне кажется что есть какой-то способ, но я о нем не знаю.
@defix_gamedev
@defix_gamedev Жыл бұрын
только через инспектор, раз на то пошло. Про Find object забудь вообще. Ну или можешь сделать тот же самый bootstrap, но для него тоже нужно будет ссылки прокидывать через инспектор
@TheHellguitarplayer
@TheHellguitarplayer Жыл бұрын
при инициализации передавать все необходимые зависимости через bootstrap, не надо ничего искать тем более по тегу.
@_mirai
@_mirai Жыл бұрын
Мне кажется или ты повторяешься?
@-it394
@-it394 Жыл бұрын
В чем?
@dmckone
@dmckone Жыл бұрын
Красава❤
@SupGame-f6g
@SupGame-f6g Жыл бұрын
Пасиб за еще 1 урок) Есть люди кто шарят как сделать рендеринг рук персонажа поверх всех моделей(стен, предметов и т.д) так чтоб еще на них накладывалась тень корректно (к примеру зашел в темное помещение и руки должны быть не светлыми ,а темными). Если что проект в 3д пространстве + юнити 2023 года Буду также благодарен за помощь)
@keshbel
@keshbel 8 ай бұрын
Может и поздно. Но насколько знаю, для этого можно скопировать стандартный шейдер и в нём изменить одно значение в строчке "ZTest" на значение "off". И в материале руки применить твой новоиспеченный шейдер. Я таким способом сделал отображение интерфейса в мировом пространстве поверх всех моделей, так нужно было для vr приложения.
@xz_chell
@xz_chell 8 ай бұрын
Спасибо за помощь ​@@keshbel
@nickicool
@nickicool Жыл бұрын
Спасибо! Очень хорошее видео! Надеюсь, что будет добавка! )) Еще попробую спросить совета, или может тему для видео. Как правильнее организовать HUD, т.е. вывод хелсбара, тамины, маны, панели быстрого доступа, миникарты + возможно что еще - все то, что игрок видит во время основного игрового процесса (т.е. не меню, и не инвентарь)? Все это в один канвас? Или разбить на части, сделав из них префабы, и получается тогда у каждого префаба будет свой канвас? Вопрос в основном и заключается, в том, сколько канвасов делать. Или может не делать один глобальный канвас, а размещать каждый такой мелкий канвас на своем месте...
@-it394
@-it394 Жыл бұрын
Зависит конечно от игры, но в целом можно один канвас разбить на глобальные слои какие -то (PopupLayer, HudLayer, FXLayer и тд). И на каждом слое будет располагаться своя информация. Также как вариант можно создавать некоторые элементы UI прямо по ходу игры через фабрику
@nfurtin
@nfurtin 11 ай бұрын
Добавлю что при изменении чего либо в канвасе он весь перерисовывается,а иногда это может быть очень затратно, так что всякие часто меняющиеся штуки лучше выносить в другой или другие канвасы
@nickicool
@nickicool 11 ай бұрын
@@nfurtin спасибо!
@KiZhuGames
@KiZhuGames Жыл бұрын
Два года работаю в юнити и постоянно что то новое узнаю и постоянно что то забываю 😂
@kvalexis
@kvalexis Жыл бұрын
Сколько раз видел OnValidate, но почему-то в голову не приходила мысль, как его можно использовать. Зато постоянно старался использовать меньше геткомпонента, ибо "ну а как же, нагружает же систему". Спасибо за советы!
小天使和小丑太会演了!#小丑#天使#家庭#搞笑
00:25
家庭搞笑日记
Рет қаралды 33 МЛН
Паттерн EventBus или Шина Событий в Unity
8:58
Лавка Разработчика
Рет қаралды 4 М.
"Архитектура в играх" - бесплатный вебинар. Яковлев Илья
2:36:55
MonoBehaviour и ScriptableObject. Для чего нужны и как использовать?
19:38
Руслан Смирнов • Game Development
Рет қаралды 9 М.
C# в Unity: События (UnityEvents)
12:49
VR&AR Dreamer
Рет қаралды 554