Шеф Code | Gamedev 👨‍🍳
208 subscribers
206 photos
7 videos
22 links
Download Telegram
Четвертый, финальный кирпич нашей тетрады это Технология. То, что под капотом, и на чем вся эта магия крутится.

💻 Как вы знаете, мы пилим проект на Unity и C#. Выбор движка очевиден из-за моих знаний дотнета. Сама архитектура Deckart получилась очень гибкой благодаря четкому разделению домена и отображения (логики и визуала). Это позволяет нам спокойно крутить механики, не ломая при этом картинку.

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

🚀 Интересно узнать, какая техническая база у вас. Вы в каком движке делаете свои проекты и какими технологиями пользуетесь?

🃏 Пишите в комментарии, на чем кодите! 👇
6🔥3🥰3
Пришло время подвести итоги и посмотреть на игру целиком.

🧩 Этот разбор помог мне собрать все мысли в кучу. В итоге вырисовывается проект, где аддиктивная математика Balatro и пошаговые бои Hearthstone работают на движке Unity, но завернуты не в приевшееся фэнтези, а в густую, мрачную атмосферу славянских сказок в стиле Билибина. Технологии всё это скрепляют, позволяя гибко менять правила игры на ходу.

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

🗳 Ну а теперь ваша очередь оценивать. Как вам в целом? Делитесь честным мнением в комментариях👇

П.С. какое бы имя вы придумали такой игре?
4
Лудомания...

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

📺 Геймдизайнеры ведь тоже стремятся к аддиктивности своих творений. То же понятие «потока» как раз говорит про то, как сделать игрока полностью погруженным в процесс. Разорвать связь от мира, перенести его в тело персонажа через стопроцентную иммерсивность игры, чтобы он еще сильнее переживал все, что происходит в ней. Это ли не зависимость, это ли не проблема?

🎰 Но есть грань, где крутая иммерсивность превращается в жесткую аддикцию. Это когда игрока цепляют на крючок не за счет интересного вызова, а через вариативный график наград (привет, ящик Скиннера, если надо, я потом про него подробно расскажу). Ты жмешь кнопку не потому, что тебе интересен сам процесс, а потому что мозг ждет случайного выброса гормонов от выигрыша или редкого дропа.

🃏 Возьмем ту же Balatro. Она балансирует на самой грани. Азарт от того, что твоя сборка сейчас крутанет счетчик это мощнейший крючок. Но разница в том, что в нормальном сингловом декбилдере этот азарт интеллектуальный. Ты радуешься тому, что ты сам додумался и собрал этот работающий движок, а не тому, что тебе просто повезло в рулетке.

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

Есть на додеп?
5🔥1🥰1
Вчера, если следите за видосиками, я сказал, что прекращаю заниматься рандомными механиками в Unity. Все последующие дни марафона я полностью посвящаю игре, её механикам, архитектуре и лору, так что дальше будет что посмотреть.

🚀 Тут я планирую либо углублять какие-то рассказы из видео, либо детально разбирать различные геймдизайнерские приемы и фишки. В общем-то, планы такие. Какое-то время уйдет на стабилизацию процессов создания контента, но это точно лучше, чем просто ковырять абстрактные прототипы и не делать саму игру вовсе.

🎯 Спасибо всем, кто в комментариях и обсуждениях надоумил меня поменять план и сфокусироваться на проекте!

П.С. всякие хохмы продолжаю снимать, надеюсь будут еще от меня бенгеры
7🔥3🥰1
Ух ты ж, ничего себе! Снова проштрафился и пропустил вчерашний день блога. Не дело, будем наверстывать.

🎬 Как поменял формат вечерних видео, так времени на подготовку стало уходить ощутимо больше, и всё остальное просто вылетает из головы. Буду стабилизировать процессы. Ну а сегодня давайте поговорим по коду, а точнее, про один фундаментальный паттерн. Встречайте: State Machine (Конечный автомат) и стейты для разработки игр.

💻 Вообще, в коммерческом бэкенде я почти не встречал, чтобы стейт-машины использовали повсеместно, хотя идейно штука крутая. Возможно, в DDD (Domain-Driven Design) для сложной бизнес-логики это бы где-нибудь очень пригодилось, надо на досуге обмозговать.

Как было бы без паттерна? Наш код превратился бы в бесконечную, нечитаемую простыню из ифов или свитчей:

«Если State == Enum.Idle делай то-то, а если State == Enum.Attack делай другое».

🛠 Идея паттерна кардинально другая: мы даем доменному объекту отдельные состояния и выделяем логику поведения внутрь этих самых классов-состояний. Объект просто делегирует выполнение текущему стейту, а стейты сами знают, когда переключить контекст.

🎮 В Unity и геймдеве в целом это абсолютный маст-хэв:

Персонаж имеет разные состояния (патруль, погоня, атака, смерть), и от них жестко зависит логика его поведения.

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

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

🤖 Коллеги-разработчики, используете стейт-машины в своих проектах (и не только в геймдеве)?
2
Наглядный пример, как это работает в коде Deckart. Так как у нас игра не построена на апдейтах, наши состояния максимально упрощены. Никакой покадровой логики, только вход и выход. У каждого стейта есть всего две точки. Это Enter для отработки логики при входе в фазу и Exit для зачистки хвостов перед переключением.

Вся архитектура разложена на две изолированные стейт-машины, которые управляют игрой на разных уровнях.

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

Локальная машина боя включается изолированно только внутри фазы битвы. Она гоняет внутренний цикл сражения, то есть ждет ход игрока, запускает расчет очков и определяет исход. Как только бой окончен, она возвращает управление глобальной машине.

🔮 Главный плюс такой иерархии в том, что стейт магазина вообще понятия не имеет, как математически считаются очки в бою, а фазе расчета очков плевать, что там происходит на карте. Логика жестко разделена, каши в коде нет, а новые экраны или фазы боя добавляются созданием одного изолированного класса.

На скринах показал, как это реализовано в проекте.

Сложно?
🤯21
🌓 Поздравьте меня, вроде я восстановил график и сегодня не доделываю видео в ночи, а уже полностью с ним справился. Процессы потихоньку стабилизируются.

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

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

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

📺 А у вас бывает такое, что открываете свой код двухмесячной давности и удивляетесь объему?
🎉71
Почему это игнорируют?

Вчера, смотря на объём написанного кода, я задумался вот о чём. Нас (разработчиков) с самого начала учат что надо писать чисто и красиво. Но что это вообще значит на практике? Почему один код считается чистым, а другой — лютым говном? 😨

Если вспомнить, как этот феномен объясняют в бизнесе, то всё сводится к одной простой истине. Бизнес меняется и надо быть к этому готовым. Именно поэтому в энтерпрайзе, где сервисы развиваются десятилетиями, нас учат проектировать через архитектуру, использовать паттерны и соблюдать SOLID. Главный критерий чистоты кода здесь это его способность адаптироваться к изменениям. Чем легче и безболезненнее кодовая база принимает новые фичи, тем она чище. Прямая корреляция.

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

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

🤔 По логике, именно в геймдеве нужно кричать изо всех утюгов о том, как важно с самого начала писать адаптивный код и подкладывать соломку на случай резких изменений курса. Но почему-то большинство на это забивает?

🤨 Приходилось ли вам хоронить проекты из-за того, что код просто не вывез внезапных изменений в геймдизайне?
Please open Telegram to view this post
VIEW IN TELEGRAM
2🤨1
Наткнулся тут на видео старых матчей Хартстоуна, как раз времен Ктуна и Йогг-Сарона. Кто помнит эту эпоху рандома?

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

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

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

📺 А вы обращали внимание на такие рассинхроны логики и анимаций в карточных играх?
2
Чем больше я рассказываю, тем больше подмечаю косяков. Пока собираешь контент и смотришь на проект со стороны, в бэклоге сам собой накопился список задач на месяцы вперед.

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

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

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

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

Суть - вы делите пространство на три колонки: «Нужно сделать», «В работе» и «Готово». Каждая задача это отдельная карточка. Появилась идея или баг, кидаете в первую колонку. Сели за работу, перетащили карточку в статус «В работе». Закончили, передвинули в «Готово». Всё. Вы наглядно видите весь масштаб катастрофы, понимаете, над чем сидите прямо сейчас, и не держите этот мусор в голове.

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

Там открылся супер старый борд, 2020 год, помните еще то время? А на доске висят детальные планы, как я буду делать свой блог и писать в нем посты, вот прямо как делаю сейчас. Емае, я помнил, что задумывал это давно, но чтобы настолько! Шесть лет прошло, и вот только сейчас пошло-поехало.

Короче какой вывод, если очень сильно хотеть, то задуманное точно сбудется, рано или поздно.

П.С. игру я тоже очень хочу сделать, надеюсь не придется ждать 6 лет 😏
6🔥1
Летал в симуляторе, и поймал себя на мысли, что игры тут, по сути, нет.

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

В геймдизайне есть такая штука - мастерство. Это когда игра цепляет тебя не фантиками, а твоим собственным ростом.

Большинство современных игр нас просто обманывают. Подсовывают суррогат, циферки урона растут, пушка начинает светиться фиолетовым, перс качается. Но ты-то понимаешь, что скилловее ты не стал.

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

И когда ты после сотни падений наконец чисто пролетаешь узкую щель на скорости, игра не выдает тебе ачивку. Твоя награда вот это тихое внутреннее Я МОГУ.

Короче, записал под это дело небольшое видео. Залетайте глянуть.

https://www.instagram.com/reel/DZEyD8-MS1p/?igsh=cHM0eWh0cjNmeTM2
🔥41
Вчера люто поработал, почти доделал боёвку.

+1851
-2122

Добавил понятие поведения через абстракцию, как в книжках. Теперь у каждого юнита свой SkirmishBehavior, а сама стычка крутится в отдельном SkirmishCombat, а не в раздутом стейте.

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

События, как и раньше, выплевываются по шагам, а UI на них только смотрит и отображает. Осталось допилить полировку и закрыть крайние кейсы.
6