Разработка физического движка взаимодействий мобильной игры

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Разработка физического движка взаимодействий мобильной игры
Сложная
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    874
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Разработка физического движка взаимодействий мобильной игры

На мобильных устройствах физика — самое дорогое удовольствие в бюджете CPU. Полноценная симуляция PhysX или Bullet в 120 Гц на Snapdragon 680 заканчивается троттлингом на третьей минуте сессии. Поэтому мобильная игровая физика — это всегда компромисс между достоверностью и производительностью, и найти правильный баланс для конкретного жанра — нетривиальная задача.

Архитектура физики под мобильный бюджет

Фиксированный timestep и его цена

Unity обновляет физику в FixedUpdate с интервалом Time.fixedDeltaTime (по умолчанию 50 Гц). На мобильном устройстве, работающем в 30 FPS, это значит два физических шага на кадр. Если игра идёт в 20 FPS из-за тепловой защиты, Unity делает 2-3 шага PhysX за один отрисованный кадр — CPU нагрузка растёт нелинейно.

Оптимальная стратегия: снижать Fixed Timestep до 0.033 (30 Гц) для мобильных билдов и компенсировать это более точными коллайдерами. Для игр, где физика не критична для геймплея (паззлы, гиперкежуал), можно опустить до 0.05 (20 Гц) и интерполировать позиции объектов визуально через Rigidbody.interpolation = RigidbodyInterpolation.Interpolate.

Когда PhysX избыточен

Для 2D-игр на Unity встроенная физика Box2D (через Rigidbody2D, Physics2D) значительно легче PhysX. Но даже Box2D на 200+ динамических объектах начинает давить на CPU. В Godot 4 аналогично — RigidBody2D + GodotPhysics2D эффективнее, чем 3D-физика для плоских игр.

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

// Упрощённая физика прыжка без Rigidbody
void Update() {
    if (isGrounded && Input.GetTouch(0).phase == TouchPhase.Began)
        velocity.y = jumpForce;

    velocity.y -= gravity * Time.deltaTime;
    transform.position += velocity * Time.deltaTime;

    if (transform.position.y <= groundLevel) {
        transform.position = new Vector3(transform.position.x, groundLevel, 0);
        velocity.y = 0;
        isGrounded = true;
    }
}

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

Взаимодействие объектов: где обычно ломается

Стекирование объектов

PhysX плохо симулирует стопки из 10+ динамических объектов на мобильном железе — начинается джиттер и объекты «проваливаются» сквозь друг друга. Решение: Rigidbody.maxDepenetrationVelocity снижать до 1-3 м/с (вместо default 10), Physics.defaultSolverIterations до 4-6 (default 6), Physics.defaultSolverVelocityIterations до 1.

Thin colliders и туннелирование

Быстрые объекты — пули, снаряды — на низком FPS за один шаг могут пролететь сквозь тонкую стену. Rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic решает проблему, но вдвое дороже по CPU. Альтернатива: для снарядов использовать raycast вместо физического тела — Physics.SphereCast с радиусом снаряда от предыдущей позиции до текущей.

Производительность на разных устройствах

Реальная картина из профайлера (Unity Profiler + Android Profiler) в проекте с 3D-аркадой (80 физических объектов, Snapdragon 665):

Конфигурация Fixed Timestep CPU на физику FPS
Default PhysX 50 Гц 4.2 мс/кадр 38
Reduced iterations 30 Гц 2.1 мс/кадр 56
Кастомная физика N/A 0.6 мс/кадр 60

Кастомная физика — для конкретного жанра, а не универсальное решение. Но когда игровая механика это позволяет, выигрыш очевиден.

Физика в React Native играх (flame/Godot export)

Для React Native игра пишется либо на Godot с экспортом в Web/Android, либо через движок на JavaScript (Phaser.js через WebView). Phaser использует Matter.js для 2D-физики — он легче Box2D по потреблению памяти, но уступает по точности. Matter.Runner.run() с fps: 30 на большинстве Android-бюджетников достаточно.

Для Flutter + flame: forge2d (порт Box2D на Dart) даёт полноценную 2D-физику. World.stepDt вызывается в game.update(dt), частота обновлений контролируется игровым лупом flame. Критично: forge2d работает в метрах, а flame — в пикселях. Коэффициент пересчёта (worldScale) нужно задавать один раз и придерживаться его везде.

Процесс разработки

Начинаем с профилирования целевых устройств — бюджетный Android и топовый iPhone дают разную картину. Выбираем физический движок или кастомную реализацию исходя из жанра, количества объектов и целевого FPS. Пишем физические взаимодействия, профилируем в реальных условиях (throttle mode, без зарядки), итерируем.

Типичные сроки: базовые физические взаимодействия — 1-2 недели, сложные системы (разрушаемые объекты, гибкие тела, fluid simulation) — 3-6 недель. Стоимость рассчитывается индивидуально после анализа механик.