Code Craft: Unity Edition
Code Craft: Unity Edition
  • Видео 47
  • Просмотров 81 907
Анонс курса Full-Stack Unity Developer
Всем привет! Объявляю набор на второй поток полностью обновленного моего курса по разработке игр на Unity 🚀
Записаться на курс можно через телеграмм: t.me/starkre22
Количество мест ограничено)
Ссылка на курс: unitycodecraft.ru
Телеграм канал: t.me/unitycodecraft
Атомарный фреймворк: github.com/StarKRE22/Atomic
Просмотров: 1 201

Видео

Игровой цикл на Zenject. Вебинар (27.03.24)
Просмотров 1,7 тыс.5 месяцев назад
Игровой цикл на Zenject. Вебинар (27.03.24)
Урок по Zenject (20.03.24)
Просмотров 6 тыс.6 месяцев назад
Урок по Zenject (20.03.24)
MVVM на Unity c нуля. Учимся разрабатывать игровой интерфейс
Просмотров 7 тыс.8 месяцев назад
MVVM на Unity c нуля. Учимся разрабатывать игровой интерфейс
Поиск пути в Unity: кастомная реализация для RTS
Просмотров 2,2 тыс.Год назад
Поиск пути в Unity: кастомная реализация для RTS
Кастомные рейкасты на Unity
Просмотров 1,4 тыс.Год назад
Кастомные рейкасты на Unity
Кастомная физика на ECS
Просмотров 1,5 тыс.Год назад
Кастомная физика на ECS
Нодовая архитектура на Unity
Просмотров 3,9 тыс.Год назад
Нодовая архитектура на Unity
Приказы для юнитов на ECS. Учимся переиспользовать механики
Просмотров 1,9 тыс.Год назад
Приказы для юнитов на ECS. Учимся переиспользовать механики
Выделение группы юнитов: применяем архитектурные принципы на практике
Просмотров 2,1 тыс.Год назад
Выделение группы юнитов: применяем архитектурные принципы на практике
Перемещение юнитов в RTS: Роевой метод в Unity
Просмотров 3,7 тыс.Год назад
Перемещение юнитов в RTS: Роевой метод в Unity
Разработка кастомного ECS на Unity: Учимся делать RTS c нуля
Просмотров 14 тыс.Год назад
Разработка кастомного ECS на Unity: Учимся делать RTS c нуля
Создаем RTS игру в Unity: Введение в мир стратегий (Creating an RTS Game in Unity)
Просмотров 6 тыс.Год назад
Создаем RTS игру в Unity: Введение в мир стратегий (Creating an RTS Game in Unity)

Комментарии

  • @dmitrykot6185
    @dmitrykot6185 13 дней назад

    Спасибо за контент!

  • @konneuktrevor9295
    @konneuktrevor9295 17 дней назад

    зенджект это лютый оверхед, не понимаю зачем его использовать

  • @Slagemer1
    @Slagemer1 18 дней назад

    Спасибо чувак! Ты единственный у кого я смог узнать как юзать projectContext! Нигде больше я этого не мог найти

  • @KAMTEAM-j8g
    @KAMTEAM-j8g 18 дней назад

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

  • @jalomic
    @jalomic 24 дня назад

    Подписька лайк!!

  • @СлаваДобровольский-ъ3з

    Немного смутило объяснение автора про последний принцип SOLID. Типа инверсия зависимостей наступает, когда мы подключаем какой-то фреймворк и он начинает всем управлять. Это какая-то чушь. Инверсия зависимостей - это про то, что абстракции не должны зависить от реализаций. Но может я просто чего то не понял?

  • @СлаваДобровольский-ъ3з

    А можно не употреблять слово-паразит "да" в каждом втором предложении? Немного раздражает. В остальном все очень хорошо. Вместо заполошного "Вот здесь ставим инджект и здесь ставим инджект и здесь ставим инджект СМОТРИТЕ КАК ОТЛИЧНО РАБОТАЕТ", как это сделано абсолютно у всех, кого я до сих пор смотрел, тут все четко и ясно разложено по полочкам, я наконец то понял для чего собственно служит атрибут INJECT :)

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

    Хотите забавность? )) Жпт4о рекомендует ваш фреймворк для изучения, т.к. он полезный и поможет расширить знания. А еще потому, что он -Гибкий, хороший структурированный код, использует реактивное программирование, разделение ответственности и хорошая поддержка сообществом :D

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

    Я правильно понимаю что бы понять по этому уроку MVVM мне нужно выучить сначала Зенжект и ЮниРХ ?) Мне вот хочется понять что к чему, но я никогда не юзал UniRX, мне надо пойти расшариться в этой теме, , установить в свой проект и потом только вернуться к твоему уроку по MVVM. хардкорно )

  • @Temasdin
    @Temasdin 2 месяца назад

    Дякую за класний урок. Хочу надати -текстову бомбу- фідбек MonoScript працює лише в Editor. Для рантайму в білді можна використати TextAsset. Але я загалом відмовився від MonoViewBinder, бо зробив комплексну архітектуру де в зенджект фабрику передається інстанс моделі в'юхи, дженерік параметр в'юМоделі, адресабл референс на вьюху й власне в цій фабриці йде завантаження ресурсів, їх створення з автоматичною ін'єкцією залежностій, ну й для вже існуючого інстанса моделі мануальний Inject(). Це було зроблено, щоб максимально оптимізувати ресурси, щоб була можливість менеджменту в'юх через ui manager по дженерік ключам (можна ще по інамам, але я навпаки від них пішов). Такий максимально бойовий варіант. Конфіг віджетів має вигляд списку залежностей з IViewModel, AssetReference, UILayerIndex, де відповідно: - IViewModel (можна ще Type використати) поле має атрибути SerializeReference та TypeFilter (Odin Inspector) щоб відфільтрувати складні валідні референси; - AssetReference відповідає префабу в'юхи що має мати IVIew скрипта; - UILayerIndex використовується для інсталяції юай в відповідний предефайнд лейер. BaseView клас реалізує IView, що має лише OnDestroyed івент (для видалення в'ю з юай лейер хендлера та диспоузом вьюМоделі, а також можливістю відписатись від івентів моделі в місці створення тієї моделі та відповідно запиту на створення віджета), бо юай менеджер лише видаляє вью, не хендлить видалення ресурсів. Також є методи Create, Activate, Deactivate, Destroy, де в метод створення передається IBinder, що ми створюємо в фабриці одразу після створення в'юхи та в'юМоделі; а методи активації мають параметр bool animated де вже BaseView реалізує анімацію через DOTween Sequence, ну а сама зміна стану також проходить через ui manager або через дата байдінг, тобто можна додати байдінг атрибут для методу з параметром bool, але якщо казати за поля в'юхи, то тут звісно доведеться робити кастомні байндери чи інакше викручуватись, чи робити mvp. З моєю ініціалізацією юая по суті можна було б закидати референс на в'юху у вьюМодель, по суті зробивши її презентером тобто BaseBindablePresenter<TView, TModel> . Нам-то ніхто не заважає робити гібридний підхід. BaseViewModel<T> : IViewModel where T : class, IModel, new() в свою чергу потрібен, щоб передавати (можна опустити IModel = null) створену в місці запроса модель, кастити її до дженерік типу та власне використовувати в подальшому. За такого підходу абсолютно всі сервіси, команди, дата збережена в моделі як і має бути, при цьому ми не обмежені данними моделі виключно з DI Container, бо додаємо дату ще в місці створення моделі. protected T Model { get; private set; } public void Initialize(IModel model = null) { Model = model as T; } Я міг би ще довго пояснювати, але й так доволі заплутано. Я писав подібну архітектуру 3 довгих дні, використовуючи напрацювання з моєї реалізації MVP, кривої реалізації MVC з роботи, однак там непоганий менеджер юаю був, проте без ресурс менеджменту через addressables що власне я й додав та використав майже все з вашої реалізації MVVM, просто розширив, змінив підхід створення та прокидання залежностей. Я думаю, що можна ще закешувати всі можливі комбінації байндінгов при запуску гри, аби на рантаймі не робити ті важкі запити на рефлексію, бо ж конфіг віджетів з усіма комбінаціями view-viewModel в мене є, просто тоді треба в розширити це якимось OnValidate(), бо ж view репрезентована не префабом, а ассет референсом.

    • @Temasdin
      @Temasdin 2 месяца назад

      Мені просто не подобається MVP тим, що багато повторень коду, а в мене реалізація попри все була дуже оптимізована через атрибути, команди, в'юЛейаут хендлер що кешував усі елементи по типу IButton, ISlider й мены просто треба було передавати в них команди, що створені в конструкторі презентера. Там чимало своїх плюсів в тому MVP, але коли UI стає все більше, а особливо дуже схожого (різні види інвентарю в лобі, окремо в грі), то копіпаст коду стає неймовірно багато й коли доводиться рефакторити, то дуже легко десь забути виправити, чи просто рутинна скучна задача докучає)

    • @Temasdin
      @Temasdin 2 месяца назад

      Мені сподобався ваш урок. Ваша реалізація легка для розуміння, можна розширяти до певного моменту, не перевантажений й при цьому справжня концепція MVVM. Пощастило знайти цей урок.

    • @Temasdin
      @Temasdin 2 месяца назад

      Отакий метод створення в'ю через фабрику зенджекта. Шкода вона не приймає дженерік параметри, а свою фабрику мені лінь писати було. public async UniTask<IView> Create(ViewLibraryData data, IModel mode = null) { var prefab = await _assetProvider.Load<GameObject>(data.ViewPrefabReference); var view = _container.InstantiatePrefabForComponent<IView>(prefab); var viewModel = _container.Instantiate(data.ViewModelTypeReference.GetType()) as IViewModel; if(model != null) _container.Inject(model); var binder = BinderFactory.CreateComposite(view, viewModel); view.Create(binder); viewModel!.Initialize(model); return view; } Binder потрібен на в'юсі щоб перемикати Bind/Unbind напочатку Activate/Deactivate, бо там же може бути анімація (зміна альфи, присутнє чи відсутнє gameobject.SetActive(state)) тому це дає більший контроль аніж колбеки OnEnable/OnDisable.

    • @Temasdin
      @Temasdin 2 месяца назад

      Після всього цього цікаво подивитись на ваші відео по Zenject. Бо я ніби чимало по ньому знаю й використовую, навіть мав досвід з SingalBus, з його плюсами та мінусами, але от цікаво як багато я ще не знаю, що можна у вас навчитись. :3 Я, до речі, теж фанбой ECS, конкретно навіть Unity ECS попри все ще наявні недоліки як от робота з UI та Animations, проте з першим я знайшов підхід через шейрид ансейф моделі та Zenject's ITickable на самих моделях, щоб лишатись в unmanaged memory контексті, а з другим - пекедж ECS Animation Baker з запіканням анімацій в текстури (але натомість для регдолу потрібне інше рішення, наприклад, Ruhanka, що теж перформить сильно).

  • @max_monax
    @max_monax 2 месяца назад

    отличный урок, хотелось бы чтобы автор продолжал и приводил примеры ECS для самых различных случаев в GameDev-е. толковой инфы с подробным разложением от и до, от 0 до реализации очень мало в инете. + мне очень нравится гибридный подход автора к реализации ECS.

  • @sagrgywejhxcvx
    @sagrgywejhxcvx 2 месяца назад

    просто добавил новый класс который назвал binder вместо vm

  • @Yury93-b8n
    @Yury93-b8n 2 месяца назад

    Вообще топ, даже смотреть не обязательно, можно просто фоном слушать и всё понятно будет) Хорошо ведёте👍

  • @Yury93-b8n
    @Yury93-b8n 2 месяца назад

    Ещё есть стратегия "костыль без паттернов и антипаттернов". Делать всё на монобехах и прокидывать для каждого объекта требуемые ссылки на публичные поля😁😁😁😁

    • @Yury93-b8n
      @Yury93-b8n 2 месяца назад

      Толкь сейчас посмотрел) Вы это упоминали) Извиняюсь)

  • @toxic_champ
    @toxic_champ 2 месяца назад

    18:45 что такое "стэн-контекст" и что за его "разворачивание"?

    • @МихаилФилиппов-э6ч
      @МихаилФилиппов-э6ч Месяц назад

      Изучите основы zenject. Это оттуда. Контекст сцены это это тот компонент в который он добавлял свои моно инсталлеры. Контекст сцены говорит о том, что эти инсталлеры будут работать в пределах этой конкретной сйены. Разворачивание тут это установка, запуск.

  • @KadykovDenis
    @KadykovDenis 2 месяца назад

    Разве Юнити не делалась для того что бы геймдизанеры и художники могли работать параллельно с программистами? Если Геймдиз подвигал и что то сломалось, то значит просто плохой прогер. Разве нет?

  • @KadykovDenis
    @KadykovDenis 2 месяца назад

    59 минута, объявляем параметр МувЕнейбл для того что бы трупы не ходили - очень плохо. На самом деле должна быть не переменная (или метод), а для персонажей написана нормальная МАШИНА СОСТОЯНИЙ. Сначала можем перемещаться не можем, потом можем стрелять или не можем стрелять, потом можем прыгать или не можем и так до бесконечности. С таким подходом потом точно что то забудем и трупы будут колдовать на себя лечение. Я уже не говорю о читаемости и избыточности кода. Код в Update() тоже вещь сомнительная. Удивительно слушать рассуждения о такой хрени как Зенджект и архитектурах, а потом видеть такое в простом примере. Кстати да, будь вы лидом, собеседование я бы у вас точно не прошёл. В нашем сумасшедшем доме под названием "геймдев" кто первый надел халат тот и доктор.

  • @КапитанТимо-и3я
    @КапитанТимо-и3я 2 месяца назад

    Когда следующий набор? Чем этот курс от otus отличается?

  • @andreirjabokon
    @andreirjabokon 2 месяца назад

    Вопрос от юнити новичка: как быть с компиляцией MonoViewBinder'a в билд? тип MonoScript переменных viewType и viewModelType используется только в эдиторе, в билд не компилируется..

  • @Абелис
    @Абелис 2 месяца назад

    Привет Игорь, гайды просто хай-левел. Смотрю пока только 3 вебинар. Вопрос почему не используешь ввод через InputSystem, а придерживаешься старых добрых if-ов? Я только учусь и прошники говорят, что input больше подходит для построения серьезной архитектуры

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

    59:34 А если я хочу например получать префаб не через SerializeFiled, а из своего сервиса, какого-нибудь IAssetProvider? Как быть? И это нормальная практика в целом?

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

    28:34 Т.е. этот ProductPopup у вас заранее создан и помещен на сцену? А хорошая ли это практика? Или лучше создавать его динамически из префаба при нажатии на товар?

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

    отвратительно, блок Выводы должен стоять самым первым в видео. Автор час! все рассказывает, а потом такой: "Ой, а с анимированным UI не рабоатет, и вообще это все сложно и крайне избыточно для всех проектов, кроме очень больших с упором на UI, и мой фреймворк них*я не дописан, и вообще х*й вы свой напишите без большого опыта в этом". Но первый блок "Отличия MVVM от MVP" хорош: четко, понятно, со схемками.

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

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

  • @Arrrr-gj6kk
    @Arrrr-gj6kk 3 месяца назад

    Что это за редактор когда?

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

    Благодарю за ответы. Счастья!

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

    Cool

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

    Классная подача. У меня возник вопрос, если в монобеховском классе мы создаем чистый логический C# класс и при переходе на другую сцену (т.е. при уничтожении монобеха, в котором был создан класс) сборщик мусора уничтожит логический класс или же он и дальше будет висеть в памяти?

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

      Логический класс будет висеть в памяти, пока кол-во ссылок на него будет больше нуля)

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

    Круто, спасибо

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

    Короче если сообразительный джун понимает разделение на M+V, то хоть как их соединит - получится один из MVx паттернов. Может в ведьмином котле сварится passive View, а может MVC, а может MVVM

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

      Фишка в том, что каждый паттерн решает свою проблему, и на рандом пикать - может получиться выстрел себе в ногу 😅

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

    45:40 спасибо, отписался

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

    41:10 фикс багов наоборот интереснее смотреть, не волнуйся

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

    Если бы ты попал на необитаемый остров, и можно было бы взять только 1 вещь. Ты бы взял SOLID или MVP?

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

    Ждём MVVMPCViperHTTPGRASPVC, желательно сразу атомарную версию. Иначе не синьор

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

    Благодарю за код!

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

    Репозиторий не обновлялся несколько лет. Стоит ли сейчас на нём делать новый проект, который будет поддерживаться более года? Есть ли варианты DI получше?

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

      Здравствуйте, Zenject стоит в любом случае знать, так как его используют во многих компаниях, а из нового рекомендую ознакомиться с атомарным фреймворком: github.com/StarKRE22/Atomic

    • @kellerkey
      @kellerkey 2 месяца назад

      а зачем его обновлять если всё и так работает хорошо

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

    46:50 Это не MVP а Passive View В MVP и View и Presenter знают друг о друге ты cам себе противоречишь в разных видосах

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

      MVP-Passive View является разновидностью MVP)

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

      @@CodeCraftUnityEdition и что? Presentation Model тоже является разновидностью MVP. Разверни стрелки тогда у P и V и также оставь MVP в названии. По такой логике ты также сможешь сказать что это разновидность. Ты обобщил название слайда а схема от одной из разновидностей.

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

      @@GameManagerController Спасибо большое за уточнение. Не заметил, что стрелочки между View и Presenter не должны быть пунктирные. 28 слайд в презентации поправил)

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

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

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

    Спасибо за серию стримов, только благодаря вам смог нормально вникнуть и интегрировать Фьюжен в проект.

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

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

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

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

    • @ЯрославЯночкин
      @ЯрославЯночкин 3 месяца назад

      @@MrThrash90 TDD - это про то, что ты сначала пишешь тест, а уже потом под этот тест - код. Вряд ли ИИ такое может

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

      @il35215 Скажите, пожалуйста, вы использовали TDD у себя в разработке? :)

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

      явно большими проектами не занимался

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

    Были б деньги, подписался бы не раздумывая! :D Но видимо сначала придется выпустить проект на юнити, заработать на нем, чтоб хватило денег записаться...

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

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

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

      @@CodeCraftUnityEdition Благодарю за ответ)) Звучит гибко :)) +вам в карму!

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

    С разбором кода это жестоко!!!! Видно что тебе небезразлично на курс. Удачи, сил и красоты.

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

    Я надеюсь будет лучше чем у Романа Сакутина

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

      А кто это?)

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

      Так если прям с нуля, то лучше вначале к Сакутину) А потом уже сюда

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

    Энвилоуп тема раскрыта

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

    Выглядит очень привлекательно😊

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

    Видео чёткое, описание блоков курса хорошее. Подскажи, в Otus ты продолжишь преподавать?

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

    Берём например Лео ECS, за неделю полностью понимаем как он работает. Убеждаемся что проще и быстрее уже не придумать, идем пилить год свою игру. По ходу понимаем что комьюнити сделало 100500 полезных фичей типа инспектора компонентов, систем и т.п. И только уже после этого пишем свой ЕЦС. А так да, адаптер вокруг массивов данных, причём без возможности крутить в отдельных потоках из за ссылочных типов в компонентах.

  • @DekovirDekovir-is7wd
    @DekovirDekovir-is7wd 4 месяца назад

    Спасибо, многое сразу понял о всех этих архитектурах. Жаль в моей компании такие чтуки не приветствуются. А на пэт проекте не охото так много писать. Но хоть буду знать, если на какой другой проект попаду.

  • @DekovirDekovir-is7wd
    @DekovirDekovir-is7wd 4 месяца назад

    А что если нужно посчитать дамаг игрока 1 по игроку 2 учитывая атаку игрока 1 и защиту игрока 2? Я хочу сказать, что когда я делал игру с двумя игроками мне пришлось сперва инжектить дочерние а потом родительские контексты. Потому что нужны были глобальные сервисы имеющие ссылки на сервисы обоих игроков чтобы организовывать их взаимодействие. У вас только стрелки вниз. Может я не понимаю как это сделать? Или у вас получается ecs косвенно ссылается на данные всех игроков?

  • @DekovirDekovir-is7wd
    @DekovirDekovir-is7wd 4 месяца назад

    Проблема Дублирование кода в состояниях - мне кажется эта проблема решается разбиением на две машины состояний. Одна отвечает за то, что юнит делает в данный момент, а вторая за его долгосрочную стратегию. Что по сути у вас и сделано высокоуровневые системы управляют низкоуровневыми

  • @DekovirDekovir-is7wd
    @DekovirDekovir-is7wd 4 месяца назад

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