Мы не раз сталкивались с проектами, где разработчики пытались встроить AR в приложение через прямую интеграцию ARKit и ARCore, а в итоге получали код, который работал только на половине устройств. AR Foundation — кросс-платформенная абстракция Unity поверх ARKit и ARCore. Один код, два билда. Но это не значит, что функциональность идентична: LiDAR-окклюзия работает только на iOS Pro-устройствах, Depth API по ML-модели — Android-эксклюзив на чипах без ToF. Писать AR Foundation без понимания этих различий — получать runtime exceptions на половине устройств. Наш опыт показывает: проверка возможностей через descriptor и fallback-механизмы спасают от 90% крашей. Мы предлагаем комплексное решение — от аудита до публикации — с гарантией качества и поддержкой на всех этапах. Свяжитесь с нами для консультации по вашему проекту.
Как AR Foundation решает проблему кроссплатформенности?
AR Foundation версии 6.x (последняя LTS-версия Unity) покрывает все ключевые фичи обеих платформ: plane detection, image tracking, face tracking, mesh classification, point clouds. Но реализация под капотом разная, и некоторые флаги работают только если поддерживает платформенный бэкенд. Ниже — типичный проверочный код:
[SerializeField] AROcclusionManager occlusionManager; void Start() { if (occlusionManager.descriptor?.supportsEnvironmentDepthImage == true) { occlusionManager.requestedEnvironmentDepthMode = EnvironmentDepthMode.Fastest; occlusionManager.requestedOcclusionPreferenceMode = OcclusionPreferenceMode.PreferEnvironmentOcclusion; } else { occlusionManager.enabled = false; } } Без проверки descriptor — NotSupportedException на Pixel 5, у которого нет ToF. Наши инженеры всегда включают такие проверки.
Почему архитектура сцены критична для стабильности?
AR Foundation строится на компонентах, привязанных к ARSession и XROrigin:
-
ARPlaneManager— обнаружение и трекинг плоскостей -
ARRaycastManager— стрельба лучами по tracked geometry -
ARTrackedImageManager— маркерный tracking -
ARAnchorManager— управление anchor lifecycle
Правильное размещение объекта по тапу через ARRaycastManager:
[SerializeField] ARRaycastManager raycastManager; [SerializeField] ARAnchorManager anchorManager; [SerializeField] GameObject prefabToPlace; private List<ARRaycastHit> hits = new List<ARRaycastHit>(); void Update() { if (Input.touchCount == 0) return; var touch = Input.GetTouch(0); if (touch.phase != TouchPhase.Began) return; if (raycastManager.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon)) { var hitPose = hits[0].pose; var anchor = anchorManager.AttachAnchor( hits[0].trackable as ARPlane, hitPose ); Instantiate(prefabToPlace, anchor.transform); } } AttachAnchor привязывает объект к конкретной плоскости — если плоскость обновит свою геометрию (ARKit постоянно уточняет форму), объект останется на ней. Без привязки к anchor объект дрейфует.
Image Tracking: референсная библиотека
Изображения компилируются в XRReferenceImageLibrary через Unity Editor. Ограничения: ARKit допускает до 100 изображений в библиотеке с одновременным трекингом до 4. ARCore — практически без ограничений по числу, но одновременно тоже до 20 штук максимум.
[SerializeField] ARTrackedImageManager trackedImageManager; void OnEnable() => trackedImageManager.trackablesChanged.AddListener(OnImageChanged); void OnDisable() => trackedImageManager.trackablesChanged.RemoveListener(OnImageChanged); void OnImageChanged(ARTrackablesChangedEventArgs<ARTrackedImage> args) { foreach (var added in args.added) { SpawnContent(added.referenceImage.name, added.transform); } foreach (var updated in args.updated) { SetVisible(updated.referenceImage.name, updated.trackingState == TrackingState.Tracking); } } Производительность: Unity + AR = осторожно
Unity не самая лёгкая среда для AR. Типичные проблемы:
Garbage collector паузы. GC в .NET/Mono останавливает мейн-треад. При 60 FPS AR-сессии пауза в 16ms — это пропущенный кадр и дёргание объектов. Решение: использовать List<T> с предварительно выделенной ёмкостью (передавать в Raycast), избегать new внутри Update().
DrawCall overhead. Каждый AR-объект без batching — отдельный drawcall. GPU Instancing в материале + Static batching там где объекты не двигаются. На Android — Vulkan backend вместо OpenGLES для меньшего CPU overhead.
Texture Compression. ASTC для iOS и ETC2 для Android. В AR Foundation проект под оба таргета — настраивать Override for platform в Texture Import Settings. ASTC на Android требует GPU поддержки (есть на всех ARCore-совместимых).
| Проблема | Решение |
|---|---|
| GC паузы | Pre-allocated List, избегать new в Update |
| DrawCall overhead | GPU Instancing, Static batching, Vulkan на Android |
| Texture Compression | ASTC для iOS, ETC2 для Android, Override for platform |
Сборка и публикация
AR Foundation требует отдельных настроек в Player Settings:
- iOS:
Camera Usage Descriptionобязателен (требует App Store),ARKitcapability - Android:
CAMERApermission в AndroidManifest,com.google.ar.coreв dependencies
ARCore проверяет наличие AR Services при запуске — нужна обработка ARUnavailableException. Без неё — молчаливый краш на несовместимых устройствах.
Что входит в работу
При заказе интеграции AR Foundation под ключ вы получаете:
- Анализ требований и выбор стека (Unity LTS, AR Foundation 6.x, StoreKit 2 / Billing 6 для покупок)
- Реализация с проверкой возможностей устройств и fallback-логикой
- Оптимизация производительности (GC, batching, текстуры)
- Настройка сборки и публикации (App Store Connect / Google Play Console)
- Документация по API и конфигурации
- Обучение команды и поддержка в течение 2 недель после релиза
Наша команда — сертифицированные Unity-разработчики с 10+ лет опыта и более 50 реализованных AR-проектов. Получите консультацию по вашему проекту — напишите нам.
Сроки
Базовая интеграция AR Foundation с plane detection и размещением объектов (iOS + Android): от 5 дней. Маркерный AR с библиотекой изображений и кастомными анимациями: 1–2 недели. Полное решение с окклюзией, face tracking и публикацией в обе платформы: 3–6 недель.
Как избежать типичных ошибок при интеграции AR Foundation?
- Не проверяли descriptor — краш на устройствах без ToF.
- Залили ASTC-текстуры на Android без поддержки — чёрные текстуры.
- Использовали
newвнутриUpdate— микрофризы каждые 10-20 секунд. - Не обработали
ARUnavailableException— молчаливый вылет на старых Android. - Не указали
Camera Usage Description— App Store rejected.
Сравнение AR Foundation с другими подходами
| Подход | Время разработки (iOS + Android) | Кодовая база | Производительность |
|---|---|---|---|
| Прямая интеграция ARKit + ARCore | 2-3 недели | 2 кодовые базы | Максимальная |
| AR Foundation | 5-14 дней | Единый C# | 95-98% от нативной |
| Vuforia | 7-10 дней | Единый C# + лицензия | 80-90% |
AR Foundation лучше прямой интеграции тем, что снижает время разработки примерно на 40-50% при минимальной потере производительности. Свяжитесь с нами для расчета стоимости интеграции — оценим задачу и предложим решение.







