Если играл в Custom Hero Survival или Custom Hero Chaos в Доте - вот это.
Custimity. Шестеро в одном матче, около 40 минут. Двоих забирают в дуэль 1v1. Остальные ставят золото , угадывая победителя.
Между боями обычная арена: фармишь волны на своей площадке, набираешь скилы, ненужные меняешь, предметы покупаешь и склеиваешь в кузнице. Потом этим билдом идёшь дальше - в крипов или сам в дуэль.
Двойная порция жратвы, от которой сводит зубы. Для тех, кто не терпит однообразия и маленьких порций
Чистейшая H₂O, нагретая до температуры батареи в дешевой каюте. Без вкуса, запаха и калорий. Идеально подходит для смывания слёз, что появятся у вас при виде меню
Овсяная каша. Единственное дерьмо в этом меню что сварили, а не синтезировали. Настоящий овес. Вкус — как у мокрой газеты, но ты хотя бы знаешь, что жрешь в этот раз
Картофельный концентрат. Смешай с водой, болтай ложкой, пока не получишь кашицу, что можно выдать за ужин. Вкус напоминает давно умерший корнеплод, но калории — это калории, черт возьми.
Синтокаша класа "Б". Это то, что остается в трубах переработчика после того, как с него содрали всё съедобное
Синтокаша с витаминными добавками. Чтобы твои десны не кровоточили, когда ты материшь начальство. И пусть никто не говорит, что Адмиралтейство не беспокоится о здоровье граждан
Синтокаша класса "А" . Разница между классом "А" и "Б" — это всего лишь цвет упаковки и цена. Внутри тот же самый дерьмовый пластик, только чуточку дороже.
В эту кашу добавили немного красного порошка, который должен был имитировать томаты. Почему эта каша на вкус как ржавчина - отдельный вопрос
Синтокаша со сладкими добавками. Искусственная дрянь которую подсластили, чтобы ты не чувствовал как она воняет пластмассой
Короче, вшил загрузочный ролик в игру. Теперь при запуске сначала идёт видео, а потом уже появляется главное меню. Выглядит бодро, прям как в нормальных играх.
Само меню тоже полностью переделал. Цвета, шрифты, общий тон — всё причесал. Теперь глаз радуется, а не как раньше.
Прошёлся по всем кнопкам — всё работает. Настройки сохраняются и сразу меняют картинку в игре. Даже раздел с авторами заценил, приятно видеть себя в титрах.
В следующем посте покажу, что стало с инвентарём, базой знаний, персонажами, доской расследования и картой. Там уже всё работает, остались мелкие правки. Иконки проработаны, выглядят классно.
Видео прикрепил, гляньте как теперь игра запускается.
Накидайте плюсиков, если не жалко — пусть пост повыше заберётся.
Как сделать так, чтобы верхний CanvasLayer 100% лежал поверх всех остальных CanvasLayer? Не знаю почему не могу решить такую простую задачу 🥲 даже видосик об этом записала. Что я упускаю? ))
Садишься через открытую дверь. Заводишь с ключа — стартер схватывает, двигатель оживает, слышно холостые. Снимаешь с ручника, трогаешься. Первая, вторая, третья — звук меняется с ростом оборотов, на переключении передач просадка, как на реальной коробке. Снижаешь скорость — мотор рычит по-другому. Врезался во что-то — есть звук удара. Глушишь — двигатель затихает как положено, не обрывается тупо. Выходишь.
Обходишь машину: открываешь любую дверь, капот, багажник — подходишь к каждой детали отдельно, жмёшь E. Всё по-честному.
По физике: трансмиссия считает момент, передаточные числа, сопротивление воздуха и качение. Обороты привязаны к скорости вращения колёс через текущую передачу, а не крутятся сами по себе. Пока обороты упираются в 6500 — это временно. Позже настрою отсечку ближе к реальным значениям: крутить до красной зоны можно будет, но недолго — движок скажет спасибо и сломается.
Под капотом настоящий мотор, под днищем — подвеска, кардан. Всё на своих местах. У меня в молодости была шестёрка, я не по видео на ютубе это делаю.
Расход топлива работает, зарядка аккумулятора тоже. Дальше — поломки и ремонт. По болтам. Как в гараже. Хардкорнее чем в My Summer Car.
Машина готова. Основа есть. Теперь навесное, мир побольше и можно играть.
Колян ожил. Нет, серьёзно — он теперь не просто капсула с камерой, которая скользит над землей. Он ходит. Бегает. Прыгает. Приседает. Ускоряется. У него есть анимации. И это заняло примерно неделю вечеров, два литра чая и один момент, когда я всерьёз хотел всё переписать на кубах без анимаций вообще.
Но давайте по порядку.
СТРУКТУРА ПЕРСОНАЖА (ИЛИ КАК Я РАЗНЁС ВСЁ ПО КОМПОНЕНТАМ)
Я фронтендер. Я привык, что всё — компоненты. Кнопка, форма, модалка — каждая живёт своей жизнью и не мешает соседу. Поэтому персонажа я собрал так же.
Сцена Player — это CharacterBody3D. Внутри не куча кода в одном файле, а россыпь дочерних нод-компонентов. Каждая отвечает за что-то одно:
Player — сам персонаж, CharacterBody3D. Главный узел, в нём всё.
CollisionShape3D — капсула. Радиус 0.4, высота 1.8. То, чем Колян бьётся об стены.
ModelRoot > CharacterModel — 3D-модель из ассета CasualMale. Временная, потом заменю на свою.
Head — точка на высоте 1.62. К ней привязана камера и всё, что должно быть «на глазах»:
Camera3D — глаза игрока.
InteractRay — луч для взаимодействия с предметами и дверями. Бьёт на 3.2 метра вперёд.
Зачем так дробить? Потому что когда у тебя один скрипт на 600 строк, который управляет всем — ты умрёшь его дебажить. А когда Movement отдельно, Vitals отдельно, Animation отдельно — ты открываешь нужный файл, правишь пять строк и оно работает. Ну или ломается, но ты хотя бы знаешь где копать.
Player.gd при этом — дирижёр. Он только связывает компоненты сигналами и пробрасывает вызовы:
Движение ловит ввод, камера следит за мышью, анимация дёргает скелет, виталы следят за голодом. И никто никому не мешает. Мечта.
АНИМАЦИИ. БОЛЬ. BLEND TREE
Вот тут я остановлюсь подробнее, потому что это был ад.
3D-модель персонажа — из ассета (CasualMale). Скелет есть, анимации есть: idle, walk, run, jump_start, jump_loop, crouch_idle, crouch_walk. Всё это нужно было завести так, чтобы персонаж не дёргался при переходе от ходьбы к бегу, не скользил по земле и не улетал в T-pose при резкой смене состояний.
Панель Animation в Godot. Каждая кость скелета — три дорожки вращения (X, Y, Z). Ключи на дорожках задают позу в конкретный момент времени.
В Godot для этого есть AnimationTree и BlendSpace2D. Работает так: у тебя есть двумерное поле, где по одной оси — скорость (от стояния до бега), по второй — направление (вперёд, вбок). Ты раскидываешь анимации по этому полю, а Godot сам их смешивает. На бумаге — красиво. На деле — я убил три вечера только на то, чтобы персонаж не дёргал ногой при переходе с idle на walk.
Главная проблема: ассетные анимации не знают про твой масштаб, твою скорость движения и твои кривые. Если персонаж скользит (ноги двигаются быстрее, чем тело) — это не баг движка, это ты неправильно настроил скорость корневой ноды. Если он резко встаёт из приседа — ты забыл transition в AnimationNodeStateMachine.
Сейчас всё работает: ходьба, бег, прыжок с фазой взлёта и приземления, приседание с отдельной idle-анимацией. Но осадочек остался. Анимации — это не код. Код ты можешь отдебажить, поставить breakpoint, понять. Анимации — это метод тыка, визуальный подбор и молитва.
ЧТО ДЕЛАЮ ПРЯМО СЕЙЧАС
Руки. Буквально. Персонаж должен уметь:
Открывать дверь машины (анимация руки тянется к ручке).
Поднимать предмет с земли (наклон, рука вниз).
Держать предмет перед собой (предмет крепится к HoldSocket на камере).
Это отдельная боль. Анимации рук должны смешиваться с анимациями тела через AnimationLayer — то есть ноги идут, а руки в этот момент делают что-то своё. В теории Godot умеет так делать. На практике я пока закопался в документацию и форумы.
Как добью — покажу гифку. Если кто работал с AnimationLayer в Godot 4 и знает, как не сломать позвоночник персонажу при смешивании — маякните в комментах. Реально надо.
МИР — ПОКА ПРИМИТИВЫ
Отдельно не показываю (следующий пост будет про мир), но упомянуть надо. Весь мир сейчас — серые боксы, кубы и цилиндры. Заправка, дорога, здание, колонки. Всё в масштабе игры, можно ходить, можно залезать в машину, можно ездить. Расстояния чувствуются. Свет и туман — уже работают. Но про это — в следующем посте, с картинками.
ЧТО ДАЛЬШЕ
Добить анимации рук (поднятие, дверь, держание).
Привязать предметы к HoldSocket.
Сделать пост про мир с нормальными скринами.
Демо всё ещё впереди, но Колян уже живой. Он двигается, дышит, устаёт. Осталось научить его не быть беспомощным перед открытой дверью машины.
Подписывайтесь, если тема заходит. Вопросы, советы, проклятия — в комменты.
P.S. Да, модель персонажа пока ассетная. Свою сделаю позже, когда руки дойдут. Сначала — геймплей.