3 ОШИБКИ В АРХИТЕКТУРЕ ТВОЕЙ ИГРЫ! C# и Unity! Советы для улучшения архитектуры

  Рет қаралды 10,055

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

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

Күн бұрын

Пікірлер: 88
@-it394
@-it394 Ай бұрын
⚡⚡⚡ Полезные ссылки ⚡⚡⚡ 🔎 yakovlevgamedev.ru/unity_adventure - обучение разработке игр с нуля до создания полноценного проекта 🔎 t.me/yakovlev_advanced_bot - бот для регистрации на вебинар (подарок тут же)
@TWITexe
@TWITexe 12 күн бұрын
признаюсь честно, я удивлен качеством информации и подачей. Это один из лучших каналов по Unity, продолжай в том же духе!
@STIGRADOR
@STIGRADOR Ай бұрын
Занимаюсь разработкой около четырех лет. Могу смело заявить, что автор лучший из всех на ютубе в своем направлении. Нет никаких глупостей и базу дает очень правильно и верно. Лавка Разработчика и Яковлев Илья - это то, что вам нужно для понимания разработки на юнити. Илья, продолжай плиз в том же духе! Даже я иногда нахожу очень полезные вещи в твоих видосах!
@Tera-h7e
@Tera-h7e Ай бұрын
Согласен, но вот с лавкой разработчика не очень, мне не нравится его стиль кода и примеры. Также он плохо обучает. Вот Илья даёт базу и одновременно реальные примеры, рассказывает как что работает в коде на порядок выше
@lev431
@lev431 Ай бұрын
Лавка разработчика больше немного для продвинутых, чтоб закрепить какой то материал по новой теме и может узнать какие то подробности где ты не узнал в прошлом источнике информации​@@Tera-h7e
@STIGRADOR
@STIGRADOR Ай бұрын
​​@@Tera-h7e В части лавки разработчика поясню - там канал, который направлен уже на продвинутых типов. Предполагается, что зритель уже хорошенько прошарен и понимает базовые принципы основных паттернов и архитектуры. В пояснение к стилистики добавлю - я так понимаю ты смотрел старые видосы, где он постоянно "this" лепил. Мы его за это зисменом прозвали с ребятами знакомыми, но исключительно любя :)
@Tera-h7e
@Tera-h7e Ай бұрын
@@STIGRADOR это понятно, но насчёт "продвинутых" это неверно. Какие продвинутые? Он базовую базу рассказывает, слишком поверхностно да и к тому же нормально объяснить не может, примеры плохие показывает. Я сразу понял что либо он сам не знает темы либо обучать не умеет. Например тема про евенты, он рассказал как они вызываются и всё, а зачем это нужно и как работает это под капотом - нет. Не рассказал про делегаты и взаимодействие с ними, например, GetInvList, DynamicInvoke, что такое просто Invoke, а просто сказать: "Ну типа так вызывается событие и тд". А как же про то, как подписаться? Нужна ссылка на объект, но это нарушает 1 и 5 принципы SOLID, другой класс должен отвечать только за свою работу и не знать о других объектах, а так же твой класс должен зависеть от абстракции (5 принцип), т.е. прокинуть в него зависимость в конструктор или в сеттер, например, сделать интерфейс только с событием и текущем значением IHealthNotifier, в котором будет описано событие изменения здоровья и текущее здоровье с помощью свойства гет, и с помощью этого интерфейса мы можем работать с любым объектом, который реализует его для того, чтобы не нарушать эти принципы SOLID. Я бы ещё написал много всего об этом и о другом, ну мне кажется что итак много.
@myownchannellol
@myownchannellol Ай бұрын
Занимаюсь разработкой 8 лет. Лавка Разработчика - очень плохой пример. Сам не понимает тот материал, который пытается на аудиторию раскатать.
@darkcitizen
@darkcitizen Ай бұрын
чувак, ты очень крут, очень приятно тебя слушать и можно много полезного узнать. как правило слушаю только англоязычных блогеров, но ты заставляешь сделать исключение) спасибо за труд!
@ilteeeee
@ilteeeee Ай бұрын
этому каналу точно есть место в зале легендарных каналов по юнити
@vomiann6770
@vomiann6770 Ай бұрын
Жду новое видео на тему АСИНХРОННОСЬ В UNITY!
@ivan-_-8577
@ivan-_-8577 4 күн бұрын
Кажется что твоя мечта сбылась
@giogall6229
@giogall6229 Ай бұрын
Очень крутой выпуск! Всё понятно, и, главное, приятно слушать.
@VISHNEVSKY69
@VISHNEVSKY69 Ай бұрын
Бро, теперь жду видосик про архитектуру игр для поддержки моддинга
@AntonGorbachevDev
@AntonGorbachevDev Ай бұрын
Плюсую, очень интересная тема
@divizitin4462
@divizitin4462 Ай бұрын
Отличное видео бро, как и предыдущее и все предыдущие. Жду следующие.
@Екатерина-о5л3ч
@Екатерина-о5л3ч 24 күн бұрын
Советы реально классные, ждем еще :)
@Slayser_so2
@Slayser_so2 Ай бұрын
Здравствуйте Илья, объяните в следующем уроке пожалуйста, как уменьшить размер билда, я конечно смотрел прошлые две части но так и не помогло, у меня игра под мобилку
@kruservinsar1075
@kruservinsar1075 Ай бұрын
Попробуй все текстуры под dxt формат сделать, у меня так 35 мб при билде убралось
@bonbad612
@bonbad612 Ай бұрын
Глянь статью на хабре от Дядиченко, должна помочь
@pressF-d9j
@pressF-d9j 25 күн бұрын
Смотрю на это и думаю как же хорошо что я начинал с js. Взял оболочку от tauri юзаещь библиотеки thre js для реакта и кайфуешь - теперь проблема только в нужных 3д моделях - подучив блендер могу делать только примитивную геометрию - стены, полы, двери, щас смотрю видосы китайцев как они делают 3д модели - это прям искуство
@evgeniy_a7363
@evgeniy_a7363 Ай бұрын
С первым советом я тоже не так давно столкнулся. Долго пытался синхронизировать потоки - но в итоге пришел к тому же что и в этом совете. Переделал все на линейную обработку данных как делал когда еще писал на чистом сишнике - и все заработало как надо. Потоки стараюсь использовать по минимуму. Теперь у меня монстры ровно шлепают друг за другом и стоят ждут если клетка занята (топают по клеткам, на которых не может быть более одного персонажа и были моменты когда два персонажа сливались в один из-за того что движение было навешано отдельно в скриптах для каждого персонажа), файерболы летят и уничтожаются об воду... В общем понемногу привыкаю к специфике Юнити.
@andrewalexart
@andrewalexart Ай бұрын
Спасибо, очень полезное видео! Побольше таких) Единственное, что хотелось бы, это не нарезка уже готовых сцен, а создание проекта (такого же маленького) с нуля, где ты все это дело пишешь сам. Восприниматься будет лучше, думаю, а то новичкам может быть слишком быстро
@_gonga
@_gonga Ай бұрын
Ждем гайдики по облочкам :D
@ivan-_-8577
@ivan-_-8577 4 күн бұрын
Привет от анрильщика-крестовика который пробует своими кривыми лапками нормальный движок. Отличный канал.
@stingerfingerr1599
@stingerfingerr1599 Ай бұрын
Отличное видео бро, как и все остальные на твоем канале
@deniskarter7088
@deniskarter7088 Ай бұрын
Всё отлично! Благодарю за полезное видео :) Пока только переживаю за цену курса :D
@Veles017
@Veles017 Ай бұрын
Отличные рекомендации!
@АнатолийКарпенко-п9ъ
@АнатолийКарпенко-п9ъ Ай бұрын
просто оставлю это тут для продвижения видео)
@SleepyRaccoon-k
@SleepyRaccoon-k Ай бұрын
Спасибо за видео! =)
@nuclear-decline
@nuclear-decline Ай бұрын
Добрый день. Спасибо за видео. Очень помогла идея с Bootstrap. Возник вопрос. У меня есть машина состояний, которая управляет состоянием игры (загрузка игры, главное меню, сама игра, окончание игры и т. п). Каждое состояние выполняет какие-либо действия с обьектами на сцене, например включает нужные панельки. Стейт не наследуется от монобеха и не висит на обьекте на сцене. Как в таком случае прокинуть в стейт нужные ссылки? Только через FindObjectsByType?
@ДмитрийМатюшенко-т2э
@ДмитрийМатюшенко-т2э 5 күн бұрын
Есть видео на эту тему на канале Code Craft: Unity Edition, называется "Игровой цикл на Zenject", так что если с Zenject'ом дружишь, то можешь оттуда идею взять
@Filimon_enc
@Filimon_enc Ай бұрын
надеюсь в будущем будет по Unity Dots урок)
@-it394
@-it394 Ай бұрын
С dots не работал, но по leoEcs или entitas вполне возможно контент подъедет в следующем году)
@urod7149
@urod7149 Ай бұрын
Хочу еще одно такое видео (только с другими ошибками)
@TheFenix717
@TheFenix717 Ай бұрын
Спасибо за урок! 8:04 на 12 строке зачем нужен return??
@ВикторВорогушин-з4й
@ВикторВорогушин-з4й Ай бұрын
В данном случае скорее просто признак хорошего кода А в других случаях чтобы при вызове извне получать сразу игрока или что-то что создалось
@bad_tutor_Nik
@bad_tutor_Nik Ай бұрын
Привет! Этот метод должен возвращать нам MainCharacter, поэтому мы его и возвращаем :)
@Olavr_UA
@Olavr_UA Ай бұрын
Метод возвращает Героя, который заспавнился, то есть, можна из другого скрипта дать значение героя который был заспавнен только что, по факту это метод который отсылает на метод спавна но при этом в нем можно добавить некие стартовые методы.
@mr.nobody4152
@mr.nobody4152 Ай бұрын
Так автор же создаёт врагов вокруг игрока и вообще передаёт ссылку на трансформ, чтобы они перемещались к игроку.
@tomasgonsales483
@tomasgonsales483 Ай бұрын
Вовремя ролик я глянул) Я токо кумекал как бы по уму отвязать настройки уровня от сущностей. Спасибо)
@Fessoid
@Fessoid Ай бұрын
Создаю игру с заделом на модостроение игроками. Какую архитектуру посоветуешь? Видел такую: в папке Mods всё, что лежит - заменяет намтройки оригинала. Помню в Warhammer 40k таким образом заменил 1 lua-файл и хаоситы начали жечь фиолетовым огнём.
@serafimr.3648
@serafimr.3648 Ай бұрын
А для более крупных проектов, как используется bootstrap? Создаётся bootstrap с bootstrap'ами?
@-it394
@-it394 Ай бұрын
В целом что-то в таком духе. Суть остается та же, что надо контролировать как старт всего приложения, так и каждой отдельной сцены/контекста
@Tera-h7e
@Tera-h7e Ай бұрын
​@@-it394Да, по сути та же EntryPoint
@tortik22
@tortik22 Ай бұрын
А есть видео по работе с облаком или адресаблами чтобы хранить там хотябы те же конфиги?
@-it394
@-it394 Ай бұрын
В планах на следующий год:)
@tortik22
@tortik22 Ай бұрын
​@@-it394 у адресаблов есть баг или фича, что при работе с теми же самыми скриптбл объектами, что они создают разные копии этих so :) Допустим если записать чето в скриптбл на сцене которая в билде и попробовать прочитать этот скриптбл в адресбл сцене, то там не будет этих изменений :) Возможно не так выразился, но думаю понятно, что нет обратной совместимости или что-то типа того
@-it394
@-it394 Ай бұрын
@@tortik22 С таким не сталкивался, т.к. настройки какие-то никогда в сценах не держали (мне кажется в целом таких ситуаций не должно быть). Т.е. отдельно настройки - отдельно сцены
@tortik22
@tortik22 Ай бұрын
​@@-it394 Например в стартовой сцене авторизуется игрок и какие-то данные профиля записывались в so. Потом в игре оттуда брались при необходимости в разных сценах. В итоге где-то использовали статику где то so. В целом адресеблы глючная технология. При билде могут тупо выдаваться ошибки и пакеты не грузятся, при повторном билде ничего не меняя все работает хорошо. Еще несколько проблем было сейчас и не вспомнить
@Maymazl
@Maymazl 20 күн бұрын
не лучше было бы использовать "addressables" для загрузки сцен !? Ведь в показанном подходе она и так всё хранить в оперативке.
@hpr895
@hpr895 Ай бұрын
01:11 - диздок Алайфа 2.0
@nathankoteev6355
@nathankoteev6355 29 күн бұрын
Никто не понял отсылки
@arturkadirov9280
@arturkadirov9280 21 күн бұрын
Делаю игру в Годо. Но смотрю Яковлева, потому что много базы. В Годо пока базированных блогеров мало.
@ДмитрийМатюшенко-т2э
@ДмитрийМатюшенко-т2э Ай бұрын
Не очень понятно в 3 совете как разбить конфиг, то есть префаб и позицию спавна раздельно? А как тогда связать определенный префаб с определенными данными, например, есть куча файликов с разными конфигами от ScriptableObject, и как тогда к каждому из них подвязать свой префаб?
@-it394
@-it394 Ай бұрын
В общем случае у тебя позиция спавна персонажа не связана с самим персонажем. Например игрок может выбирать какого персонажа он хочет выбрать перед стартом игры. Точка спавна на уровне от этого не поменяется, а вот герой будет меняться. Ну т.е. точка спавна скорее всего будет частью конфига уровня какого-то, а вот персонаж к уровню не привязан
@_meyko_
@_meyko_ Ай бұрын
Очень круто
@Mister_14438
@Mister_14438 Ай бұрын
А можно такое видео,но про архитектуру в годот?
@fear_ctpax
@fear_ctpax Ай бұрын
Это больше канал по Unity, но там на что на Gdscript, что на C# работают идентичные правила. Например я делаю так: сделай сцену "GameRoot, в которую вложи Bootstrap (должен быть выше всех, чтобы запустилс первым), что запускает менеджер состояния игры (пауза, в игре, загрузка, главное меню итд). Он в свою очередь использует разные отдельные сервисы (например сервис сохранения, спавна уровня). Сервисы получает через сервис-локатор. Причём ничего из вышеперечисленного, кроме BootstrapА не наследовать от (Node/MonoBehavour). Это один из вариантов, он спокойно применим к годо, хотя его я узнал из курса по Unity.
@-it394
@-it394 Ай бұрын
То, что я тут рассказываю - общий подход к созданию игровых проектов. Поэтому все эти советы работают независимо от движка - различаются лишь детали реализации
@alfarabius
@alfarabius Ай бұрын
Зачем нам PlayerSpawner, а не Player на сцене? Если для респавна игрока, то все равно всем врагам нужно прописывать логику, что делать когда Player исчез со сцены. А если у них есть логика действий на отсутствие, появление и присутствие Player, то порядок инициализации не будет вызывать ошибок.
@tanksdefense
@tanksdefense Ай бұрын
Вообще говоря префабы по типу врагов в идеале должны хорошо себя вести в вакууме, враги не должны зависеть от игрока. Я думаю спавнер игрока тут просто чтобы донести материал про контроль порядка выполнения
@oneprogofficial
@oneprogofficial Ай бұрын
Для мультиплеера, например
@-it394
@-it394 Ай бұрын
Тут у нас логика такова, что заспавнится должны вокруг игрока враги. Поэтому как там враги изнутри устроены - неважно. Также, если мы игрока жёстко поместим на сцене, то это нас лишит возможности гибкой настройки уровня, подмены персонажа на какого-нибудь другого и тп
@alfarabius
@alfarabius Ай бұрын
@@tanksdefense так буквально, если мы врагу пропишем логику на отсутствие игрока, то он отлично будет себя чувствовать в вакууме и порядок появления будет неважен.
@argotroll8811
@argotroll8811 Ай бұрын
Я конечно все понимаю, но делать пример где ты выносишь в so точку спауна персонажа как vector3 и говоришь что это удобно. Это прям ад.
@-it394
@-it394 Ай бұрын
ну камон)) Ты же не хочешь точку спавна как трансформ хранить? Просто как это удобно настраивать в конфигах другой вопрос. Либо пишешь тулзу, чтобы подтягивать со сцены нужные данные, либо вообще тебе эти данные будут приходить json'ом с сервера (и про какой вообще трансформ речь идет тогда?). Просто в таком случае можно докопаться до того, что префабы лежат прямо в конфиге (что в целом может пол проекта за собой потащить) - их тоже лучше отдельно подгружать по ключам. Тут основной посыл был в том, что надо отделять настройки необходимые для объектов (опять же не всегда - я это тоже упомянул), что дает больше гибкости в плане менеджмента. Просто в 15 минут всего не уместишь
@argotroll8811
@argotroll8811 Ай бұрын
@-it394 а нахрена ее хранить где-то кроме сцены? Спавнеры всю жизнь на сцене расставляли их никто в здравом уме не будет переносить координатами. Про помыл уж более реалистичными были бы параметры персонажа. С ними все понятно и как их в таблицы на облоко кидать и как гейм дизайнерам не лазить по префабам. Но точку спавна они 1 хрен будут руками на сцене двигать и это норма.
@Tera-h7e
@Tera-h7e Ай бұрын
​@@argotroll8811отвечу на твой вопрос. Монобехи - это зло, точка.
@belxsi
@belxsi Ай бұрын
Ну база че
@Сэр-Коффе
@Сэр-Коффе 13 күн бұрын
ни о чем, 2 совет по сути для разработки большого проекта, в это видео заходят кубики 1 совет все и так знают, рассказал бы лучше и больше про ассинхронщину, ООП ипро сущности
@krivodeling7925
@krivodeling7925 Ай бұрын
+++
@denisshevchenko7397
@denisshevchenko7397 Ай бұрын
Ошибки 1 - Использовать Zenject и прочее дерьмо мамонта 2 - Перебор и использованием интерфейсов, вместо DamageHandler использовать IDamagable и т.д 3 - Сильная связанность. Пытайтесь делать большие системы как можно более независимыми и модульными, идеально когда систему пришите отдельно и потом просто внедряете ее 4- Перегибать палку не стоит, и найти компромисс между качеством и скоростью разработки
@volodyaDikiy
@volodyaDikiy Ай бұрын
Молодец, а теперь поясни почему 1 и 2 пункт являются ошибками
@yedil-sama5851
@yedil-sama5851 Ай бұрын
@@volodyaDikiy для новичков, она, наверное, имеет введу.
@имяможноменять
@имяможноменять Ай бұрын
​@@volodyaDikiy зенжект/экстенжект тянет вместе с di контейнером посторонний функционал (ивент бас, насколько я помню), что порождает излишнюю зависимость от зенжекта для проекта; потворствует дурным практикам (например, ZenAutoInjecter) и в целом раздутый. Если нужен di в юнити, то уж лучше будет взять более быстрый и минималистичный vcontainer, с которым, тоже при особом желании можно будет выстрелить себе в ногу, но это будет уже немного сложнее.
@heavyviolence9280
@heavyviolence9280 Ай бұрын
@@volodyaDikiy Zenject старый, медленный и не обновляется. Лучше VContainer. Он быстрее на порядок, обновления выходят регулярно, да и просто структура API там приятнее как по мне.
@denisshevchenko7397
@denisshevchenko7397 Ай бұрын
@@volodyaDikiy 1) - мода на Zenject прошла, он слишком "перегруженный" и старый, его функционал не используют на полную(DI можно самому реализовать или использовать уже готовые маленькие решения). Если в вакансии он есть, значит это древнущий легаси проект 2) Если у тебя автоатака и к примеру урон наносится всем врагам в радиусе с IDamagable, если враг уничтожен IDamagable будет все равно находится в списке и тебе нужно либо маппинг к какому то монобеху делать(условно есть Enemy скрипт), либо вводить bool в интерфейс, что бы проверять должен ли он быть на сцене либо нет и потом все это вручную проверять и очищать , и еще ест кучка проблем которая может возникнуть. IDamagable это как раз самый яркий пример, когда интерфейс не к месту использован
@alexsklyarov6792
@alexsklyarov6792 Ай бұрын
Будем честными, советы не совсем серьёзные... но если брать новичка который не в курсе, и пороху не видал, это очень хороший совет. Для начала, и в хода в тему, стоит использовать, дальше по ситуации... тут пророков нет...
Beat Ronaldo, Win $1,000,000
22:45
MrBeast
Рет қаралды 158 МЛН
黑天使被操控了#short #angel #clown
00:40
Super Beauty team
Рет қаралды 61 МЛН
VIDEO GAME MAP Size Comparison (2024)
5:41
Horizon
Рет қаралды 2,8 МЛН
Unity 6: Что нового?
5:36
VR&AR Dreamer
Рет қаралды 8 М.
Как и почему умирают языки программирования
15:44
Степан Баранцев
Рет қаралды 20 М.
ВСЕ ПРО АСИНХРОННОСЬ В UNITY! Ч.1. От корутин до async/await и UniTask
16:28