Мы не раз сталкивались с проектами, где разработчики пытались встроить 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% при минимальной потере производительности. Свяжитесь с нами для расчета стоимости интеграции — оценим задачу и предложим решение.







