Подробный урок по Zenject в Unity. DI Container

แชร์
ฝัง
  • เผยแพร่เมื่อ 6 ก.ค. 2024
  • Zenject в Unity - что это?
    Подробный урок за 15 минут! DI Container [C#] в лице Zenject (или же Extenject)
    Как пользоваться Zenject в Unity? Для чего нужны Project и Scene Context? Как использовать Mono Installer? Это только часть того, что затронем в ролике :)
    • Разбор принципа SOLID Dependency Inversion (DIP)
    • Dependency Injection + Unity = Zenject [Extenject]
    Салют, ты на канале Night Train Code 😎
    • 🖤 GitHub: github.com/MeeXaSiK
    • 🖤 VK: nighttraincode
    • 🖤 Telegram: t.me/nighttraincode
    • 🖤 Instagram: / the.meps_
    • Таймлайн:
    00:00 ► Вступление
    00:25 ► Что такое Zenject / Extenject
    00:53 ► Разница между библиотекой и фреймворком
    01:10 ► Какую проблему решает Zenject
    01:41 ► Проблема Singleton'ов
    02:41 ► Что делает Zenject / Extenject
    03:12 ► SOLID. Принцип DI
    03:23 ► Интерфейсы в C#. Разрываем жесткие зависимости
    05:22 ► Возвращаемся к Zenject'у
    05:52 ► Project Context
    06:04 ► Scene Context
    06:09 ► Как установить Zenject
    06:41 ► Как создать Project Context
    07:00 ► Что такое Bindings (регистрации по типу)
    07:15 ► Как создать Scene Context
    07:43 ► MonoInstaller
    08:04 ► Container.Instantiate
    08:35 ► Container.Bind
    08:45 ► AsSingle
    09:13 ► AsCached
    09:17 ► AsTransient
    09:27 ► NonLazy
    09:33 ► Другие методы регистраций
    09:59 ► Как зарегистрировать интерфейс
    11:09 ► Последний шаг регистраций
    11:21 ► Zenject Validate Scene
    11:44 ► Как использовать биндинги в коде
    13:04 ► Проблема Instantiate
    13:22 ► Как разрешить зависимости Instantiate
    14:22 ► Второй способ
    14:47 ► Оператор объединения с null
    15:42 ► Возвращаемся к Project Context
    16:14 ► Итог
    16:23 ► Когда нет необходимости в Zenject?
    Поддержка канала:
    www.donationalerts.com/r/nigh...

ความคิดเห็น • 139

  • @Worl4x
    @Worl4x ปีที่แล้ว +49

    Пишем это. А потом пишем это. Смотрите как красиво у меня на сцене :) Если не понятно, не бойтесь, потом будет понятно. Видео заканчивается.

    • @Bushido_Cat
      @Bushido_Cat 3 หลายเดือนก่อน +1

      я тоже ждал того момента когда станет понятно и понял что после слово потом видео закончилось 🤣

  • @younggd
    @younggd 11 หลายเดือนก่อน +4

    Хочу кое что сказать начинающим разработчикам, которые включили это видео. Посмотрите первый раз - да, возможно вы многое не поймете. Отдохните. Поизучайте документацию, или как я, поспрашивайте у GPT различные реальные примеры реализации Zenject. Посмотрите второй раз - вы увидите, что начинаете понимать, что к чему. Посмотрите третий раз - и вот вы уже в полном понимании происходящего.
    Спасибо за ролик, капитан!

    • @nickwilde5876
      @nickwilde5876 10 หลายเดือนก่อน +2

      уже раз 10 посмотрел, кучу видосов ру и англ посмотрел, и нифига не понятно как с ним работать, в глобально плане понятно что он удобен, но как его использовать хз, в каких ситуациях? сделал как по туториалу, а мне пишет предупреждение зенжект, мол плохая идея так делать(( документация на мудренном написана(( дня 4 уже убил(( да написал игру которая работает на зенжект и решает все проблемы, но там 1 вариант решения, в основном биндим обычные классы, а как забиндить префаб игрока которого нет на сцене, который нужно создать как то, внутри префаба игрока допустим в классе Player есть псевдоконструктор который инжектит доступ к обычным классам забиндженным в инсталлере((

    • @younggd
      @younggd 10 หลายเดือนก่อน

      @@nickwilde5876 почитай про фабрики, там написано как инжектить в создаваемые в рантайме объекты, он и в этом ролике про это говорил

  • @user-cu5ky8qz2n
    @user-cu5ky8qz2n 2 ปีที่แล้ว +8

    Вряд ли я в скором времени воспользуюсь такой штукой, но для общего развития будет оч неплохо)
    Спасибо за видос

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว +4

      На здоровье)
      Можно обойтись и синглтоном, но грамотным. У Сакутина есть видос про синглтон. Там, пожалуй, самая нормальная реализация, что я видел

  •  ปีที่แล้ว +7

    Я что, перестаю быть джуном?
    Охренеть конечно. Вообще не удивлён, ибо на самообучении такую инфу не нуйдёшь, а без опыта работы в компании тем более, но тут нашёл, спасибо огромное!
    Даже один концепт того что можно создать стек фреймворков для такой красивой реализации и убрать все NullRef`ы меня радует.
    Я прям типичный пример самоучки - документация Юнити, GPT, гайды с Ютуба, работаем.
    Результат - FindObjectOfType как единственное решение, которое заработало, но и проблем насыпало, а кто ж знал? В моём виденьи - в гайдах юзают, оно работает, вроде норм, чёт автоматизирую, подправлю под свои нужды и норм.
    А оказывается можно и так. И мне нравится, это офигенный подход, но всю прелесть подобного решения такой как я может почувствовать только пройдя через говнокод.
    Как считаете, надо ли проходить через период говнокода? Типа, в начале обучения даже говнокодить надо научиться, что бы хоть что-то создать рабочее, инфы больше, чем за 5 лет школьной программы по ощущениям. Мне нравится, но не дропнул потому что был опыт в том же DaVinchi, желание постигать сложное и ещё куча факторов.
    Или пример с модовой террарией. Есть Ванилла с сундуками, в которых ничего не найдёшь, а пока рассортируешь красиво уйдёт 20 часов. А есть TModLoader, в котором MagicStorage даёт возможность искать айтем по тегу. Будешь ли ты ценить второе без опыта первого? Сложный вопрос. Сразу в голову приходит воспитание ребёнка. Давать ли ему то чего не было у тебя просто так и тем самым убрать потребность достигать того же стейта, когда ты не паришься о деньгах и можешь создавать что хочешь, но с риском того что он не будет хотеть ничего делать.
    Либо же равномерно из грязи в князи вести, но с поправками?
    Представьте как будет выглядеть обучение:
    Язык (от 1 месяца до 3 месяцев, в зависимости от подхода к обучению и обучаемости).
    Немного теории, IDE, Фреймворки, библиотеки (именно что они из себя представляют). Стек фреймворков обязательно сказать.
    Unity (что само по себе огромный стек информации. Спустя полгода работы в нём я всё ещё мальком себя ощущаю).
    И ко всему ещё другие фреймворки, облегчающие работу, безусловно, но и количество информации растёт конкретно.
    Я ещё Draw.IO пару дней тестил и учил, дабы можно было учиться более наглядно и проектировать хотя бы базовое представление взаимодействия логики.
    GPT тоже правильно вопросы надо ставить, дабы получать именно тот результат который нужен (будьте честны, рядовой пользователь ПК не умеет гуглить, что подводит к следующему пункту)
    Умение искать информацию и скилл увидеть то что тебе нужно. У меня этот скилл наверное самый важный, он в принципе личность можен поменять, что думаете?
    Ну и ещё бы хотел отметить умение менеджить время для такой работы, все же знают это ощущение когда процесс прям прёт, достигаешь безумного прогресса, а потом после столкновения с одной банальной ошибкой хернёй страдаешь и не заходить в проект неделю? У меня так было.
    Многое применимо к любой профессии, но в программировании лично у меня больше проблем было, нежели в том же монтаже, пусть и не очень сложном. Мемы, переходы, базовые эффекты, что в прочем тоже при первом знакомстве может вводить в ступор. Например когда я подруге говорил о концепции секвенций в редакторе (по сути кусок видео на таймлайне) она не могла вдуплить. Когда показал даже не вдуплила.
    Сразу выказываю уважение тем учителям, которые всё это понимают и умеют объяснить любому любую информацию.
    Так что ещё раз спасибо! Удачи каждому кто дочитал жо конца :D

    • @Bushido_Cat
      @Bushido_Cat 6 วันที่ผ่านมา

      ты перестанешь быть джуном тогда когда сможешь создавать собственные удобные и полезные фреймворки 😎

  • @awesomio7329
    @awesomio7329 ปีที่แล้ว +1

    гениальное видео, спасибо автору

  • @ram-1919
    @ram-1919 2 ปีที่แล้ว +5

    Вау, супер! Всё чётко рассказано, и как раз то, что я искал!

  • @Lucio11a
    @Lucio11a ปีที่แล้ว +2

    Как же часто я возвращаюсь на этот канал, ибо, чаще всего, поиск того, что мне нужно в данный момент, ведет, чуть ли не первой ссылкой в ютубе - сюда :D
    Как раз препод наругал меня за то, что я слишком часто использую статику и свой "псевдосинглтон", и что пора бы уже задуматься об изучении Зенжекта и использовать пул, забыв о моем обычном Destroy :DDD (надо будет поглядеть ролик про Night pool)
    Благодарю за чудесный контент)) Даже не смотря на то, что приходится часто жамкать паузу и прослушивать некоторые моменты несколько раз, чтобы пережевать информацию мозгом - ролики эти бесценны!..

    • @NightTrainCode
      @NightTrainCode  ปีที่แล้ว +1

      Большое спасибо, очень приятно)
      К моим ассетам в идеале читать документацию на GitHub, так как их я частенько обновляю, а ролики, к сожалению, нет
      У меня есть классный синглтон на гитхабе. Пул и прочее тоже там, можешь код поизучать. Документация везде написана

  • @23SILVER1
    @23SILVER1 ปีที่แล้ว +2

    красавчик.
    Всё просто и понятно.
    И почему твой канал я раньше не находил.

    • @NightTrainCode
      @NightTrainCode  ปีที่แล้ว

      Спасибо)
      Ну, чудеса случаются ахах

  • @dezoksiribonukleotid5011
    @dezoksiribonukleotid5011 2 ปีที่แล้ว +2

    спасибо большое, реально помог

  • @rdragon587
    @rdragon587 2 ปีที่แล้ว +1

    cool) thanks)

  • @vicktoriashepard
    @vicktoriashepard 2 ปีที่แล้ว +14

    Очень полезный материал. Но все же нжект в поля это как-то грязновато. Получается кто-то из вне знает внутреннюю реализацию объекта к которому не относится? Вариант с псевдо конструктором куда как чище и аккуратнее. Но это тема для холивара, а на него времени нет, код писать надо !)))) з.ы. Да и как-то ты очень быстро пропаровозил тему фабрик, а это довольно важная часть возможностей иньекций.

  • @ode2877
    @ode2877 2 ปีที่แล้ว +2

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

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      Всегда пожалуйста! 🔥

  • @dats9652
    @dats9652 2 ปีที่แล้ว

    Блин, спасибо тебе самое большое. Самое понятное объяснение

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      Самое большое на здоровье)

  • @user-kf4ye7zy4z
    @user-kf4ye7zy4z 2 ปีที่แล้ว +1

    Спасибо! Наверное пригодится позже, а пока позалипал в твою игруху, мне она заходит)))

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      Ахах, на здоровье и спасибо)

  • @user-hq2wg8pg1l
    @user-hq2wg8pg1l 2 ปีที่แล้ว +1

    Spasibo ()

  • @Serghio95
    @Serghio95 2 ปีที่แล้ว +3

    Спасибо за видос. Можно ли где-то найти исходники игры, показанной в видео? Мне удобней разбираться глядя в код, чем слушая объяснение.

  • @trytowinunity1445
    @trytowinunity1445 2 ปีที่แล้ว +1

    Спасибо :)

  • @psy_gamer
    @psy_gamer 2 ปีที่แล้ว +12

    Отличные темы на канале раскрываются! Что ECS, что DI, крайне полезно)
    На работе тоже используем Zenject, но при первом взаимодействии мне там рассказали меньше, чем в этом видео!)

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว +5

      Привет, спасибо) Рад, что видосы помогают 😎
      На работе точно никуда без Zenject'а, даже если делать прототип или Hello World 🤣

  • @nicedevelooper
    @nicedevelooper 2 ปีที่แล้ว +14

    Гайд крутой, но когда смотришь в первый раз, слишком уж быстро для нормального восприятия. Автору удачи в развитии канала.

    • @ruslan_yefimov
      @ruslan_yefimov 2 ปีที่แล้ว

      А ты книгу когда хочешь прочитать, пролистываешь картинки и если не нравятся, не читаешь?)

  • @victorvoiz8839
    @victorvoiz8839 2 ปีที่แล้ว +2

    годнота

  • @user-ih3xv6mx5p
    @user-ih3xv6mx5p ปีที่แล้ว +1

    Нереально выручил!!
    Задолбался искать почему инъекция не проходит. (13:50)
    Спасибо тебе огромное!

  • @vlpalamar8639
    @vlpalamar8639 11 หลายเดือนก่อน

    вопрос, что лучше(ну или что вы чаще используете), интерфейсы или абстрактные классы? например, оружие можно реализовать через интерфейс, а можно через абстрактный класс.

  • @Sher_Alex
    @Sher_Alex 2 ปีที่แล้ว +4

    Классное видео, честно. Вообще странно даже, что подписчиков у автора не так много )

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว +4

      Большое спасибо)
      Пока нет видосов на широкую аудиторию, а в основном для тех, кто уже шарит или хочет шарить
      Но, думаю, будущие видосы и время всё залечат)

  • @elzar8763
    @elzar8763 2 ปีที่แล้ว +2

    Очень интересный ролик. Я использую Zen. но ... , на пример я использую инсталлеры просто вешая их на обэкты , твой вариант намного интереснее - вешая их все в пустой обджект. Было бы ооочень интересно посмотреть туториал по структуре проекта на примере игры, или просто обзор твоей игры ., я находил только начальные туториалы по zen, а что дальше "разберитесь сами", Если тебе будет интересно сделать туториал по "сложной" игре =) 🙏

  • @user-yb2xf7lc1n
    @user-yb2xf7lc1n 2 ปีที่แล้ว

    А какая разница между NonLazy и QueueForInject?
    И для меня стало печально, что нельзя заинжектить без наследования от монобеха, по крайней мере я так и не выкупил как это сделать через создание экземпляра и конструктор

  • @romas5081
    @romas5081 ปีที่แล้ว

    Очень круто объяснил, без воды, четко!
    Есть вопрос по DiContainerRef, который ты вписал в какой то класс с методом InstantiateIntoExistingPool(..). Это метод класса Zenject? Идея понятна,- так будут инжектиться поля в каждом созданном объекте в пуле. Но сам DiContainerRef - статика, а это уже несколько грязный прием.. Впрочем, DiContainer итак всегда один, так что зачет)

  • @user-su7yd6og7y
    @user-su7yd6og7y 2 ปีที่แล้ว +2

    Не совсем понял, что делает "QueueForInject".
    Можно немного разжевать?
    И еще такой вопрос назрел:
    Например, у меня "MononInstaller", который хранит в себе +100500 префабов, инстансы которых будут передаваться в виде инъекций.
    Я правильно понимаю, что все эти префабы хранятся в памяти как полноценные объекты?
    Если да, то можно ли как-то выгрузить этот "MononInstaller" после использования, что бы не занимал память или вообще убить "SceneContext"?
    И третий вопрос:
    Таже проблема с памятью, но для "ProjectContext".

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      QueueForInject в основном используется для тех классов, что уже есть на сцене и внедрение произойдет сразу после фазы установки
      Нет, это ссылочные типы. А если на сцену все +100500 добавишь, то прощай оперативка и всё остальное)

    • @user-su7yd6og7y
      @user-su7yd6og7y 2 ปีที่แล้ว

      @@NightTrainCode
      "QueueForInject" оговаривается, что экземпляр инъектируется при запуске. А без него разве не при завпуске?
      Container.Bind.......; --- теперь если кто-то попросит у зенжекта "SomeClass", то он будет предоставлен.
      Container.QueueForInject(SomeClassInstance); --- класс по прежнему предоставляется, что изменилось не понятно...

  • @dmytromahas9207
    @dmytromahas9207 ปีที่แล้ว +4

    Привет, спасибо за данный урок.
    Но есть несколько вопросиков, ты говоришь что не стоит использовать повсюду интерфейсы, что их надо юзать когда есть больше чем 1 реализация, но что на счет интерфейсов - маркеров ?
    Так же можно было дать совет новичкам о принципе Interface Segregation который гласит разделять интерфейсы на маленькие сущности да бы наследник не был вынужден наследовать то что ему не надо, но это так к слову

    • @YasnaKo
      @YasnaKo ปีที่แล้ว

      А что такое интерфейс-маркер?

  • @wbrim
    @wbrim 2 ปีที่แล้ว +7

    Начал нормально объяснять, а когда дело коснулось кода, то "пиши это" без объяснения почему. Придется более подробно где-то в другом месте читать про все то, что ты там написал, чтобы переделать это под свой проект

  • @PilotInspektor
    @PilotInspektor ปีที่แล้ว +2

    Спасибо за гайд)

  • @gameviewer5693
    @gameviewer5693 2 ปีที่แล้ว +1

    Cпасибо за видео, очень полезный материал, так как документация ограмна, хотелось бы знать самые распространенные биндинги или базу того что будет чаще всего использоваться. Но остались вопросы касательно QueueForInject, не понятно что значит внедряет компонент при запуске, префаб ведь и так создается экземпляр из забинженного класса прокидывается, в документации тоже не особо понял. И на счет
    BindInterfacesTo и BindInterfacesAndSelfTo если в биндинге просто указать интерфейс как в примере, то выдаст ошибку.

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว +1

      QueueForInject в основном используется для тех классов, что уже есть на сцене и внедрение произойдет сразу после фазы установки
      А чтобы BindInterfaces заработали, надо будет так же прописать, например, FromInstance и AsSingle

  • @nuciesto6917
    @nuciesto6917 2 ปีที่แล้ว

    Будет очень интересен ролик про совмещение ecs и zenject

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      Не думаю, что в нём есть смысл, так как суть абсолютно такая же
      Просто в инициализаторе ECS вместо SerializeField с пробрасыванием ссылки в инспекторе пишешь атрибут Inject. Далее systems.Inject(класс, который внедрил);

  • @_Otets_
    @_Otets_ ปีที่แล้ว

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

    • @NightTrainCode
      @NightTrainCode  ปีที่แล้ว

      Проще такие вещи не заносить глубоко в код, а хранить в SO, либо в сериализованном поле

    • @_Otets_
      @_Otets_ ปีที่แล้ว

      @@NightTrainCode Понял, спасибо за ответ.

  • @VADIM-SOLOV
    @VADIM-SOLOV 2 ปีที่แล้ว +4

    Спасибо за видео! Я получил отличное представление по Zenject. Ещё ты сказал очень интересную фразу: что статические поля и свойства остаются после перехода между сценами. И теперь я понимаю почему статику критикуют при неумелом использовании. Если я правильно понял, то статические классы так-же остаются в оперативной памяти при переходе между сценами?

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      Привет, на здоровье, рад, что тебе пришло осознание Zenject'а и статики)
      Да, статика на то и статика. Ещё есть интересная штучка - статический конструктор. В следующем видео я про него немного расскажу, надеюсь, до конца февраля его выпущу

    • @VADIM-SOLOV
      @VADIM-SOLOV 2 ปีที่แล้ว +1

      @@NightTrainCode Спасибо за ответ! Рад узнать что ты готовишь новое видео! Успехов в этом :)

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      ​@@VADIM-SOLOV Спасибо большое)
      Да давно готовлю (руки не доходили всё) и ютуб я забрасывать не собираюсь, канал только обороты набирает как раз

  • @user-ss9vo7fq3z
    @user-ss9vo7fq3z ปีที่แล้ว +1

    Каким образом интерфейсы разорвали зависимости? С таким же успехом можно было сделать базовый класс Weapon и от него наследников. Пистолеты и шотганы..

  • @ilgiz2616
    @ilgiz2616 2 ปีที่แล้ว +3

    Хорошее видео. Но тема очень сложная для понимания. Если раскрывать, то одним простым видосом не отделаться )))

  • @Veyron104
    @Veyron104 ปีที่แล้ว

    срочно пояснительную бригаду, тут кому-то стало непонятно))) 16:12 Инсталер для ГО? Но там же есть какой-то пустой список для ГО и для СО в зенжекте?

  • @muse_x4237
    @muse_x4237 ปีที่แล้ว +1

    Привет. Не знаю, читаешь ли ты коммы под старыми видео, но все же напишу.
    1) Спасибо за такое подробное и качественное видео. Внедрил Zenject в свой проект, параллельно пересмотрел видео несколько раз, чтобы полностью разобраться. Все очень емко и по делу 👍
    2) Столкнулся со следующей проблемой: когда перезагружаю сцену с помощью SceneManager.LoadScene в поля инджектится непонятно что. Rider только показывает MissingReferenceException. Он же выбрасывается в консоль при попытке обращения к такому полю. Почему это происходит и можно ли как-то это исправить (без переноса в Project Context)? Заранее благодарю 🙏

    • @NightTrainCode
      @NightTrainCode  ปีที่แล้ว +1

      Привет, спасибо, все читаю и практически на все отвечаю)
      MissingReferenceException и NullReferenceException, кстати, разные вещи и рекомендую почитать по поводу этого
      А так, проблема похожа на то, что со статикой ты где-то не доглядел. Она после смены сцен, скажем, не "перезагружается"

    • @muse_x4237
      @muse_x4237 ปีที่แล้ว

      @@NightTrainCode не-не как раз таки статику я вообще не использую (все по заветам Сакутина).
      Для понимания: у меня в игре всего одна сцена, которую нужно перезагружать в конце каждого раунда.
      Протестировал сейчас на переносе одного независимого класса в ProjectContext, и вроде как это решает проблему. Но при перезагрузке все созданные из SceneContext объекты и так переносятся в DontDestroyOnLoad и, видимо, заново не создаются. Поэтому хотелось бы понять как это вообще работает.
      Про ексепшены - спасибо, почитаю про это)

  • @brickman3171
    @brickman3171 ปีที่แล้ว +1

    Привет, как решить такую ситуацию. У меня есть объект ui который я создаю из префаб в runtime и в него внедряется зависимость, у которой есть события на который я подписываютсь в OnEnable и отписываюсь в OnDisable, но проблема в том что Zenject не успевает внедрять зависимость в метод конструктор из за чего когда я начинаю подписку выдаёт ошибку. Подскажи пожалуйста как это можно решить?

    • @NightTrainCode
      @NightTrainCode  ปีที่แล้ว +1

      Префаб нужно спавнить через DiContainer, а не через Instantiate

    • @brickman3171
      @brickman3171 ปีที่แล้ว +1

      @@NightTrainCode Я так и делаю, но проблема в том что zenject сначала инстанциирует объект через юнити instantiate после чего юнити вызывает Awake, Start, OnEnable а уже после чего сам zenject внедряет зависимости.

  • @mishapushka708
    @mishapushka708 ปีที่แล้ว +1

    пока нихрена не понятно)) это можно использовать для любых типов игр и даже для мобилок?

  • @orembo112play4
    @orembo112play4 2 ปีที่แล้ว +1

    что за игра на фоне?

  • @user-bz8ip1zo5d
    @user-bz8ip1zo5d ปีที่แล้ว +1

    Избавляемся от зависимостей добавляя зависимости, гениально (нет)

  • @Veyron104
    @Veyron104 ปีที่แล้ว

    спасибо за видос! Очень подробно всё описано!
    Вот только мне всё-равно не понятно(
    12:42 "теперь вместо беспокойства о прокидывании зависимостей с каждой сцены, что очень неудобно, ешё можно просто забыть это сделать можно использовать зенжект" (в котором нужно будет дописать инициализацию чего-то, и добавив на сцену доп объект, в который таки надо будет прокинуть ссылку на то, на что "в начале мысли" мы могли забыть прокинуть ссылку ?
    Некоторое время назад мне не нравились события и подписка на них, а сейчас норм, втянулся)) Надеюсь функционал зенжекта и то, как его использовать до меня тоже дойдёт)

  • @uralfansoft
    @uralfansoft 2 ปีที่แล้ว

    The type or namespace name 'PlayerUnit' could not be found

  • @denisgoodman4492
    @denisgoodman4492 ปีที่แล้ว +2

    Я рекомендую начинать с другого видео th-cam.com/video/IS2YUIb_w_M/w-d-xo.html (там есть целый плейлист)
    IMHO Здесь же попытка за одно видео все рассказать и несколько субмурно.

  • @teawizzard
    @teawizzard ปีที่แล้ว +1

    FIND OBJECT OF TYPE FOREVER

  • @HeyWhoTheFuckAreYou
    @HeyWhoTheFuckAreYou 2 ปีที่แล้ว +4

    Бля, сложно пиздец, тут в одно видео не разобрать как им пользоваться. Но в целом тема полезная, но нужно вникать как этим пользоваться, одного видео тут явно не достаточно.

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว +2

      Ага
      У K-Syndicate есть запись стрима на два часа, там в принципе всё довольно понятно рассказано

  • @3magalibur953
    @3magalibur953 ปีที่แล้ว

    По zenject хватает материала, а вот по vcontainer ничего нету :(

  • @cgdranser
    @cgdranser 8 หลายเดือนก่อน

    Как сказал бы один мой знакомый программист. Skill Issue
    Кароче, проблема этой ситуации в неправильной организации архитектуры. Иначе говоря, кривые рученки разработчика игры.
    И по сути, решение до банальности простое. Правильно организовать архитектуру..
    Хотя кому оно надо..

  • @user-de1wo4xd4j
    @user-de1wo4xd4j 8 หลายเดือนก่อน

    Смотрю что у тебя, что у K-syndicate сначала инстанцируете игрока, потом его биндите в контейнер. Я так делаю, мне зенжект ворнинг выдает, что так делать не желательно. Я хочу например UI на другой сцене сделать, где мне нужно игрока взять, и не могу т.к. он на другой сцене. Мне посоветовали через контракт имен сделать, я сделал мне зенжект говорит что я не могу инжекты раскинуть т.к. ты преварительно не байндишь игрока, а создаешь его.
    Чет муть какая-то этот ваш зенжект. Либо я слушать не умею, либо не понимаю.
    Я еще не понимаю что вы под сервивами подразумеваете - как пример приводят InputService - но зачем там что-то шаманить, когда есть Input system, который сам разные реализации под разные системы.
    У меня после всех роликов такая каша в голове образовалась, я вообще без понятия как этим всем пользоваться (

  • @Dippps
    @Dippps 2 ปีที่แล้ว

    Хз, чет меня напрягает, что надо инстанс закидывать в сцене.

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      Его можно закинуть так, как тебе удобно

  • @igroteka90
    @igroteka90 ปีที่แล้ว +1

    Слишком сжато, во второй половине вообще мало чего понятно.
    Я сам программист, но очень сжато, перескок туда-сюда и нету приложенных примеров кода.

  • @bogdan9423
    @bogdan9423 10 หลายเดือนก่อน +1

    Что это за игра на видео?

    • @NightTrainCode
      @NightTrainCode  10 หลายเดือนก่อน +1

      Мой пет проект. Ещё не вышел)

    • @bogdan9423
      @bogdan9423 10 หลายเดือนก่อน +1

      @@NightTrainCode Круто! Очень круто выглядит!🔥 Обожаю игры где много природы и ничего лишнего!) Очень классно выглядит, я бы в такую игру поиграл)

    • @bogdan9423
      @bogdan9423 10 หลายเดือนก่อน +1

      @@NightTrainCode успехов в проектировании ✊

    • @bogdan9423
      @bogdan9423 10 หลายเดือนก่อน

      @@NightTrainCode а что такое пет?

    • @NightTrainCode
      @NightTrainCode  9 หลายเดือนก่อน +1

      @@bogdan9423 Спасибо, рад слышать!)

  • @FVA322
    @FVA322 9 หลายเดือนก่อน

    Пытался подружить миррор с зенджектом. Це пэзда....

    • @NightTrainCode
      @NightTrainCode  9 หลายเดือนก่อน

      Ох

    • @FVA322
      @FVA322 9 หลายเดือนก่อน

      @@NightTrainCode в общем пришел к тому, что сделал референс для контейнера, и объекты которые спавнит миро в авэйке через референс контейнером инжектю. Хз насколько это норм...

  • @VShangeev
    @VShangeev ปีที่แล้ว

    Как ужасно сделано приближение в видео при вводе полей. Неуспеваешь осознать куда тыкнул в одном месте уже экран увеличивается в другом месте ставь паузу и делай покадровку назад. И так по кругу пока не соединишь воедино, что показывалось в двух местах на коротком промежутке времени.
    Также мучает вопрос... если это подробный урок, то почему многие вещи Zenject лишь упоминаются и никак не поясняются зачем они.

  • @nuciesto6917
    @nuciesto6917 2 ปีที่แล้ว

    Мне не нравится ваша реализация спавна,по моему лучше spawnrequest, сразу делать в бинд и убрать наследование от монобеха

    • @nuciesto6917
      @nuciesto6917 2 ปีที่แล้ว

      А данные перекидывать через например класс data вложенный в spawnrequest

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      @@nuciesto6917 Spawn Request'ов на сцене очень много, это точка, а которой заспавнится один конкретный юнит и инжектить каждый ну никак не получится 😄
      Запихивать туда контейнер, как сделал я на видео - нелогично. Ему резонно находиться только в какой-то фабрике

    • @nuciesto6917
      @nuciesto6917 2 ปีที่แล้ว +1

      @@NightTrainCode эту проблему можно решить, путем создания спец монобеха в котором будут хранится нужные данные о юните в данной точке. Создать поле в моноинсталлере игры, в которой будет массив этих спец монобехов, и этот массив биндить и в конструкторе спавнера получать. По моему вполне реальное решение

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      @@nuciesto6917 Реквест хранит ссылку на заготовленный и полностью настроенный префаб юнита. Также реквест самостоятельная вещь, которая в эвэйке реплейсит себя с префабом юнита и удаляется. Зачем их инжектить? Это просто какие-то точки для спавна конкретного, заготовленного противника. Я часто добавляю новые / меняю их / удаляю, расставляя противников по карте
      + На сцене много разоичных зон, юниты должны спавниться в основном только тогда, когда мы в неё заходим. На всех сценах их количество разное. Не вижу смысла применять здесь Zenject, только лишняя трата времени, так как инициализировать ничего не нужно раньше эвейка, да и пробрасывать зависимости тоже

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว

      @@nuciesto6917 Можно и через отдельный класс, ни от чего не наследованный юзать, просто вопрос уже встаёт о том, насколько это удобно будет. Если каждому вручную прописывать position в виде Vector3, то это выстрел в ногу сразу 😆
      Да и вообще видос не об этом)
      А про то, как что-то зарегистрировать и внедрить
      Ну и как спавнить, чтобы атрибуты [Inject] не игнорировались 😉

  • @domiurk
    @domiurk ปีที่แล้ว +1

    Об'ясніть мені що таке sealed class. Що це за клас

    • @NightTrainCode
      @NightTrainCode  ปีที่แล้ว +1

      Модифікатор sealed забороняє успадкування чи перевизначення

    • @domiurk
      @domiurk ปีที่แล้ว

      @@NightTrainCode Дякую

    • @NightTrainCode
      @NightTrainCode  ปีที่แล้ว

      @@domiurk На здоров'я

    • @domiurk
      @domiurk ปีที่แล้ว

      ​@@NightTrainCode ти з України(чи переводчиком користуєшся)

    • @NightTrainCode
      @NightTrainCode  ปีที่แล้ว

      ​@@domiurk Я из России, але Украинську розумию трохи

  • @mirotvoretts
    @mirotvoretts ปีที่แล้ว

    Как зарегистрировать префабы без создания объектов префабов? В дальнейшем буду создавать уже объекты через фабрику.
    Есть вот такой код с условными префабами заклинаний. Но при создании объекта зарегистрированного префаба ([Inject] private Fireball _fireball, например) получаю NullRef. Что я делаю не так? Подскажите, пожалуйста
    using UnityEngine;
    using Zenject;
    public class SpellsInstaller : MonoInstaller
    {
    [SerializeField] private Fireball _fireball;
    [SerializeField] private IceBlade _iceBlade;
    [SerializeField] private LightningBall _lightningBall;
    public override void InstallBindings()
    {
    Container.Bind().FromComponentInNewPrefab(_fireball).AsSingle().NonLazy();
    Container.Bind().FromComponentInNewPrefab(_iceBlade).AsSingle().NonLazy();
    Container.Bind().FromComponentInNewPrefab(_lightningBall).AsSingle().NonLazy();
    Container.Bind().AsSingle();
    }
    }

  • @SCEEF
    @SCEEF 2 ปีที่แล้ว +1

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

    • @NightTrainCode
      @NightTrainCode  2 ปีที่แล้ว +2

      Почитай про первый принцип SOLID и ради интереса смысл ECS, где тонны компонентов и системок на каждый чих, а этот паттерн всё больше набирает обороты
      Zenject - для того, чтобы забыть про нулл рефы из-за инициализаций в хрен пойми какой момент времени и головных болей с прокидываниями ссылок в инспекторе
      А разбиение на компоненты - для лёгкой читаемости кода, универсальности и гибкости в использовании. А также для лёгкого переиспользования в будущем
      Конечно, можно всё в один GameControllerManagerHandler запихать и наслаждаться одним скриптом)
      + в Rider недолго нажать Alt + Enter, чтобы вынести что-то в отдельный компонент

    • @nuciesto6917
      @nuciesto6917 2 ปีที่แล้ว +1

      Лично мне zenject сэкономил массу времени и сил

    • @SCEEF
      @SCEEF 2 ปีที่แล้ว

      @@NightTrainCode причет тут один стрипт. Без всех этих хитростей хуитростей, можно писать модулями. Скрипт на стрельбу. Который будет работать и у врагов и у персонажа. Скрипт на движение, жизни и тд. Чтобы не делать помойку в коде и нужно ООП. Но люди хуярют PlayerScripts для всех механик связанных с персонажем и говорят ООП гавно.

    • @nuciesto6917
      @nuciesto6917 2 ปีที่แล้ว

      @@SCEEFnight Train Code использует zenject неправильно, вот и кажется что херня получается, но можно сделать как ты и сказал писать модулями но на много проще

    • @user-cu5ky8qz2n
      @user-cu5ky8qz2n 2 ปีที่แล้ว

      Ну судя по тому что коммент начинается со слов "Всё что я понял...", ты не особо далеко в геймдеве продвинулся)

  • @davidflbdv2742
    @davidflbdv2742 หลายเดือนก่อน

    Так я не понял, сколько лет ты уже кодишь?
    Проблема статиков это не в очистки а как раз в то почему мы используем инжекторы -> глобальные переменные делает код менее понятным так как нет нормальной передачи того или иного класса
    Автор не понимает что делает и не умеет подать материал, для него zenject это не инжектор)

    • @davidflbdv2742
      @davidflbdv2742 หลายเดือนก่อน

      А ну у него и ответ в конце для чего zenject, решает проблемы синглтонов)
      Да автор не только про это говорит, и про забразсывания зависимостях, только автор понимает что это позволяет делать
      Расскажу в сущности для чего используется инжекторы.
      1) У нас есть файл с конфигом проекта, при использования Zenject это installer, и то что мы используем интерфейсы мы можем очень просто менять их реализации только в конфиге, что позволяет не трогать код)
      2) Решает проблемы с глобальной видимости -> синглтон антипатерн который делает код вредным и его использование это плохо, как раз вместо синглтонов которые обычно используем, мы делаем обычные классы и перекидываем
      3) позволяет быть уверенным что до любого кода какой то сервис точно дойдет, а если сломается мы знаем где)

    • @davidflbdv2742
      @davidflbdv2742 หลายเดือนก่อน

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

  • @serveladik
    @serveladik 11 หลายเดือนก่อน

    Слишком быстро обьясняешь, тот же код еще ускоряешь
    Я хочу вместе с обьяснением смотреть код, а выходит так что ты уже след класс делаешь.
    Да могу паузить, но я тогда не буду слушать паралельно

    • @user-lb6lv1sq3v
      @user-lb6lv1sq3v 3 หลายเดือนก่อน

      Ставь скорость видео на 0.8 и норм

  • @mrgoodpeople
    @mrgoodpeople 3 หลายเดือนก่อน

    Ничего не понятно, от слова ничего.

  • @Andrey-xk7ku
    @Andrey-xk7ku ปีที่แล้ว +1

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

  • @user-oj4ye4ol6m
    @user-oj4ye4ol6m 2 ปีที่แล้ว +1

    17 минут неработающей воды. Мне надо подключить сервис через интерфейс. Твоим способом в конце видео он не подключается.

  • @westparezal
    @westparezal 10 หลายเดือนก่อน +1

    А можешь пожалуйста сделать по VContainer`у?Сейчас он назывется так и сделан как раз тем чуваком, который ушёл из Zenject`a. Говорят, что VContainer невероятно быстр и крут. Туторов по сети вообще нету практически, а те, что есть, просто ужасны.

    • @NightTrainCode
      @NightTrainCode  10 หลายเดือนก่อน

      Да, урок будет)

  • @Bushido_Cat
    @Bushido_Cat 3 หลายเดือนก่อน

    АВТОР РОЛИКА НЕ ПОЗОРЬСЯ, ЕСЛИ ТЫ НЕ ШАРИШЬ ЗА API UNITY ТО НЕ НУЖНО ПОКАЗЫВАТЬ ПРИМЕР НА КОНСОЛЬНОМ ПРОЕКТЕ ТАК ЭТОТ ПРИМЕР НЕ ТОЖЕ САМОЕ ЧТО В РЕАЛЬНОМ ПРОЕКТЕ UNITY. В UNITY НЕЛЬЗЯ СОЗДАВАТЬ НОВЫЙ ЭКЗЕМПЛЯР КЛАССА И ПЕРЕДОВАТЬ ССЫЛКУ ЭТОГО ЭКЗЕМПЛЯРА, КАК В КОНСОЛЬНОМ ПРОЕКТЕ.