Разработка механик взаимодействия с дополненной реальностью (AR Foundation)

Наша компания по разработке видеоигр ведет независимые проекты, совместно с клиентом создает игры и оказывает дополнительные операционные услуги. Опыт нашей команды позволяет нам охватить все игровые платформы и разработать потрясающий продукт, соответствующий видению клиента и предпочтениям игроков.

От иммерсивных приложений до игровых миров и 3D-сцен

Наша выделенная команда для VR/AR/MR-разработки, Unity-продакшна и 3D-моделирования и анимации с собственными кейсами и презентациями.

Посетить персонализированный сайт
Показано 1 из 1 услугВсе 242 услуг
Разработка механик взаимодействия с дополненной реальностью (AR Foundation)
Сложная
~1-2 недели
Часто задаваемые вопросы
Наши компетенции
Какие этапы разработки игры?
Последние работы
  • image_games_mortal_motors_495_0.webp
    Разработка игры для компании Mortal Motors
    671
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Пошаговая стратегия в фэнтези сеттинге With Fire And Sword
    860
  • image_games_second_team_604_0.webp
    Разработка игры для компании Second term
    490
  • image_games_phoenix_ii_606_0.webp
    3D-анимация — тизер для игры phoenix 2.
    533

Разработка механик взаимодействия с дополненной реальностью (AR Foundation)

AR Foundation — это абстракция поверх ARKit (iOS) и ARCore (Android), которая позволяет писать один код под обе платформы. Но абстракция неполная: под ней живёт разная физика, разное качество плоскостного трекинга, разная скорость обновления depth map. Это означает, что механики взаимодействия нужно проектировать с учётом обеих платформ, и тестировать на реальных устройствах — не в редакторе.

Placement: размещение объектов в реальном пространстве

Базовая механика любого AR-приложения — разместить виртуальный объект на реальной поверхности. AR Foundation делает это через Raycast против AR Planes: ARRaycastManager.Raycast() бросает луч из точки касания экрана, возвращает список ARRaycastHit с позицией и нормалью плоскости.

Стандартная ошибка: вызывать Raycast каждый кадр в Update без debounce. Это работает, но на сложных сценах ARCore тратит 2–4 мс на raycast — это съедает бюджет. Правильно: raycast только при изменении позиции пальца, с минимальным threshold движения 5–10 пикселей.

Другая проблема — плоскость ещё не обнаружена. ARCore и ARKit детектируют горизонтальные плоскости за 2–5 секунд на хорошей текстурированной поверхности. На однотонном белом столе — никогда. Нужен feedback UI: визуальный индикатор поиска плоскостей, инструкция «подвигайте камерой над поверхностью».

ARAnchor: почему просто Transform.position недостаточно

Если поставить объект в AR и просто запомнить его worldPosition — при перемещении с устройством объект «плывёт» относительно реального мира. ARKit и ARCore периодически пересчитывают мировые координаты при улучшении трекинга. Объект без якоря сдвигается.

ARAnchor — это точка, которую AR система обязуется отслеживать и корректировать автоматически. Объект должен быть child ARAnchor'а, не просто помещён в мировые координаты.

В AR Foundation: ARAnchorManager.TryAddAnchorAsync(pose) возвращает ARAnchor, к которому крепится контент. При переоткрытии сцены (Persistent AR) — ARCore Cloud Anchors или ARKit WorldMap для сохранения якорей между сессиями.

Occlusion: реальный мир закрывает виртуальный объект

Без occlusion виртуальный объект рендерится поверх всего: ваза на столе отображается сквозь вашу руку. Это немедленно разрушает иллюзию.

AROcclusionManager в AR Foundation предоставляет depth texture от сенсора (LiDAR на iPhone Pro, алгоритмическая оценка глубины через камеру на Android). В URP шейдер должен проверять depth texture перед записью фрагмента — это Environment Depth Occlusion.

Настройка: AROcclusionManager.environmentDepthMode = EnvironmentDepthMode.Best (максимальное качество), occlusionPreferenceMode = OcclusionPreferenceMode.PreferEnvironmentOcclusion. На Android без LiDAR глубина оценочная — occlusion работает грубо, с артефактами на краях. На iPhone Pro с LiDAR — точно.

Без кастомного шейдера стандартный URP Lit не использует depth texture AR. Нужен либо ShaderGraph с AROcclusion нодой из AR Foundation Shader Framework, либо кастомный HLSL с ручным depth comparison.

Interaction: тап, drag, масштаб

В AR физических контроллеров нет — взаимодействие через тачскрин. Для объектов в AR стандартный набор:

Tap to select: ARRaycastManager + Physics.Raycast против collider объекта. При попадании — выделение через material change или outline.

Drag (translate): при перемещении пальца — новый AR Raycast возвращает новую позицию плоскости, объект Lerp-ится к ней. Без Lerp объект прыгает. speed = 15f в MoveTowards даёт плавное следование без залипания.

Pinch to scale: Touch[0] и Touch[1] — два пальца. Текущее расстояние между ними vs. предыдущее = scale delta. transform.localScale *= scaleDelta с зажатием в Vector3.one * minScale и maxScale.

Rotation: один палец, drag по горизонтали = rotation вокруг world-up axis. Два пальца, twist = rotation. Для AR рекомендуется ограничивать rotation только вокруг Y-axis — вращение по X или Z ломает ощущение «объект стоит на поверхности».

Сроки: базовый placement + interaction (tap/drag/scale) — 3–5 рабочих дней; full AR experience с Anchors, Occlusion, Persistent Cloud Anchors — 2–4 недели. Стоимость рассчитывается индивидуально после анализа требований.