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

Поделиться
HTML-код
  • Опубликовано: 23 янв 2025

Комментарии • 73

  • @asli9152
    @asli9152 Год назад +10

    Очень жду следующую часть, твои уроки бесценны!

    • @testservicesssss
      @testservicesssss Год назад +2

      бесценны, потому что монетизация отключена?

    • @SOTA_SOTA_3
      @SOTA_SOTA_3 Месяц назад

      @testservicesssss😂

  • @LemuR4ek
    @LemuR4ek Год назад +5

    Видос отличный, продолжение хотим :)

  • @FishMan102
    @FishMan102 11 месяцев назад

    Спасибо автору за простую и, что не мало важно, понятную подачу!

  • @bogotoff
    @bogotoff Год назад +14

    1:24 А теперь попробуй ползунок Min Limit перетащить на 100 :)

    • @IvanY5
      @IvanY5 Год назад +3

      тоже подумал об этом

  • @ЮринПавел
    @ЮринПавел Год назад +2

    Очень хорошо, спасибо!

  • @dohirakgame6380
    @dohirakgame6380 Год назад

    Ля, это гениальные видосики! Продолжай их делать, узнаю то, о чём раньше и не знал)

  • @aglittertool5184
    @aglittertool5184 Год назад +1

    Реально крутое и полезное видео, спасибо большое!👍🔥🔥

  • @Vorono4ka
    @Vorono4ka Год назад

    Очень жду следующие советы!

  • @DirtyBasta
    @DirtyBasta Год назад

    Воу воу воу! Откуда ты взялся? Я подписываюсь!

  • @IvanY5
    @IvanY5 Год назад +2

    классный видос!
    в следующий можно добавить интерактив:
    пример реализации архитектуры и вопрос: что тут может пойти не так?
    P.S.: на 1:24 это было бы уместно :)

  • @fxrgxtten966
    @fxrgxtten966 Год назад

    отличное видео, спасибо автору 🥰

  • @gamedevSkuf
    @gamedevSkuf Год назад

    Очень хороший тутор!)

  • @VADIM-SOLOV
    @VADIM-SOLOV Год назад

    Спасибо за видео!

  • @igormakegames9492
    @igormakegames9492 Год назад

    Круто обьясняешь!

  • @СергейКурилов-з9г

    Жалко, что только один лайк можно поставить! Контент супер!!! 😊

  • @hemmikotlin2589
    @hemmikotlin2589 Год назад +1

    Продолжай) может наконец научусь нормально писать код)

  • @DarkIllusoire
    @DarkIllusoire Год назад +2

    По мин\макс лучше написать _minLimit = Mathf.Min(_minLimit, _maxLimit); _maxLimit = Mathf.Max(_minLimit, _maxLimit); или совместить, это на случай если значения будут изменяться не слайдером

  • @Speed-Run-Facts
    @Speed-Run-Facts Год назад

    Видос супер!

  • @USSR-Lenin-Stalin-Forever
    @USSR-Lenin-Stalin-Forever 5 месяцев назад

    9:05 только это нужно не наследовать а использовать композицию и таким способом мы убираем проблему дублирования кода

  • @BattlebornSons
    @BattlebornSons 11 месяцев назад

    Стоит, делай 👍

  • @ВасилийПотапов-ч3ч

    null-coalesing операторы типа ??, ?. нельзя использовать с объектами юнити по идее

  • @zugzug90
    @zugzug90 10 месяцев назад

    Почти тысяча лукасов ;-)

  • @TheHellguitarplayer
    @TheHellguitarplayer Год назад +1

    по поводу спавна врагов: не проще ли сделать пул закидывать туда врагов на старте, а при перезагрузке очищать пул?

    • @-it394
      @-it394  Год назад

      Если нужен пул в игре, то можно и пул сделать, логика такая же

  • @Filimon_enc
    @Filimon_enc Год назад

    Хотелось бы узнать архитектуру, в плане рекомендации по структуре проекта, где какие папки и файлы +-

    • @-it394
      @-it394  Год назад +1

      Вообще это все у всех довольно по разному оформлено, поэтому не вижу смысла сильно зацикливаться - делай как удобно) Если увижу видос на эту тему - закину сюда в комменты

  • @artyom3131
    @artyom3131 Год назад +1

    Привет, а дай ссылку на свое резюме пж, стало интересно изучить твой опыт)

  • @SupGame-f6g
    @SupGame-f6g Год назад

    Пасиб за еще 1 урок)
    Есть люди кто шарят как сделать рендеринг рук персонажа поверх всех моделей(стен, предметов и т.д) так чтоб еще на них накладывалась тень корректно (к примеру зашел в темное помещение и руки должны быть не светлыми ,а темными). Если что проект в 3д пространстве + юнити 2023 года
    Буду также благодарен за помощь)

    • @keshbel
      @keshbel Год назад

      Может и поздно. Но насколько знаю, для этого можно скопировать стандартный шейдер и в нём изменить одно значение в строчке "ZTest" на значение "off". И в материале руки применить твой новоиспеченный шейдер.
      Я таким способом сделал отображение интерфейса в мировом пространстве поверх всех моделей, так нужно было для vr приложения.

    • @xz_chell
      @xz_chell Год назад +1

      Спасибо за помощь ​@@keshbel

  • @dmckone
    @dmckone Год назад

    Красава❤

  • @ReimsForYou
    @ReimsForYou Год назад

    Есть один момент, честно не знаю как оно себя поведет. 1й совет 1 пример с мин-макс, а если мы для мин выставим 100, то для макс будет 101, или все же 100 (ибо мы его в Range ограничили)???

  • @bonbad612
    @bonbad612 Год назад +4

    Не очень хорошо когда один класс занимается всем подряд, класс будет разрастаться и это приведёт к долгому поиску метода который тебя интересует. Вместо использования IAttacker, IMovable, Damageable, лучше завести классы EnemyAttack, EnemyMove, EnemyHealth и этим самым мы ограничим ответственность и можем передавать только эти компоненты. Например когда нам мы захотим ударить врага, нам нужно будет передать только один EnemyHealth. Понятное дело нет каких-то абсолютных правил по написанию кода, но из практики если вы захотите делать не маленькую игру, удобнее дробить ответственности

    • @-it394
      @-it394  Год назад

      Соглашусь, но в целом мы точно также можем передавать IDamagable. Вообще этот пример довольно абстрактный, на нем я хотел показать, что надо задумываться над разделением интерфейсов и ограничивать сущности

    • @klimklymenko3585
      @klimklymenko3585 Год назад +1

      Тебе бы подошло Data oriented programming)

    • @USSR-Lenin-Stalin-Forever
      @USSR-Lenin-Stalin-Forever 5 месяцев назад

      @@-it394 с IEnemyTarget хорошо получилось его было достаточно а вот второй вариант уже неудачный

  • @evggg
    @evggg Год назад

    Обращаться к другому объекту в Awake не есть гуд.

  • @digran648
    @digran648 7 месяцев назад

    Не совсем понял про "Принцип разделения интерфейсов", точнее есть логическая не стыковка:
    1. Нельзя создавать кучу интерфейсов с одним методом, так как по итогу класс будет состоять только из интерфейсов.
    2. Если делаем разных врагов с методами в интерфейсах одинаковыми и потом турель которая не двигается и не реализует некоторые методы движения из интерфейса, то потом разделяем интерфейсы по одному методу, и получается что враги состоит из интерфейсов.

    • @USSR-Lenin-Stalin-Forever
      @USSR-Lenin-Stalin-Forever 5 месяцев назад

      пример был неудачный, в таких случаях используется не наследование а композиция. То есть эти интерфейсы не башня реализовывать должна а отдельные классы

    • @digran648
      @digran648 5 месяцев назад

      @@USSR-Lenin-Stalin-Forever Спасибо за ответ! Да, такой подход решает проблему)

  • @Vladimir_Senkovets
    @Vladimir_Senkovets Год назад

    Как правильно передавать объект? Каждый раз в инспекторе перетягивать нужный? Или FindGameObject by TAG? Мне кажется что есть какой-то способ, но я о нем не знаю.

    • @defix_gamedev
      @defix_gamedev Год назад +2

      только через инспектор, раз на то пошло. Про Find object забудь вообще. Ну или можешь сделать тот же самый bootstrap, но для него тоже нужно будет ссылки прокидывать через инспектор

    • @TheHellguitarplayer
      @TheHellguitarplayer Год назад +1

      при инициализации передавать все необходимые зависимости через bootstrap, не надо ничего искать тем более по тегу.

  • @LionbI4
    @LionbI4 Год назад

    StealMana сильно не очевидно что должен делать. Можно понять, что если я как OrcMage хочу например при движении стилить ману у всех вокруг - я должен вызвать у них StealMana. Поэтому хорошо бы описать вообще идеальную систему настраиваемых спелов у мобов и игрока. И систему ИИ которая будет решать за моба какие спелы использовать.

    • @-it394
      @-it394  Год назад

      Не стоит воспринимать этот пример как абсолютный. На нем я просто хотел показать, что надо задумываться над разделением интерфейсов. Естественно, когда вы делаете абилки для игры, это может выглядеть по иному. Все зависит от конкретной ситуации

  • @klimklymenko3585
    @klimklymenko3585 Год назад +3

    Что насчет реализации методов по умолчанию, оставляя их пустыми? Таким образом мы сможем выбирать какие методы нам нужно реализовывать в нужном классе enemy.

    • @-it394
      @-it394  Год назад +1

      В целом иногда можно оставлять методы пустыми, однако все равно весь этот ворох методов придется тащить в каждый класс и если, допустим вы заходите поменять как-то сигнатуру какого-то метода, то придется потом лезть в каждый класс и править это дело + не всегда логически верно работает код с пустой реализацией (вызывается какой-то метод по типу сделай анимацию, а анимации нет - это не очень понятно)

    • @klimklymenko3585
      @klimklymenko3585 Год назад +1

      Согласен, спасибо. Если что, я имел не пустую реализацию метода в классе, а реализацию методов по умолчанию (прямо в самом интерфейсе) оставлять методы пустыми. Но вариант не очень. Я бы использовал получения ссылки на определённый интерфейс, который реализует объект класса, полученный в ссылку интерфейса, а затем, если нужно достучаться до другого реализуемого интерфейса, то использовать ключевое слово is, чтобы преобразовать ссылку, чтобы иметь доступ к методам нужным. А так очень информативное видео, спасибо большое!

    • @SCHCOMM
      @SCHCOMM Год назад +1

      дефолтная реализация методов в интерфейсах - жутчайшее зло)

    • @klimklymenko3585
      @klimklymenko3585 Год назад

      @@SCHCOMM согласен)

  • @nickicool
    @nickicool Год назад

    Спасибо! Очень хорошее видео! Надеюсь, что будет добавка! ))
    Еще попробую спросить совета, или может тему для видео. Как правильнее организовать HUD, т.е. вывод хелсбара, тамины, маны, панели быстрого доступа, миникарты + возможно что еще - все то, что игрок видит во время основного игрового процесса (т.е. не меню, и не инвентарь)? Все это в один канвас? Или разбить на части, сделав из них префабы, и получается тогда у каждого префаба будет свой канвас? Вопрос в основном и заключается, в том, сколько канвасов делать. Или может не делать один глобальный канвас, а размещать каждый такой мелкий канвас на своем месте...

    • @-it394
      @-it394  Год назад +1

      Зависит конечно от игры, но в целом можно один канвас разбить на глобальные слои какие -то (PopupLayer, HudLayer, FXLayer и тд). И на каждом слое будет располагаться своя информация. Также как вариант можно создавать некоторые элементы UI прямо по ходу игры через фабрику

    • @nfurtin
      @nfurtin Год назад +1

      Добавлю что при изменении чего либо в канвасе он весь перерисовывается,а иногда это может быть очень затратно, так что всякие часто меняющиеся штуки лучше выносить в другой или другие канвасы

    • @nickicool
      @nickicool Год назад

      @@nfurtin спасибо!

  • @Filimon_enc
    @Filimon_enc Год назад

    А если я поставлю минимум 100, то что будет

    • @-it394
      @-it394  Год назад

      Будет 101, тут либо рендж ставить на 1 больше, либо доп валидация

  • @_kephir_4333
    @_kephir_4333 Год назад

    Вот по c# естт метанит , нет какого то похожего для юнити в целом помимо офицальной документации

  • @shvets.gamedev
    @shvets.gamedev Год назад

    атакую по-оркски

  • @kvalexis
    @kvalexis Год назад

    Сколько раз видел OnValidate, но почему-то в голову не приходила мысль, как его можно использовать. Зато постоянно старался использовать меньше геткомпонента, ибо "ну а как же, нагружает же систему". Спасибо за советы!

  • @KiZhuGames
    @KiZhuGames Год назад +2

    Два года работаю в юнити и постоянно что то новое узнаю и постоянно что то забываю 😂

  • @krivodeling7925
    @krivodeling7925 Год назад

    +

  • @_mirai
    @_mirai Год назад

    Мне кажется или ты повторяешься?