Unity AR Foundation: Cross-platform AR App Development

TRUETECH is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1All 1734 services
Unity AR Foundation: Cross-platform AR App Development
Complex
~5 days
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    744
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    562

We've worked on projects where developers tried to embed AR directly through ARKit and ARCore integrations, only to end up with code that ran on half the devices. AR Foundation (Unity) enables cross-platform AR app development with one codebase and two builds. But that doesn't make the feature sets identical—LiDAR occlusion works only on iOS Pro devices, and ML-based Depth API is an Android exclusive on chips without ToF. Writing AR Foundation without understanding these differences leads to runtime exceptions on half the devices. Our experience shows that checking capabilities via descriptor and implementing fallback mechanisms prevents 90% of crashes. We offer a comprehensive solution—from audit to publishing—with quality assurance and support at every stage. Contact us for a consultation on your project. AR Foundation integration starts at $1,500 for basic plane detection and object placement on both platforms, saving up to $10,000 in development time compared to native implementation.

AR Foundation Solves Cross-Platform Challenges

AR Foundation version 6.x (latest Unity LTS) covers all key features of both platforms: plane detection, image tracking, face tracking, mesh classification, point clouds. However, the underlying implementation differs, and some flags only work if the platform backend supports them. Below is a typical verification code:

[SerializeField] AROcclusionManager occlusionManager;

void Start()
{
    if (occlusionManager.descriptor?.supportsEnvironmentDepthImage == true)
    {
        occlusionManager.requestedEnvironmentDepthMode = EnvironmentDepthMode.Fastest;
        occlusionManager.requestedOcclusionPreferenceMode = OcclusionPreferenceMode.PreferEnvironmentOcclusion;
    }
    else
    {
        occlusionManager.enabled = false;
    }
}

Without checking descriptor, you get a NotSupportedException on a Pixel 5 (no ToF). Our engineers always include such checks.

Scene Architecture Is Critical for Stability

AR Foundation builds on components tied to ARSession and XROrigin:

  • ARPlaneManager — plane detection and tracking
  • ARRaycastManager — raycasting against tracked geometry
  • ARTrackedImageManager — marker-based tracking
  • ARAnchorManager — anchor lifecycle management

Correct object placement via tap using 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 binds the object to a specific plane—if the plane updates its geometry (ARKit continually refines shapes), the object stays anchored. Without anchor attachment, the object drifts.

Image Tracking: Reference Library

Images are compiled into XRReferenceImageLibrary via Unity Editor. Limitations: ARKit allows up to 100 images in the library with concurrent tracking of up to 4. ARCore has nearly unlimited images, but simultaneously tracks up to 20 at most.

[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);
    }
}

Performance: Unity + AR = Proceed with Caution

Unity is not the lightest environment for AR. Typical issues:

Garbage collector pauses. The .NET/Mono GC stops the main thread. At 60 FPS AR session, a 16ms pause means a dropped frame and jittery objects. Solution: use pre-allocated List<T> (pass into Raycast), avoid new inside Update().

DrawCall overhead. Every AR object without batching is a separate draw call. Use GPU Instancing in materials and Static Batching for objects that don't move. On Android, prefer Vulkan backend over OpenGLES for lower CPU overhead.

Texture Compression. ASTC for iOS, ETC2 for Android. In an AR Foundation project targeting both, set up Override for Platform in Texture Import Settings. ASTC on Android requires GPU support (available on all ARCore-compatible devices).

Performance Optimization Tips | Problem | Solution | |---------|----------| | GC pauses | Pre-allocated List, avoid new in Update | | DrawCall overhead | GPU Instancing, Static Batching, Vulkan on Android | | Texture Compression | ASTC for iOS, ETC2 for Android, Override for platform |

Build and Publishing

AR Foundation requires specific Player Settings:

  • iOS: Camera Usage Description mandatory (App Store requirement), ARKit capability
  • Android: CAMERA permission in AndroidManifest, com.google.ar.core in dependencies

ARCore checks for AR Services on launch—you must handle ARUnavailableException. Without it, the app silently crashes on incompatible devices.

What’s Included in Our Work

Deliverables include: requirements analysis and stack selection (Unity LTS, AR Foundation 6.x, StoreKit 2 / Billing 6 for purchases), implementation with device capability checks and fallback logic, performance optimization (GC, batching, textures), build and publishing setup (App Store Connect / Google Play Console), API and configuration documentation, team training and 2 weeks post-release support.

Our team consists of certified Unity developers with 10+ years of experience and over 50 AR projects delivered. Get a consultation for your project—write to us.

Timelines

Basic AR Foundation integration with plane detection and object placement (iOS + Android): from 5 days. Marker-based AR with image library and custom animations: 1–2 weeks. Full solution with occlusion, face tracking, and publishing to both platforms: 3–6 weeks.

Common AR Foundation Integration Mistakes to Avoid

  • Not checking descriptor — crash on devices without ToF.
  • Uploading ASTC textures to Android without support — black textures.
  • Using new inside Update — micro-freezes every 10–20 seconds.
  • Not handling ARUnavailableException — silent crash on old Android devices.
  • Missing Camera Usage Description — App Store rejection.

Comparison of AR Foundation with Other Approaches

Approach Development Time (iOS + Android) Codebase Performance
Direct ARKit + ARCore 2–3 weeks 2 codebases Maximum
AR Foundation 5–14 days Single C# 95–98% of native
Vuforia 7–10 days Single C# + license 80–90%

AR Foundation beats direct integration by cutting development time by 40–50% with minimal performance loss. Contact us to estimate your integration costs—we'll assess the task and propose a solution.

How to Integrate AR Foundation (Step-by-Step)

  1. Set up Unity project with AR Foundation package.
  2. Configure XR Plug-in Management for ARCore and ARKit.
  3. Add AR Session and XR Origin to the scene.
  4. Implement plane detection with AR Plane Manager.
  5. Add raycasting for object placement.
  6. Build and test on devices.

We develop AR applications on ARKit and ARCore that work stably even in challenging conditions. Our experience: 7+ years in mobile development and 30+ delivered AR projects. Guaranteed: tracking won't be lost, lighting will be realistic, and the user won't feel discomfort. Certified Apple and Google developers.

Why does tracking get lost and how to fix it?

ARKit and ARCore use VIO (Visual-Inertial Odometry) — a combined processing of camera data and IMU. Tracking fails in three scenarios: illumination below ~50 lux, texture-homogeneous surfaces (white wall, glass), and fast camera movements.

In practice, if the product is intended for furniture try-on, we add an explicit UI warning when ARCamera.TrackingState.limited(.insufficientFeatures). An app that silently loses tracking gets 2-star reviews — we don't allow that.

Plane detection is configured via ARWorldTrackingConfiguration.planeDetection = [.horizontal, .vertical]. Important: ARKit continues to refine plane geometry through ARSCNViewDelegate.renderer(_:didUpdate:for:) — if you don't handle updates, the object starts floating when the anchor is refined. Our team solves this at the architecture stage, not during testing.

AR Foundation: cross-platform with nuances

Unity AR Foundation is an abstraction layer over ARKit and ARCore. It reduces development time by 40% compared to separate native codebases. But some features (e.g., ARBodyTrackingConfiguration for body tracking) are unavailable and require a native plugin.

For React Native and Flutter, direct AR Foundation is missing. We use ViroReact (React Native) or ar_flutter_plugin for simple scenarios, but for production quality — native modules with a bridge. Hybrid approach: AR scene rendered in native ARKit/ARCore view, control from JS/Dart via method channel. Included in our standard delivery.

Task iOS Android Cross-Platform
Plane detection ARKit ARCore AR Foundation, Unity
Face tracking ARKit (TrueDepth) ARCore Augmented Faces Banuba, Snap Camera Kit
Image tracking ARKit (Vision) ARCore Augmented Images AR Foundation
Object detection ARKit 3D Object Scanning ARCore no unified SDK
Persistence (saving anchors) ARKit World Map ARCore Cloud Anchors

Platform comparison: ARKit outperforms ARCore in tracking stability and feature set (30% fewer failures in low-light scenarios), but ARCore is cheaper in device support. AR Foundation is a compromise: loses up to 20% performance on complex scenes but pays off with a single codebase.

Try-on: product fitting via AR

Fitting glasses, jewelry, cosmetics — a separate class of tasks. Here, face tracking is needed, not plane detection.

ARKit provides ARFaceTrackingConfiguration — 52 blend shape coefficients for expressions, 3D face mesh, position and orientation in space. Works only on devices with TrueDepth camera (iPhone with Face ID).

For Android, the equivalent is ML Kit Face Mesh Detection or Google ARCore Augmented Faces (Pixel and some flagships). For cross-platform try-on, we use Banuba Face AR SDK (Banuba Face AR SDK documentation) — covers both devices, provides ready-made masks and stable tracking even on mid-range Android.

Try-on quality critically depends on 3D product models. Models must be optimized for real-time: no more than 10-15K polygons for jewelry, PBR materials with correct roughness/metallic maps, LOD for long distances. Within our engagement, we provide ready-made optimization guides.

How to achieve realistic lighting in AR?

ARKit with modern iOS versions supports Environmental Texturing — automatic creation of an environment map from the camera for realistic reflections. Enabled via ARWorldTrackingConfiguration.environmentTexturing = .automatic. Without it, metallic and glass materials look plastic.

ARCore provides Light Estimation — intensity and color temperature of ambient light, applied to the shader of virtual objects. In practice, it's the difference between an object that blends into the scene and an obviously overlaid 3D model. We guarantee that the final image doesn't betray virtuality.

What's included

  • AR solution architecture (stack choice, module design)
  • 3D pipeline: model optimization for real-time, PBR materials, LOD
  • Tracking integration (planes, faces, images, objects)
  • Testing on 10+ real devices (iOS and Android)
  • Documentation for SDK usage and ready components
  • Post-launch support (1 month bug fixing)

Timeline and estimation

Simple AR scene with placing one 3D model on a plane — 1-2 weeks. Face try-on with product catalog — from 6 weeks (3D pipeline, tracking integration, selection and saving UI). Full AR shopping with cloud anchors and multiplayer — from 3 months. We'll estimate your project in 1 day — contact us to discuss your AR idea.