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







