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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
SpringArm3D учитывает ближнюю плоскость камеры

В ролике из документации Godot камера приближается к персонажу у стены. За это отвечает SpringArm3D: на каждом физическом кадре он проверяет путь на заданную длину и сдвигает дочерние узлы к месту столкновения.

Для этого важна иерархия узлов. Если Camera3D — непосредственный ребёнок плеча, а Shape пуст, проверка использует пирамиду ближней плоскости камеры. Так учитывается объём у объектива, а не только линия до него.

Если камера вложена глубже, а Shape не задан, остаётся луч, который может пропустить препятствие у края кадра. В руководстве Godot 4.5 показаны обе схемы.
❤3
Media is too big
VIEW IN TELEGRAM
Эти полосы меняют направление вместе с входным полем. Rune Skovbo Johansen показал такой шум в разборе Phacelle Noise: результат — вектор с компонентами косинуса и синуса. Из его фазы можно получить разные профили полос.

У автора два варианта. Simple получает направление одним входным параметром и проходит 4 × 4 ячейки на пиксель. Sampled считывает направление для каждой из этих 16 ячеек.

Разница видна на резких изменениях поля. У Simple там могут появляться разрывы, а Sampled устраняет этот вид разрыва. Sampled требует больше выборок входного поля, но оценить прирост FPS по статье нельзя: подробного GPU-бенчмарка в ней нет.
❤1
Для шага нужна площадка сверху

Ступенька достаточно низкая, а персонаж всё равно упирается? Чтобы 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 ещё не означают готовые функции. Скриншот показывает гладкий рельеф, не процесс редактирования во время игры.
❤1