Інтеграція AR Foundation (Unity) в мобільний додаток
AR Foundation — кросс-платформена абстракція Unity поверх ARKit та ARCore. Один код, два білди. Але це не означає, що функціональність ідентична: LiDAR-окклюзія працює тільки на iOS Pro-пристроях, Depth API по ML-моделі — Android-екскльюзив на чипах без ToF. Писати AR Foundation без розуміння цих різниць — отримувати runtime exceptions на половині пристроїв.
Чим AR Foundation відрізняється від прямої інтеграції ARKit/ARCore
AR Foundation версії 6.x (Unity 2023 LTS) покриває всі ключові фічі обох платформ: 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
{
// Fallback: вимикаємо окклюзію або показуємо обмежений режим
occlusionManager.enabled = false;
}
}
Без перевірки descriptor — NotSupportedException на Pixel 5, у якого немає ToF.
Архітектура сцени
AR Foundation будується на компонентах, привязаних до ARSession та XROrigin:
-
ARPlaneManager— виявлення та трекінг площин -
ARRaycastManager— стрільба лучами по tracked geometry -
ARTrackedImageManager— маркерний tracking -
ARAnchorManager— керування lifecycle anchor'ів
Правильне розміщення об'єкта по тапу через 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)
{
// TrackingState.Tracking / Limited / None
SetVisible(updated.referenceImage.name, updated.trackingState == TrackingState.Tracking);
}
}
Продуктивність: Unity + AR = обережно
Unity не найлегша середа для AR. Типові проблеми:
Garbage collector паузи. GC в .NET/Mono зупиняє main thread. При 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-сумісних).
Збірка та публікація
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 з plane detection та розміщенням об'єктів (iOS + Android): від 5 днів. Маркерний AR з бібліотекою зображень та кастомними анімаціями: 1–2 тижні. Повне рішення з окклюзією, face tracking та публікацією в обидві платформи: 3–6 тижнів.







