Разработка AR-механик взаимодействия (AR Foundation) для iOS и Android

Представьте: пользователь наводит камеру на стол, объект размещается, но через секунду его уносит на 3 см в сторону. Или объект прорисовывается сквозь руку — occlusion не работает. Согласно нашим замерам, 70% пользователей закрывают приложение, если виртуальный объект дёргается или «плывёт». Это пос

Наши компетенции

Другие услуги студии

VR/AR/MR приложения на заказ

Впечатляйте клиентов и обучайте команду в виртуальной реальности

Разработка игр на Unity

От идеи до релиза — игры, которые запоминаются

3D-моделирование и анимация

Оживим ваш продукт в объёмной графике и анимации

VR-тренажёры промышленного оборудования

Тренируем операторов на технике без риска и простоя

AR-инструкции для производства

Пошаговые подсказки прямо на оборудовании — без бумаги

Safety-тренажёры

Отработка ЧС и техники безопасности без выхода на объект

VR/AR-тренинги

Обучаем персонал сервису, адаптации и soft skills в VR

Обучающие викторины

Проверка знаний в формате игры — легко и без стресса

Корпоративные видеоинструкции

Понятные ролики для обучения сотрудников и клиентов

Геймификация бизнес-процессов

Мотивируем команду через игровые механики в KPI и HR

Приложения для инфокиосков

Интерактивные экраны для магазинов, стендов и офисов

VR/AR-инсталляции

Wow-эффект для брендов на выставках, ивентах и в шоу-румах

Виртуальные выставки и музеи

Ваша экспозиция доступна из любой точки мира — 24/7

Event-квесты и брендированные игры

Запоминающиеся игры для конференций и клиентских ивентов

Часто задаваемые вопросы

Последние работы

  • image_games_mortal_motors_495_0.webp
    Разработка игры для компании Mortal Motors
    1505
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Пошаговая стратегия в фэнтези сеттинге With Fire And Sword
    1006
  • image_games_second_team_604_0.webp
    Разработка игры для компании Second term
    635
  • image_games_phoenix_ii_606_0.webp
    3D-анимация — тизер для игры phoenix 2.
    716
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Обучающая викторина для детей «Покупки в магазине»
    95

Представьте: пользователь наводит камеру на стол, объект размещается, но через секунду его уносит на 3 см в сторону. Или объект прорисовывается сквозь руку — occlusion не работает. Согласно нашим замерам, 70% пользователей закрывают приложение, если виртуальный объект дёргается или «плывёт». Это последствия неграмотной работы с AR Foundation — абстракцией над ARKit (iOS) и ARCore (Android). За 5 лет на рынке AR мы реализовали более 50 коммерческих проектов: от каталогов мебели до промышленных инструкций. Наш опыт показывает, что без тщательной настройки raycast, якорей и occlusion даже простой placement разочаровывает пользователя.

Какие механики мы реализуем?

ARRaycastManager.Raycast() — основа размещения. Стандартная ошибка: вызывать Raycast каждый кадр в Update без debounce. На сложных сценах ARCore тратит 2–4 мс на raycast — это съедает бюджет FPS. Правильно: raycast только при изменении позиции пальца с threshold 5–10 пикселей. Если плоскость ещё не обнаружена (ARCore и ARKit детектируют горизонтальные плоскости за 2–5 секунд на хорошей текстуре, а на однотонном белом столе — никогда), нужен feedback UI: индикатор поиска и инструкция «подвигайте камерой над поверхностью».

ARAnchor — это точка, которую AR-система обязуется отслеживать и корректировать автоматически. В AR Foundation: ARAnchorManager.TryAddAnchorAsync(pose) возвращает ARAnchor, к которому крепится контент. Для сохранения между сессиями используем ARCore Cloud Anchors (Android) или ARKit WorldMap (iOS).

AROcclusionManager предоставляет depth-текстуру от сенсора. Настройка: environmentDepthMode = EnvironmentDepthMode.Best, occlusionPreferenceMode = OcclusionPreferenceMode.PreferEnvironmentOcclusion. На Android без LiDAR глубина оценочная — occlusion работает грубо, с артефактами. На iPhone Pro с LiDAR — точно. Без кастомного шейдера стандартный URP Lit не использует depth-текстуру AR. Нужен ShaderGraph с нодой AROcclusion из AR Foundation Shader Framework или кастомный HLSL с ручным depth comparison.

Взаимодействие через тачскрин — стандартный набор: tap (выбор через ARRaycastManager + Physics.Raycast), drag (перемещение с Lerp-интерполяцией к новой позиции плоскости, скорость 15f в MoveTowards), pinch-to-scale (два пальца, transform.localScale *= scaleDelta с ограничениями) и rotation (один палец по горизонтали — вокруг Y-axis, twist двумя пальцами). Для AR rotation лучше ограничивать только осью Y — вращение по X или Z ломает ощущение «объект стоит на поверхности».

Почему ARAnchor важен для стабильности?

Без якоря при улучшении трекинга объект сдвигается на несколько сантиметров — это разрушает иллюзию. ARAnchor гарантирует, что позиция корректируется системой. На практике: при переоткрытии сцены (например, пользователь выходил из приложения) якоря можно восстановить через Cloud Anchors или WorldMap. Без якорей пользователи жалуются на «дрожание» объектов уже на второй минуте использования. Внедрение Cloud Anchors снижает количество жалоб на нестабильность в 3 раза по нашим данным.

Как добиться стабильного размещения?

Используйте алгоритм с debounce и кэшированием последнего хита Raycast. Пример оптимизированного кода:

private Vector2 lastTouchPos; private float lastRaycastTime; private ARRaycastHit lastHit; void Update() { if (Input.touchCount == 1) { Touch touch = Input.GetTouch(0); if (touch.phase == TouchPhase.Moved) { float dist = Vector2.Distance(touch.position, lastTouchPos); if (dist > 5f && Time.time - lastRaycastTime > 0.01f) { PerformRaycast(touch.position); lastTouchPos = touch.position; lastRaycastTime = Time.time; } } } } void PerformRaycast(Vector2 screenPos) { List<ARRaycastHit> hits = new List<ARRaycastHit>(); arRaycastManager.Raycast(screenPos, hits, TrackableType.Planes); if (hits.Count > 0) { lastHit = hits[0]; targetPosition = lastHit.pose.position; } } 

Этот подход уменьшает нагрузку на процессор и обеспечивает плавное движение объекта за счёт интерполяции MoveTowards.

Сравнение механик на iOS и Android

Механика iOS (ARKit + LiDAR) Android (ARCore) Комментарий
Обнаружение плоскостей 1–3 с, высокая точность 2–5 с, хуже на однотонных поверхностях На Android требуется контрастная текстура
Occlusion Точное, LiDAR depth Грубое, оценочное На iPhone Pro — 4x точнее
Cloud Anchors Через ARKit WorldMap Через ARCore Cloud Anchors Оба требуют интернета
Производительность 60 FPS стабильно 30–60 FPS в зависимости от устройства На Android бюджет жестче

Сравнение методов raycast

Метод Время (мс) Применимость
ARRaycastManager.Raycast() 2–4 Каждый кадр при движении пальца с threshold
Physics.Raycast в AR-пространстве 0.5–1 Только после валидации через ARRaycast
Кастомный hit-test 1–3 Для точного прилипания к граням

Как настроить occlusion с кастомным шейдером?

Мы используем ShaderGraph: добавляем узел AR Occlusion из папки AR Foundation. На вход подаем depth-текстуру от AROcclusionManager, на выход — alpha-маску для объекта. Если нужна полная непрозрачность только при большом различии глубины, добавляем Step ноду с порогом 0.05 метра. Это снижает артефакты на Android. Для iOS с LiDAR достаточно стандартного режима EnvironmentDepthMode.Best. Подробнее о настройке occlusion читайте в документации AR Foundation.

Что входит в работу?

  • Прототип с базовым placement (3–5 дней)
  • Полный набор жестов (tap, drag, scale, rotation) с оптимизацией raycast
  • Настройка occlusion с кастомным шейдером под URP
  • Интеграция Cloud Anchors / WorldMap для персистентности
  • Тестирование на 3–5 реальных устройствах (разные версии iOS/Android)
  • Документация по сборке и поддержке
  • Обучение команды заказчика основам доработки

Мы гарантируем стабильность механик: после внедрения якорей и оптимизации raycast жалобы на «плавание» объектов снижаются более чем на 80%. Свяжитесь с нами для обсуждения — получите консультацию инженера с 10+ летним опытом в AR. Закажите разработку AR-механик под ключ.