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

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

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

Другие наши проекты: https://tprg.ru/media
Download Telegram
Музыка продолжает играть, но регулятор её громкости больше не действует? Если перед этим переименовали аудиошину в Godot, проверьте, куда теперь направлен AudioStreamPlayer.

По описанию Audio buses в документации 4.5, player хранит имя шины. Перестановка шин связь сохраняет, а переименование её теряет. Тогда звук направляется в Master. После смены имени нужно заново проверить назначение у проигрывателей.

Отсутствие эффекта в Web-сборке может иметь другую причину. Режим Sample не поддерживает эффекты шин, для них нужен Stream. Если потоки не включены, у этого режима выше задержка. Сами эффекты применяются в порядке их расположения на шине, а молчащие несколько секунд шины и эффекты Godot отключает автоматически.

Страница помечена Work in progress: её ещё не обновили для 4.5, и описание может быть устаревшим. Это ориентир для диагностики, поведение нужно проверить в версии своего проекта.
A* можно подсказать, где на карте стены

Эвристика расстояния видит близкую цель, но не знает, что дорога к ней начинается с обхода в другую сторону. В разборе Red Blob Games Амит Патель показывает другой источник оценки: заранее рассчитанные расстояния до ориентиров, или landmarks.

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

h(B, X) = |d(B, L) - d(X, L)|

Можно взять максимум по нескольким ориентирам и допустимой исходной эвристике. Сам A* менять не нужно. Расчёт используется повторно в запросах с разными целями, но требует памяти: число ориентиров × число узлов × размер числа. Удачное расположение ориентиров тоже зависит от карты.

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

На странице есть интерактивные карты, в том числе лабиринты и уровни Cogmind. Материал датирован июлем 2026 года, и автор прямо отмечает, что ещё не применял метод в реальном проекте. По демо можно изучить поведение эвристики, но производственного замера здесь нет.
❤2
Объекты совпали на экране, но столкновения между ними нет

В Defold это возможно, если объекты принадлежат разным мирам, загруженным через collection proxy. У каждого такого мира собственная физика. Коллизии, триггеры и ray casts работают только внутри него, даже при одинаковых координатах объектов из двух миров.

Здесь важна разница двух компонентов:

Collection factory создаёт экземпляры содержимого коллекции в текущем мире.
Collection proxy загружает отдельный мир. После load или async_load приходит proxy_loaded, затем можно выполнить init и enable.

Миры могут обмениваться сообщениями по полному URL объекта. А напрямую вызвать go.get_position для объекта из другого мира нельзя. Для передачи ввода в загруженную коллекцию объект с proxy должен приобрести ввод.

Руководство Defold отмечает и расход памяти: новый мир обходится заметно дороже обычного экземпляра иерархии. Для множества однотипных объектов уместнее collection factory, а proxy полезен там, где нужна именно отдельная коллекция со своим миром.
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. Так звук может окружать слушателя, а не прыгать между берегами.

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