Создаём match-3 на Unity с раздельной логикой и визуализацией
Туториал ведёт от пустой сцены к прототипу на Unity 2022.3.2f1: игрок меняет плитки местами и собирает линии минимум из трёх одинаковых элементов. Игровая логика отделена от представления, а
Плитки получают разные формы ещё до цвета, чтобы их различали люди с нарушением цветовосприятия. Префабы возвращаются в универсальный пул, а двумерная сетка хранит ячейки в обычном массиве: Unity сериализует его и сохраняет данные после горячей перезагрузки кода.
В пошаговом разборе Catlike Coding есть код обработки перетаскивания, пула объектов и сериализуемой сетки. Получится крепкая основа для собственного прототипа match-3.
Туториал ведёт от пустой сцены к прототипу на Unity 2022.3.2f1: игрок меняет плитки местами и собирает линии минимум из трёх одинаковых элементов. Игровая логика отделена от представления, а
Match3Skin связывает её с основным контроллером. Визуальную оболочку можно заменить, не переписывая правила.Плитки получают разные формы ещё до цвета, чтобы их различали люди с нарушением цветовосприятия. Префабы возвращаются в универсальный пул, а двумерная сетка хранит ячейки в обычном массиве: Unity сериализует его и сохраняет данные после горячей перезагрузки кода.
В пошаговом разборе Catlike Coding есть код обработки перетаскивания, пула объектов и сериализуемой сетки. Получится крепкая основа для собственного прототипа match-3.
❤1
Как устроены автоматы состояний и паттерн State в игровой логике
У героини платформера появились прыжок, приседание и атака в падении. Каждое действие добавляло булевый флаг, а сочетания быстро стали источником ошибок: персонаж менял спрайт на стоящий прямо в воздухе или снова прыгал во время атаки.
Конечный автомат оставляет одно текущее состояние: героиня стоит, прыгает, приседает или атакует в падении. Кнопка запускает только разрешённый переход, остальные команды игнорируются. Даже перечисление со
В главе Game Programming Patterns этот пример развивается от простого
У героини платформера появились прыжок, приседание и атака в падении. Каждое действие добавляло булевый флаг, а сочетания быстро стали источником ошибок: персонаж менял спрайт на стоящий прямо в воздухе или снова прыгал во время атаки.
Конечный автомат оставляет одно текущее состояние: героиня стоит, прыгает, приседает или атакует в падении. Кнопка запускает только разрешённый переход, остальные команды игнорируются. Даже перечисление со
switch исключает невозможные сочетания и собирает обработку состояния в одном месте.В главе Game Programming Patterns этот пример развивается от простого
switch до паттерна State и более сложных автоматов. Подойдёт, если логика персонажа уже обрастает проверками.❤🔥5
Как A* ищет короткий путь по игровой карте
Для алгоритма карта выглядит как граф: узлы обозначают положения, рёбра задают допустимые переходы. Поиск в ширину обходит граф равномерно, алгоритм Дейкстры учитывает стоимость перемещения, а A* использует оценку расстояния до цели и направляет поиск преимущественно к ней.
В примере проход по воде стоит в десять раз дороже прохода по траве. Представление карты тоже влияет на производительность: A* быстрее работает с меньшим числом узлов, хотя сетку проще использовать.
Интерактивный разбор Red Blob Games содержит анимации и код на Python: от очереди и восстановления пути до приоритетов и эвристики. Откройте его, если настраиваете навигацию персонажей и хотите увидеть, как граф и стоимость переходов меняют поиск.
Для алгоритма карта выглядит как граф: узлы обозначают положения, рёбра задают допустимые переходы. Поиск в ширину обходит граф равномерно, алгоритм Дейкстры учитывает стоимость перемещения, а A* использует оценку расстояния до цели и направляет поиск преимущественно к ней.
В примере проход по воде стоит в десять раз дороже прохода по траве. Представление карты тоже влияет на производительность: A* быстрее работает с меньшим числом узлов, хотя сетку проще использовать.
Интерактивный разбор Red Blob Games содержит анимации и код на Python: от очереди и восстановления пути до приоритетов и эвристики. Откройте его, если настраиваете навигацию персонажей и хотите увидеть, как граф и стоимость переходов меняют поиск.
❤3
Как Wave Function Collapse генерирует сетку из тайлов
Wave Function Collapse (WFC) строит генератор на решении ограничений. Каждая клетка сетки хранит набор допустимых тайлов, а правила задают, какие края соседних тайлов могут соприкасаться.
На каждом шаге алгоритм выбирает клетку с наименьшим числом вариантов, случайно оставляет в ней один тайл и пересчитывает соседей. Если выбор исключает часть комбинаций рядом, ограничения распространяются дальше по сетке. Случайность даёт разные результаты, но каждый из них должен соблюдать заданные правила.
В материале Wave Function Collapse Explained механику сначала разбирают на мини-судоку, а затем переносят на сетку 3×3. Разбор пригодится, если хотите реализовать управляемую процедурную генерацию и понимать, почему тайл сокращает варианты вокруг.
Wave Function Collapse (WFC) строит генератор на решении ограничений. Каждая клетка сетки хранит набор допустимых тайлов, а правила задают, какие края соседних тайлов могут соприкасаться.
На каждом шаге алгоритм выбирает клетку с наименьшим числом вариантов, случайно оставляет в ней один тайл и пересчитывает соседей. Если выбор исключает часть комбинаций рядом, ограничения распространяются дальше по сетке. Случайность даёт разные результаты, но каждый из них должен соблюдать заданные правила.
В материале Wave Function Collapse Explained механику сначала разбирают на мини-судоку, а затем переносят на сетку 3×3. Разбор пригодится, если хотите реализовать управляемую процедурную генерацию и понимать, почему тайл сокращает варианты вокруг.
Как убрать задержку управления с помощью предсказания на клиенте
При авторитетном сервере команда проходит до сервера и обратно, прежде чем игрок увидит движение. Предсказание на клиенте убирает эту паузу: клиент сразу применяет ввод локально, а сервер по-прежнему определяет истинное состояние мира.
Сложность начинается, когда ответ приходит после нескольких команд. Клиент присваивает каждой порядковый номер, а сервер возвращает номер последней обработанной. Получив ответ, клиент принимает состояние сервера, удаляет подтверждённые команды и заново применяет ещё не обработанные. Так персонаж не прыгает назад из-за запоздалого снимка мира.
В разборе Габриэля Гамбетты есть схемы с задержкой 100 и 250 мс и важная граница: эффект атаки можно показать сразу, но здоровье противника лучше менять только после ответа сервера.
При авторитетном сервере команда проходит до сервера и обратно, прежде чем игрок увидит движение. Предсказание на клиенте убирает эту паузу: клиент сразу применяет ввод локально, а сервер по-прежнему определяет истинное состояние мира.
Сложность начинается, когда ответ приходит после нескольких команд. Клиент присваивает каждой порядковый номер, а сервер возвращает номер последней обработанной. Получив ответ, клиент принимает состояние сервера, удаляет подтверждённые команды и заново применяет ещё не обработанные. Так персонаж не прыгает назад из-за запоздалого снимка мира.
В разборе Габриэля Гамбетты есть схемы с задержкой 100 и 250 мс и важная граница: эффект атаки можно показать сразу, но здоровье противника лучше менять только после ответа сервера.
👍1
Xsolla приглашает разработчиков мобильных игр на Web Shop Arena 2026 — конкурс с призовым фондом $100 000.
Это не просто соревнование: вместе с экспертами Xsolla вы шаг за шагом построите собственный канал прямых продаж — от запуска Web Shop и настройки платежей до продвижения и LiveOps.
Каждая студия получает возможность выиграть до $5 000 за выполнение челленджей. А 4 студии с лучшими Web Shop в финале смогут выиграть дополнительные призы — от денежной выплаты до рекламного бюджета на сумму до $18 000 с партнёром Emarka.
Заявки принимаются до 30 сентября.
Please open Telegram to view this post
VIEW IN TELEGRAM
Как рассчитать поле зрения и освещение на 2D-карте
В разборе Red Blob Games показан алгоритм для стен из отрезков. Лучи направляются к началу и концу каждой стены, а ближайшие пересечения задают треугольники.
Эффективная версия сортирует концы стен по углу и поворачивает луч на 360°, сохраняя стены на его пути. При смене ближайшей стены начинается новый треугольник. Их объединение даёт область, видимую из выбранной точки.
Результат пересекают с кругом, градиентом или конусом, чтобы ограничить обзор, добавить затухание света или фонарик. Расчёт применим к факелам, камерам и поиску укрытий игровым ИИ. Есть песочница и код на Haxe, но автор предупреждает о пропущенных оптимизациях и проблемах численной устойчивости: для проекта лучше изучить более надёжные реализации по ссылкам.
В разборе Red Blob Games показан алгоритм для стен из отрезков. Лучи направляются к началу и концу каждой стены, а ближайшие пересечения задают треугольники.
Эффективная версия сортирует концы стен по углу и поворачивает луч на 360°, сохраняя стены на его пути. При смене ближайшей стены начинается новый треугольник. Их объединение даёт область, видимую из выбранной точки.
Результат пересекают с кругом, градиентом или конусом, чтобы ограничить обзор, добавить затухание света или фонарик. Расчёт применим к факелам, камерам и поиску укрытий игровым ИИ. Есть песочница и код на Haxe, но автор предупреждает о пропущенных оптимизациях и проблемах численной устойчивости: для проекта лучше изучить более надёжные реализации по ссылкам.
❤2
Как создать эффект текущей жидкости в Unity с картой течения
Для эффекта воды, грязи или лавы физическая симуляция не нужна. В уроке для Unity 2017.4.4f1 текстуру смещают по UV, а карта течения задаёт направление и скорость для участков поверхности.
Карта хранит двумерный вектор в красном и зелёном каналах. Шейдер переводит значения 0…1 в −1…1 и вычитает из UV вектор, умноженный на время. Участки деформируются по-разному, поэтому материал не выглядит жёстко сдвигаемой плоскостью.
Чтобы растяжение не копилось, прогресс берут из дробной части времени и сбрасывают раз в секунду. Переход маскируют: перед сбросом цвет умножают на коэффициент, падающий до нуля, после него коэффициент растёт. В уроке Catlike Coding есть код шейдера, импорт карты без sRGB для хранения векторов и разбор артефактов DXT1.
Для эффекта воды, грязи или лавы физическая симуляция не нужна. В уроке для Unity 2017.4.4f1 текстуру смещают по UV, а карта течения задаёт направление и скорость для участков поверхности.
Карта хранит двумерный вектор в красном и зелёном каналах. Шейдер переводит значения 0…1 в −1…1 и вычитает из UV вектор, умноженный на время. Участки деформируются по-разному, поэтому материал не выглядит жёстко сдвигаемой плоскостью.
Чтобы растяжение не копилось, прогресс берут из дробной части времени и сбрасывают раз в секунду. Переход маскируют: перед сбросом цвет умножают на коэффициент, падающий до нуля, после него коэффициент растёт. В уроке Catlike Coding есть код шейдера, импорт карты без sRGB для хранения векторов и разбор артефактов DXT1.
❤2
Как собрать систему сохранений мира на C++ в Unreal Engine
Для каждого нужного актора система хранит имя,
При загрузке система находит актор по имени, возвращает его положение и значения полей, затем вызывает
Разбор с полным исходным кодом показывает эту архитектуру на костре-сейвпоинте в духе Dark Souls: сохраняются состояние сундука, положение предметов и накопленные кредиты.
Для каждого нужного актора система хранит имя,
Transform с координатами, поворотом и масштабом, а также массив байтов. Unreal Engine записывает в него только поля с UPROPERTY(SaveGame), а интерфейс отсекает ненужные статичные акторы.При загрузке система находит актор по имени, возвращает его положение и значения полей, затем вызывает
OnActorLoaded для восстановления анимации и другого поведения. Для объектов, созданных во время выполнения, автор предлагает стабильный FGuid: их имена могут меняться. Данные игроков хранятся отдельно и связываются с уникальным ID, чтобы вернуть прогресс после повторного входа на сервер.Разбор с полным исходным кодом показывает эту архитектуру на костре-сейвпоинте в духе Dark Souls: сохраняются состояние сундука, положение предметов и накопленные кредиты.
❤4
Как в Godot 4.3 автоматизировали синхронизацию GPU
В Vulkan GPU может завершать команды не в порядке отправки. Разработчик расставляет барьеры: задаёт, какая работа должна закончиться до следующей. Старый RenderingDevice без точной маски задерживал всю последующую работу и создавал лишние барьеры.
Технический разбор Godot Engine описывает новую схему: движок автоматически строит граф зависимостей без циклов между пакетами отрисовки и вычислений. Код уже находился в основной ветке и предназначался для Godot 4.3. Проекты менять не требовалось, а методы RenderingDevice стали запрашивать меньше данных.
Для систем частиц на GPU ожидалось особенно заметное ускорение, для сцен с постобработкой: сокращение времени кадра примерно на 5–15%. Статья вышла в феврале 2024 года, детали API стоит сверять с документацией.
В Vulkan GPU может завершать команды не в порядке отправки. Разработчик расставляет барьеры: задаёт, какая работа должна закончиться до следующей. Старый RenderingDevice без точной маски задерживал всю последующую работу и создавал лишние барьеры.
Технический разбор Godot Engine описывает новую схему: движок автоматически строит граф зависимостей без циклов между пакетами отрисовки и вычислений. Код уже находился в основной ветке и предназначался для Godot 4.3. Проекты менять не требовалось, а методы RenderingDevice стали запрашивать меньше данных.
Для систем частиц на GPU ожидалось особенно заметное ускорение, для сцен с постобработкой: сокращение времени кадра примерно на 5–15%. Статья вышла в феврале 2024 года, детали API стоит сверять с документацией.
❤1👍1
Как работает Command в игровой архитектуре
Кнопка может напрямую вызывать
Если передавать в
Глава о Command в Game Programming Patterns разбирает подход на примерах C++. Получается один механизм для переназначения кнопок, управления героями через ИИ, сетевого воспроизведения и отмены действий.
Кнопка может напрямую вызывать
jump() или fireGun(). Command превращает вызов в объект с методом execute(). Обработчик ввода хранит команду для каждой кнопки, поэтому назначение можно заменить без переписывания его логики.Если передавать в
execute() персонажа, одна команда прыжка сможет управлять любым героем. Команды создаёт и ввод игрока, и ИИ, а другой код применяет их к персонажу. Очередь между ними отделяет источник решения от исполнителя. Если команды сохраняются в передаваемом формате, их можно отправить по сети и воспроизвести на другой машине.Глава о Command в Game Programming Patterns разбирает подход на примерах C++. Получается один механизм для переназначения кнопок, управления героями через ИИ, сетевого воспроизведения и отмены действий.
Как построить поле направлений для волны врагов в tower defense
Если у десятков противников одна цель, не обязательно запускать A* отдельно для каждого. Поиск в ширину можно один раз начать от цели и распространить по всей сетке. Для каждой посещённой клетки алгоритм запоминает соседнюю клетку, из которой пришёл. Если идти по этим указателям обратно, получится кратчайший маршрут к цели.
Из тех же данных собирается поле направлений: в каждой клетке стрелка указывает туда, где расстояние до цели уменьшается. Новый или сдвинутый противник сразу получает готовое направление. Для сетки с разной стоимостью перемещения вместо поиска в ширину понадобится алгоритм Дейкстры.
В разборе Red Blob Games есть интерактивные визуализации фронта поиска, поля расстояний и стрелок, а также заметки по реализации на Python и C++.
Если у десятков противников одна цель, не обязательно запускать A* отдельно для каждого. Поиск в ширину можно один раз начать от цели и распространить по всей сетке. Для каждой посещённой клетки алгоритм запоминает соседнюю клетку, из которой пришёл. Если идти по этим указателям обратно, получится кратчайший маршрут к цели.
Из тех же данных собирается поле направлений: в каждой клетке стрелка указывает туда, где расстояние до цели уменьшается. Новый или сдвинутый противник сразу получает готовое направление. Для сетки с разной стоимостью перемещения вместо поиска в ширину понадобится алгоритм Дейкстры.
В разборе Red Blob Games есть интерактивные визуализации фронта поиска, поля расстояний и стрелок, а также заметки по реализации на Python и C++.
Как добавить лазание по стенам в Unity
В восьмой части серии сфера получает физическое лазание. В Unity 2019.2.21f1 контакт проверяют по углу нормали: предел задают от 90° до 170°, по умолчанию 140°. Маска слоёв исключает запретные стены. Для контакта сохраняют компонент
На стене лазание получает приоритет над ходьбой, гравитация отключается, а управление строится относительно контакта. Горизонталь вычисляют через векторное произведение нормали и направления вверх, затем обе оси проецируют на плоскость стены. Максимальную скорость снижают до 2, ускорение задают 20 для точности.
Урок Catlike Coding показывает код распознавания столкновений и движения вдоль стены. На запрещённой для лазания поверхности сфера падает.
В восьмой части серии сфера получает физическое лазание. В Unity 2019.2.21f1 контакт проверяют по углу нормали: предел задают от 90° до 170°, по умолчанию 140°. Маска слоёв исключает запретные стены. Для контакта сохраняют компонент
Rigidbody поверхности, поэтому сфера карабкается по движущимся объектам.На стене лазание получает приоритет над ходьбой, гравитация отключается, а управление строится относительно контакта. Горизонталь вычисляют через векторное произведение нормали и направления вверх, затем обе оси проецируют на плоскость стены. Максимальную скорость снижают до 2, ускорение задают 20 для точности.
Урок Catlike Coding показывает код распознавания столкновений и движения вдоль стены. На запрещённой для лазания поверхности сфера падает.
Как выбрать координаты для гексагональной сетки
В сетке у гекса шесть соседей, но при хранении по строкам и столбцам смещение зависит от чётности ряда или колонки. Руководство Red Blob Games предлагает представить сетку с тремя осями и ограничением
Трёхмерная модель двумерной карты выглядит странно, но упрощает алгоритмы. В кубических координатах можно складывать и вычитать векторы, искать соседей, считать расстояние, поворачивать и отражать точки. Карту можно хранить в осевых координатах
Для прямоугольной карты подходят смещённые координаты или удвоенный шаг по одной оси; для остальных форм рекомендуются осевые либо кубические. Там же разобраны области в радиусе, поле зрения, поиск пути и перевод гексов в экранные пиксели.
В сетке у гекса шесть соседей, но при хранении по строкам и столбцам смещение зависит от чётности ряда или колонки. Руководство Red Blob Games предлагает представить сетку с тремя осями и ограничением
q + r + s = 0.Трёхмерная модель двумерной карты выглядит странно, но упрощает алгоритмы. В кубических координатах можно складывать и вычитать векторы, искать соседей, считать расстояние, поворачивать и отражать точки. Карту можно хранить в осевых координатах
q, r, вычисляя третью по формуле s = -q-r.Для прямоугольной карты подходят смещённые координаты или удвоенный шаг по одной оси; для остальных форм рекомендуются осевые либо кубические. Там же разобраны области в радиусе, поле зрения, поиск пути и перевод гексов в экранные пиксели.
Как синхронизировать физику сотен объектов и экономить трафик
При синхронизации состояния симуляция идёт на обеих сторонах, а по сети передают команды игрока и состояние лишь части объектов. Между пакетами объекты движутся по последним координатам и скоростям. В примере с 901 кубом пакет содержит до 64 обновлений.
Накопитель приоритета чаще выбирает активные объекты, но счёт остальных растёт каждый кадр. Не поместившееся обновление сохраняет приоритет до следующей отправки.
На приёмнике буфер задерживает пакеты на 4–5 кадров при 60 Гц и выдаёт их равномерно. При сжатии всё состояние округляют до сетевой точности на обеих сторонах перед каждым шагом симуляции: иначе расхождение координат вызывает рывки.
В статье Gaffer On Games разобраны структура пакета, приоритеты и расчёт под лимит 256 кбит/с.
При синхронизации состояния симуляция идёт на обеих сторонах, а по сети передают команды игрока и состояние лишь части объектов. Между пакетами объекты движутся по последним координатам и скоростям. В примере с 901 кубом пакет содержит до 64 обновлений.
Накопитель приоритета чаще выбирает активные объекты, но счёт остальных растёт каждый кадр. Не поместившееся обновление сохраняет приоритет до следующей отправки.
На приёмнике буфер задерживает пакеты на 4–5 кадров при 60 Гц и выдаёт их равномерно. При сжатии всё состояние округляют до сетевой точности на обеих сторонах перед каждым шагом симуляции: иначе расхождение координат вызывает рывки.
В статье Gaffer On Games разобраны структура пакета, приоритеты и расчёт под лимит 256 кбит/с.
❤2
Как безопасно сериализовать пакеты игрового протокола на C++
Пропущенная проверка при чтении сетевого пакета может помочь атакующему уронить сервер. Гленн Фидлер заменяет ручные проверки одним методом
Каждый вызов проверяет диапазон значения и границу буфера; ошибка возвращает false и прекращает разбор без исключений. Для покоящегося физического тела можно отправить один бит вместо линейной и угловой скорости. Число от 0 до 10 с шагом 0,01 превращается в целое от 0 до 1000: меньше битов в пакете при заданной точности.
В разборе Gaffer On Games есть реализация потоков, чисел, векторов и кватернионов. Для собственного сетевого протокола это способ не дублировать код и проверки.
Пропущенная проверка при чтении сетевого пакета может помочь атакующему уронить сервер. Гленн Фидлер заменяет ручные проверки одним методом
Serialize. ReadStream и WriteStream дают одинаковый интерфейс, а шаблоны C++ собирают из него функции чтения и записи.Каждый вызов проверяет диапазон значения и границу буфера; ошибка возвращает false и прекращает разбор без исключений. Для покоящегося физического тела можно отправить один бит вместо линейной и угловой скорости. Число от 0 до 10 с шагом 0,01 превращается в целое от 0 до 1000: меньше битов в пакете при заданной точности.
В разборе Gaffer On Games есть реализация потоков, чисел, векторов и кватернионов. Для собственного сетевого протокола это способ не дублировать код и проверки.
❤3
Как управлять асинхронной загрузкой ассетов в Unreal Engine
Asset Manager позволяет назначить конфигурации монстров и оружия первичными ассетами. По идентификатору он загружает или выгружает связанные модели, текстуры и классы, поэтому весь контент не нужно держать в памяти.
Для асинхронной загрузки в C++ создаётся функция обратного вызова. После запроса она получает идентификатор и параметры, например точку появления монстра. Группы Asset Bundles разделяют мягкие ссылки: для меню можно запросить иконку без модели и способностей.
Предзагрузка держит ассет в памяти, пока хранится её дескриптор. Если отпустить дескриптор и не вызвать обычную загрузку, Asset Manager выгрузит ассет автоматически. В статье «Asset Manager for Data Assets & Async Loading» есть примеры для C++ и Blueprint.
Asset Manager позволяет назначить конфигурации монстров и оружия первичными ассетами. По идентификатору он загружает или выгружает связанные модели, текстуры и классы, поэтому весь контент не нужно держать в памяти.
Для асинхронной загрузки в C++ создаётся функция обратного вызова. После запроса она получает идентификатор и параметры, например точку появления монстра. Группы Asset Bundles разделяют мягкие ссылки: для меню можно запросить иконку без модели и способностей.
Предзагрузка держит ассет в памяти, пока хранится её дескриптор. Если отпустить дескриптор и не вызвать обычную загрузку, Asset Manager выгрузит ассет автоматически. В статье «Asset Manager for Data Assets & Async Loading» есть примеры для C++ и Blueprint.
❤1
Как численное интегрирование двигает объекты в игровой физике
Физический цикл не вычисляет траекторию сразу. Он делит силу на массу, получает ускорение и малыми шагами обновляет координату и скорость объекта.
Цена метода видна на цифрах. Явный метод Эйлера сначала меняет координату по старой скорости, затем скорость по ускорению. При постоянном ускорении и шаге в одну секунду пример даёт 450 метров вместо точных 500 через 10 секунд. При шаге 1/100 секунды получается 499,497 метра.
Для пружины с меняющимся ускорением явная схема набирает энергию вместо затухания. Полунеявный метод Эйлера переставляет две строки: сначала обновляет скорость, потом координату, и расчёт пружины становится устойчивым. Разбор Гленна Фидлера на Gaffer On Games содержит код схем, сравнение с точным решением и обзор других интеграторов.
Физический цикл не вычисляет траекторию сразу. Он делит силу на массу, получает ускорение и малыми шагами обновляет координату и скорость объекта.
Цена метода видна на цифрах. Явный метод Эйлера сначала меняет координату по старой скорости, затем скорость по ускорению. При постоянном ускорении и шаге в одну секунду пример даёт 450 метров вместо точных 500 через 10 секунд. При шаге 1/100 секунды получается 499,497 метра.
Для пружины с меняющимся ускорением явная схема набирает энергию вместо затухания. Полунеявный метод Эйлера переставляет две строки: сначала обновляет скорость, потом координату, и расчёт пружины становится устойчивым. Разбор Гленна Фидлера на Gaffer On Games содержит код схем, сравнение с точным решением и обзор других интеграторов.
👍2❤1
Как разделить код теней в собственном конвейере рендеринга Unity
Custom SRP 7.1.0 для Unity 6000.5.8f1 посвящён рефакторингу без изменения рендеринга. Тени точечных источников и прожекторов переносят из общего Shadows в отдельный OtherShadows. Редкий урок по графике, где прежняя картинка означает успех.
OtherShadows получает настройки и данные источников света. Структура Handles хранит TextureHandle и BufferHandle для атласа теней и буфера данных; метод Use сообщает графу рендеринга, что проход читает оба ресурса. Shadows остаётся координатором. В новый класс также переносят резервирование теней, построение списков отрисовки и рендеринг.
В туториале Catlike Coding показана последовательность правок с кодом. Такое разделение готовит конвейер к будущим улучшениям и не смешивает независимые типы теней в одном классе.
Custom SRP 7.1.0 для Unity 6000.5.8f1 посвящён рефакторингу без изменения рендеринга. Тени точечных источников и прожекторов переносят из общего Shadows в отдельный OtherShadows. Редкий урок по графике, где прежняя картинка означает успех.
OtherShadows получает настройки и данные источников света. Структура Handles хранит TextureHandle и BufferHandle для атласа теней и буфера данных; метод Use сообщает графу рендеринга, что проход читает оба ресурса. Shadows остаётся координатором. В новый класс также переносят резервирование теней, построение списков отрисовки и рендеринг.
В туториале Catlike Coding показана последовательность правок с кодом. Такое разделение готовит конвейер к будущим улучшениям и не смешивает независимые типы теней в одном классе.
❤1
Зачем игровому движку очередь событий
Прямой вызов
С очередью система оставляет запрос и продолжает работу. Аудиодвижок забирает его позже, сводит звуки, расставляет приоритеты и выполняет работу в своём потоке. Кадр не ждёт загрузки, а аудиосистема выбирает момент обработки.
Очередь нужна для разделения отправки и обработки во времени. Если требуется лишь скрыть получателя, Observer или Command проще. Центральная очередь остаётся глобальной, а отправитель не получает немедленного ответа. В главе Game Programming Patterns паттерн разбирают на аудиосистеме и показывают его архитектурную цену.
Прямой вызов
playSound() блокирует меню, пока аудиодвижок загружает ресурс. Два врага, задетые одной атакой, запускают звук дважды и удваивают громкость. Запросы из потоков приходят вместе, хотя для аудио выделен свой поток.С очередью система оставляет запрос и продолжает работу. Аудиодвижок забирает его позже, сводит звуки, расставляет приоритеты и выполняет работу в своём потоке. Кадр не ждёт загрузки, а аудиосистема выбирает момент обработки.
Очередь нужна для разделения отправки и обработки во времени. Если требуется лишь скрыть получателя, Observer или Command проще. Центральная очередь остаётся глобальной, а отправитель не получает немедленного ответа. В главе Game Programming Patterns паттерн разбирают на аудиосистеме и показывают его архитектурную цену.
❤1
Как построить кубическую сферу в Unity без скопления вершин у полюсов
У обычной UV-сферы вершины сгущаются у полюсов. В учебнике для Unity 2020.3.23f1 автор предлагает начать с куба: разбить шесть граней на сетки из отдельных квадратов, задать каждой положение, направления координат U и V, нормаль и касательную, а затем притянуть вершины к центру до сферической формы.
Индекс задачи определяет грань и столбец квадратов, а повторное использование позиций соседних вершин сокращает часть вычислений. Симметричная развёртка строится вокруг двух противоположных углов куба, выбранных полюсами.
В пошаговом разборе Cube Sphere есть код генератора, настройка шести граней и объяснение раскладки сетки.
У обычной UV-сферы вершины сгущаются у полюсов. В учебнике для Unity 2020.3.23f1 автор предлагает начать с куба: разбить шесть граней на сетки из отдельных квадратов, задать каждой положение, направления координат U и V, нормаль и касательную, а затем притянуть вершины к центру до сферической формы.
Индекс задачи определяет грань и столбец квадратов, а повторное использование позиций соседних вершин сокращает часть вычислений. Симметричная развёртка строится вокруг двух противоположных углов куба, выбранных полюсами.
В пошаговом разборе Cube Sphere есть код генератора, настройка шести граней и объяснение раскладки сетки.
❤5