GameDev: разработка игр
7.61K subscribers
985 photos
212 videos
1 file
1.42K links
Всё про геймдев для девелоперов, художников, левел- и геймдизайнеров, сценаристов

Разместить рекламу: @tproger_sales_bot

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Для шага нужна площадка сверху

Ступенька достаточно низкая, а персонаж всё равно упирается? Чтобы autostep в Rapier сработал, нужно соблюсти несколько условий:

— высота укладывается в заданный максимум
— сверху хватает горизонтального места, узкий уступ не подойдёт
— персонаж уже касается пола перед препятствием

В руководстве JavaScript 0.21 есть и отдельная настройка: разрешать ли подъём на динамические тела. Прыжок рядом с платформой не должен превращаться в автоматический подъём на неё.

Контроллер вычисляет допустимое перемещение, но применяет его к телу или коллайдеру уже код игры. Он обрабатывает поступательное движение, а не вращение.
❤2
Для этого рельефа Rune Skovbo Johansen взял функцию высоты и её градиент, затем добавил несколько октав направленных борозд. Течение воды по всей карте фильтр не моделирует. Каждая точка вычисляется независимо, что удобно для GPU и генерации чанков.

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

В разборе разработки можно проследить, что дали затухание слоёв и частичная нормализация. Код опубликован под MPL 2.0, в статье есть ссылки на реализации и Shadertoy.
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Один меш, разные фазы движения рыб

В этом демо одна рыба. Посмотрите на голову: маска ограничивает волну и скручивание задней частью тела, чтобы модель не изгибалась целиком.

В разборе Godot для экземпляров MultiMesh показан приём: INSTANCE_CUSTOM.x сдвигает фазу времени, а .y позволяет менять скорость. Общий меш и шейдер не заставляют всех рыб двигаться синхронно.

При повороте с маской результат нужно смешивать через mix. Простое умножение на маску сожмёт модель.

Страница ветки 4.5 помечена Work in progress и содержит старые поля API. Её стоит читать как объяснение анимации, а не готовый код для текущей версии. Движение стаи и её AI в этот этап не входят.
❤1
Маленький PNG может занимать много памяти

Уменьшить размер игры для скачивания и расход памяти текстур — две разные задачи. После декодирования небольшой файл может занять гораздо больше места. Для GPU нужны свои форматы сжатия, а результат с потерями придётся проверить глазами.

В Defold настройка устроена так:

.texture_profiles задаёт форматы для платформ.
Правила путей назначают профили ресурсам. Специфические glob-правила ставят раньше общих.
BasisU хранит промежуточное представление, которое транскодируется в подходящий формат GPU.

В руководстве по профилям описаны и ограничения: несколько форматов могут увеличить bundle, а сжатие — время сборки. Поддержку формата нужно сверять с целевыми устройствами.
This media is not supported in your browser
VIEW IN TELEGRAM
Волна стала пилой

Это пример из Unity 2017.4.4f1, Surface Shader для Built-in. Вершины сетки стоят с шагом 1, а длина волны равна 2. Точек слишком мало, чтобы передать изгиб, и поверхность превращается в стоящую пилу. Дело здесь не в сломанных нормалях.

Автор разбора Waves советует выбирать длину волны больше удвоенной длины ребра сетки и оставлять запас по плотности. Анимация текстуры эту проблему не решит: геометрию двигает vertex displacement. Связь длины волны с сеткой пригодится и сейчас, хотя код для современного URP или HDRP придётся адаптировать.
😴2❤1
У реки не одна ближайшая точка

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

Rune Skovbo Johansen описал Point Cloud Sound: по точкам вдоль реки рассчитываются суммарная громкость, взвешенное направление и spread. Для каждого звукового компонента используется один источник. Чем короче средний вектор направлений, тем шире spread. Так звук может окружать слушателя, а не прыгать между берегами.

У итогового источника нужно отключить встроенное затухание по расстоянию, иначе оно учтётся дважды. Метод рассчитан на общий фон вроде воды и листвы. Объединять в нём независимые шаги или реплики отдельных персонажей не стоит. В статье — фрагменты алгоритма, не готовая библиотека.
Субботний скриншотник! Что вы успели добавить в свою игру за неделю? Приносите в комментарии скриншоты, гифки, видео, демки и ссылки на свои игры или каналы.

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

@make_game
This media is not supported in your browser
VIEW IN TELEGRAM
У VesperaFX можно взять только палитру, дизеринг и пикселизацию, не подключая остальные постэффекты. В репозитории компактная основа лежит в main.gdshader, а отдельные сочетания — в папке examples.

При RGB matching шейдер перебирает цвета на каждом пикселе. Автор советует заранее рассчитанную LUT, если это становится дорого. Полный all_effects_demo оставлен как справочный пример и стресс-тест, а не вариант по умолчанию для игры.

В README указана Godot 4.4.1 и лицензия MPL 2.0. Приложенный ролик показывает сцену из старой версии шейдера, без интерфейса редактора. Это демонстрация визуального эффекта, а не проверка всех возможностей текущего набора.
Слева чайник будто висит, справа под ним есть мягкое пятно. Это blob shadow: простая проекция помогает понять, где объект находится относительно поверхности, когда полностью запечённое освещение не даёт подвижному предмету динамическую тень. В Godot 4.5 такую приближённую тень можно сделать декалью в Forward+ или Mobile. В Compatibility декали не работают.

Декаль меняет свойства уже существующей поверхности, не добавляя геометрию. Затраты на её отрисовку зависят от площади покрытия экрана и числа узлов. В документации показано это сравнение и описан Distance Fade, которым можно убирать дальние декали.
❤1
Рельеф с тоннелями и навесами

На исходном скриншоте Voxel Tools виден нависающий пласт породы. Объёмное представление позволяет делать такие формы, а также тоннели и разрушаемый рельеф: воксели превращаются в меши отдельных чанков.

Voxel Tools for Godot предлагает блочный и гладкий terrain, загрузку чанков по мере надобности и собственные генераторы. Для гладкого рельефа есть LOD на основе Transvoxel. Проект опубликован под MIT.

Это C++-модуль для Godot 4 со своей инструкцией установки. Текущий README не обещает совместимости с любым стандартным редактором, а пункты roadmap ещё не означают готовые функции. Скриншот показывает гладкий рельеф, не процесс редактирования во время игры.
❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Коробка проходит сквозь поле частиц, и поток расходится вокруг неё. В демо Godot это сила аттрактора, а не столкновения частиц с твёрдым телом.

Для такого эффекта в Godot 4.5 у ParticleProcessMaterial нужно включить Attractor Interaction. Положительный Strength притягивает к центру, отрицательный отталкивает. У коробки ограничена область действия, а Extents задаёт её полуразмеры.

В руководстве по аттракторам есть ещё сфера и векторное поле. Последнее читает направления из 3D-текстуры. Это инструменты для GPU-частиц в 3D. На 2D или CPUParticles этот пример переносить нельзя.
Fixed Fit показывает больше мира на широком экране

В стандартном render script Defold режимы Stretch и Fixed Fit по-разному обрабатывают изменение пропорций окна:

— Stretch сохраняет заданную видимую область, но растягивает содержимое.
— Fixed Fit сохраняет пропорции объектов и добавляет видимую область по ширине или высоте.

Fixed Fit — не letterbox с чёрными полосами. На широком экране игрок может увидеть больше уровня, что стоит учитывать при расстановке противников и границ камеры.

В стандартном render script режим переключается сообщением use_fixed_fit_projection. Включённый Camera Component может задавать свою проекцию, а собственный render script — иначе обрабатывать сообщения. В руководстве разобраны эти варианты управления камерой.
This media is not supported in your browser
VIEW IN TELEGRAM
Персонаж Bluey собран из плоских слоёв

У Bluey’s Happy Snaps трёхмерное окружение и поворачиваемая камера, а персонажи состоят из обращённых к камере 2D-плоскостей. Gameloft Brisbane сохранила рисованный вид с помощью SDF-текстур и собственного рига в Unreal Engine 5.

Художники подготовили восемь ракурсов. Анимацию основного ракурса инструменты переносят на остальные, после чего её можно поправить вручную. При острых углах камеры слои дополнительно сплющиваются, чтобы не раскрыть устройство персонажа.

Это специальный пайплайн для одной игры. В интервью Gameloft для 80 Level художники называют сложный риг и контурный шейдер одними из главных причин проблем с производительностью на слабых платформах. Анимация из статьи показывает персонажей в движении и съёмку игровой камерой.
This media is not supported in your browser
VIEW IN TELEGRAM
В ролике Mytheria справа появляется подпись «Leaves stir in the forest · moonrise». Так игра сообщает о восходе луны игроку, который не слышит звуковой сигнал.

Cobo Sawyer описал подписи к восьми важным звукам. Каждая подпись держится три секунды и объясняет значение звука. Шаги и взмахи оружия не подписывают, чтобы важные предупреждения не терялись среди текста.

Настройки этой игры на Godot хранятся на устройстве. В кооперативе каждый игрок видит свои субтитры. Это одна из опций конкретной игры, а не проверка соответствия стандарту доступности.
This media is not supported in your browser
VIEW IN TELEGRAM
Один враг поднимает весь лагерь

В Mytheria тревога у одного существа будит весь лагерь. Остальные обитатели лагеря сближаются, ждут первого удара лидера и вступают в бой с небольшой задержкой друг за другом. Ролик Cobo Makes Games показывает реакцию такого лагеря на приближение игрока.

Cobo Sawyer описывает расстановку противников: 36 лагерей по 5–7 существ, 24 одиночки на дорогах и семь опасных зон. Все эти числа относятся к Mytheria.

Погибшие обитатели лагеря возвращаются на рассвете на свои места. Лагеря и опасные зоны остаются неподвижны, даже когда остальной остров перестраивается: игрок может отметить их на карте и вернуться по знакомому маршруту.
✍1❤1
Дрожание между физикой и отрисовкой

Для поиска проблем с интерполяцией документация Godot stable предлагает временно снизить частоту физических тиков, например до 10 в секунду. Так ошибки заметнее.

Трансформации интерполируемых объектов обычно меняют в _physics_process. Изменение из _process может дать неверную промежуточную позицию и дрожание между физическими тиками. Анимации, tween, навигацию и движение родителя тоже нужно привязать к физическим тикам, если они перемещают объект. Исключением может быть телепортация вне физического тика при старте уровня или возрождении.

Интерполяция в этом случае связывает локальную физику с отрисовкой кадров. Сетевой буфер состояний здесь не участвует.
❤3
Ubershaders и предварительная компиляция pipeline в документации Godot stable относятся к Forward+ и Mobile с Vulkan, Direct3D 12 или Metal. Для Compatibility на OpenGL, OpenGL ES и WebGL этот путь не подходит.

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

Даже готовый промежуточный код шейдера ещё требует работы драйвера, который собирает pipeline под конкретную систему. Его кеш обычно очищается после обновления драйвера. Поэтому успешный повторный запуск на своём компьютере не доказывает отсутствие статтеров у игрока.
❤1
У CanvasItem в Godot есть отложенный цикл перерисовки. Запрос queue_redraw приводит к NOTIFICATION_DRAW во время idle, а команды рисования выполняются в _draw, соответствующем уведомлении или обработчике сигнала draw.

При собственном рисовании 2D-интерфейса вызывайте draw_* только в этих обработчиках, а не сразу после queue_redraw в произвольном месте скрипта.

Справочник Godot stable прямо отмечает, что CanvasItem не обязан перерисовываться на каждом кадре. Конкретного выигрыша для вашей сцены из этого не следует.