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

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

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

  • @Worl4x
    @Worl4x 2 года назад +64

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

    • @Bushido_Cat
      @Bushido_Cat 9 месяцев назад +2

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

    • @sergeikap7211
      @sergeikap7211 3 месяца назад

      😂😂😂

  • @younggd
    @younggd Год назад +7

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

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

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

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

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

    • @Miketo_Sanso
      @Miketo_Sanso 6 месяцев назад

      На какое бы обучающее видео я не знашёл, везде пишут "начинающим разработчикам".
      Я: Начинаю учиться кодить.
      Челы: "Начинающий разработчик".
      Я: Написал свою первую игру.
      Челы: "Начинающий разработчик".
      Я: Сделал резюме и выучил основные паттерны, начинаю углубляться в более сложное проектирование.
      Челы: "Начинающий разработчик".
      Я: Устроился в компанию Junior-ом, уже даже не стажёр.
      Челы: "Начинающий разработчик".
      Мне кажется, у челов в принципе будет до самого конца мнение, что если он смог освоить что-то (даже не паттерн, а правило проектирования KISS, например)) ), то все, кто ещё этого не знают (или просто не слышали формулировку) - начинающие. Ору с самомнения))

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

      @@Miketo_Sanso ну не зная DI из начинающий ты не вылезешь, а джуном будет очень тяжело устроиться

  • @Lucio11a
    @Lucio11a 2 года назад +2

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

    • @NightTrainCode
      @NightTrainCode  2 года назад +1

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

  • @23SILVER1
    @23SILVER1 2 года назад +2

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

    • @NightTrainCode
      @NightTrainCode  2 года назад

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

  • @Димас-ТвойРазработчикИгр

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

    • @NightTrainCode
      @NightTrainCode  3 года назад +4

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

  • @АлексейБуров-т7ц
    @АлексейБуров-т7ц Год назад +1

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

  • @ram-1919
    @ram-1919 2 года назад +5

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

  • @ode2877
    @ode2877 2 года назад +2

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

  •  Год назад +7

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

    • @Bushido_Cat
      @Bushido_Cat 6 месяцев назад

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

    • @Miketo_Sanso
      @Miketo_Sanso 6 месяцев назад

      @@Bushido_Cat Челы на позициях Senior, которые ни одного фреймворка не написали: Аааа... Ну, пойду, начальству скажу, чтобы мне платили не 250к, а 50, как нашим джунам, спасибо гению из интернета, глаза открыл!)

    • @Miketo_Sanso
      @Miketo_Sanso 6 месяцев назад

      Я - без опыта работы, все время на самообучении, и чтобы ПОПАСТЬ на позицию джуна учу Dependency injection.
      - Челы рядом, пытаясь найти те же знания: ООО, я уже не джун!)
      Пздц, мы реально в разных мирах живём, или что это за бред?)))

  • @awesomio7329
    @awesomio7329 2 года назад +1

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

  • @sergeikap7211
    @sergeikap7211 3 месяца назад

    Самое топовое объяснение

  • @Андрей-в7и6ь
    @Андрей-в7и6ь 3 года назад +1

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

    • @NightTrainCode
      @NightTrainCode  3 года назад

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

  • @dezoksiribonukleotid5011
    @dezoksiribonukleotid5011 2 года назад +2

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

  • @vicktoriashepard
    @vicktoriashepard 3 года назад +14

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

  • @psy_gamer
    @psy_gamer 3 года назад +12

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

    • @NightTrainCode
      @NightTrainCode  3 года назад +5

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

  • @dats9652
    @dats9652 3 года назад

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

    • @NightTrainCode
      @NightTrainCode  3 года назад

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

  • @Sher_Alex
    @Sher_Alex 3 года назад +4

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

    • @NightTrainCode
      @NightTrainCode  3 года назад +4

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

  • @king_fox_3106
    @king_fox_3106 4 месяца назад

    Лул)
    Для синглтона можно реализовать очень простую и незамысловатую конструкцию в getter, он тебе при первом общении создаёт объект, если его нет. Или префаб... Сути не меняет, синглтон, это не только инициализация в Start или Awake.
    Так же не забываем про C# синглтон, можно юзать его даже без monoBeh-а
    Про синглтон много можно придумать реализаций, а эта самая геморная. И не понятно для чего оно нужно, если честно 😅
    Возможно подойдет тому, кто не умеет строить зависимости

  • @wbrim
    @wbrim 2 года назад +8

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

  • @A113-t6k
    @A113-t6k 2 года назад +1

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

  • @VADIM-SOLOV
    @VADIM-SOLOV 2 года назад +4

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

    • @NightTrainCode
      @NightTrainCode  2 года назад

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

    • @VADIM-SOLOV
      @VADIM-SOLOV 2 года назад +1

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

    • @NightTrainCode
      @NightTrainCode  2 года назад

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

  • @Serghio95
    @Serghio95 3 года назад +3

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

  • @dmytromahas9207
    @dmytromahas9207 2 года назад +4

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

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

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

  • @Veyron104
    @Veyron104 2 года назад

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

  • @universegames7692
    @universegames7692 3 дня назад

    Ты лучший

  • @Veyron104
    @Veyron104 2 года назад

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

  • @nicedevelooper
    @nicedevelooper 2 года назад +14

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

    • @ruslan_yefimov
      @ruslan_yefimov 2 года назад

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

    • @Miketo_Sanso
      @Miketo_Sanso 6 месяцев назад

      @@ruslan_yefimov А ты когда видео смотришь, тоже каждую секунду на паузу ставишь, не успевая послушать, что сказал автор, и увидеть, что он написал, из-за чего перепросмотры видео увеличиваются раз в 5? (А автор коммента написал про первый просмотр)
      Умойся, клоун

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

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

  • @Пифагорикс
    @Пифагорикс 2 года назад +2

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

  • @romas5081
    @romas5081 2 года назад

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

  • @trytowinunity1445
    @trytowinunity1445 2 года назад +1

    Спасибо :)

  • @mishapushka708
    @mishapushka708 2 года назад +1

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

  • @elzar8763
    @elzar8763 3 года назад +2

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

  • @rdragon587
    @rdragon587 2 года назад +1

    cool) thanks)

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

    Что мешает сделать bootstrap и поочерёдно инициализировать синглтоны?
    Как-будто это единственная проблема которую решает Zenject, да ещё и к тому же он замедляет код.

  • @РоманКривжа
    @РоманКривжа 3 года назад +2

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

    • @NightTrainCode
      @NightTrainCode  3 года назад

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

    • @РоманКривжа
      @РоманКривжа 3 года назад

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

  • @ilgiz2616
    @ilgiz2616 2 года назад +3

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

  • @denisgoodman4492
    @denisgoodman4492 2 года назад +2

    Я рекомендую начинать с другого видео ruclips.net/video/IS2YUIb_w_M/видео.html (там есть целый плейлист)
    IMHO Здесь же попытка за одно видео все рассказать и несколько субмурно.

  • @ЭдуардКик
    @ЭдуардКик 3 года назад +1

    Spasibo ()

  • @muse_x4237
    @muse_x4237 2 года назад +1

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

    • @NightTrainCode
      @NightTrainCode  2 года назад +1

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

    • @muse_x4237
      @muse_x4237 2 года назад

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

  • @victorvoiz8839
    @victorvoiz8839 3 года назад +2

    годнота

  • @brickman3171
    @brickman3171 2 года назад +1

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

    • @NightTrainCode
      @NightTrainCode  2 года назад +1

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

    • @brickman3171
      @brickman3171 2 года назад +1

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

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

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

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

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

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

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

  • @ДелайДобро-в9ж
    @ДелайДобро-в9ж 2 года назад

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

  • @nuciesto6917
    @nuciesto6917 3 года назад

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

    • @NightTrainCode
      @NightTrainCode  3 года назад

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

  • @PilotInspektor
    @PilotInspektor 2 года назад +2

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

  • @orembo112play4
    @orembo112play4 2 года назад +1

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

  • @gameviewer5693
    @gameviewer5693 3 года назад +1

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

    • @NightTrainCode
      @NightTrainCode  3 года назад +1

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

  • @uralfansoft
    @uralfansoft 2 года назад

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

  • @igroteka90
    @igroteka90 2 года назад +1

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

  • @3magalibur953
    @3magalibur953 Год назад

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

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

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

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

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

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

    FIND OBJECT OF TYPE FOREVER

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

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

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

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

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

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

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

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

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

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

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

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

  • @Dippps
    @Dippps 2 года назад

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

    • @NightTrainCode
      @NightTrainCode  2 года назад

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

  • @domiurk
    @domiurk 2 года назад +1

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

    • @NightTrainCode
      @NightTrainCode  2 года назад +1

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

    • @domiurk
      @domiurk 2 года назад

      @@NightTrainCode Дякую

    • @NightTrainCode
      @NightTrainCode  2 года назад

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

    • @domiurk
      @domiurk 2 года назад

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

    • @NightTrainCode
      @NightTrainCode  2 года назад

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

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

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

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

      Ох

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

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

  • @nuciesto6917
    @nuciesto6917 3 года назад

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

    • @nuciesto6917
      @nuciesto6917 3 года назад

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

    • @NightTrainCode
      @NightTrainCode  3 года назад

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

    • @nuciesto6917
      @nuciesto6917 3 года назад +1

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

    • @NightTrainCode
      @NightTrainCode  3 года назад

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

    • @NightTrainCode
      @NightTrainCode  3 года назад

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

  • @SCEEF
    @SCEEF 3 года назад +1

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

    • @NightTrainCode
      @NightTrainCode  3 года назад +2

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

    • @nuciesto6917
      @nuciesto6917 3 года назад +1

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

    • @SCEEF
      @SCEEF 3 года назад

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

    • @nuciesto6917
      @nuciesto6917 3 года назад

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

    • @Димас-ТвойРазработчикИгр
      @Димас-ТвойРазработчикИгр 3 года назад

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

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

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

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

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

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

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

  • @Andrey-xk7ku
    @Andrey-xk7ku Год назад +1

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

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

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

  • @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();
    }
    }

  • @Miketo_Sanso
    @Miketo_Sanso 6 месяцев назад

    Ссылка на Zenject для слабаков, согласен с автором))

  • @mrgoodpeople
    @mrgoodpeople 9 месяцев назад

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

  • @СергейДуванов-г2д
    @СергейДуванов-г2д 2 года назад +1

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

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

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

  • @Bushido_Cat
    @Bushido_Cat 9 месяцев назад

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