Back to Blog
AR / AR Foundation
2026-07-20
8 min read

Unity AR Foundation: Plane Detection & Object Placement

Learn how Unity AR Foundation handles plane detection, raycasting, object placement, and basic mobile AR interactions.

ARAR FoundationUnityMobileC#
RR
Rohit Rewani — Unity Developer
Unity • C# • Mobile Games • Multiplayer • AR
Unity AR Foundation: Plane Detection & Object Placement cover visual

The Problem: Cross-Platform AR Complexity

Historically, developing for Augmented Reality required writing two entirely separate codebases: one using Apple's ARKit and another using Google's ARCore. Handling camera tracking, point clouds, and surface meshing natively is notoriously difficult.

Why It Happens

iOS and Android handle spatial computing differently at the OS level. Directly interfacing with these SDKs requires platform-specific compilation and disjointed workflows.

The Solution: Unity AR Foundation

Unity AR Foundation acts as an abstraction layer. It wraps both ARKit and ARCore into a single, unified C# API. By dropping an `AR Session` and an `AR Session Origin` into your scene, Unity handles the heavy lifting of device tracking.

tipEnsure your Android build includes the ARCore XR Plugin, and your iOS build includes the ARKit XR Plugin in the Package Manager.

Code Example: AR Raycasting and Object Placement

The most common AR interaction is tapping the screen to place a 3D object on a detected real-world surface (like a table or floor).

csharp
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

[RequireComponent(typeof(ARRaycastManager))]
public class ARPlacementInteractable : MonoBehaviour {
    public GameObject objectToPlace;
    private ARRaycastManager raycastManager;
    private GameObject spawnedObject;
    
    private static List<ARRaycastHit> hits = new List<ARRaycastHit>();

    void Awake() {
        raycastManager = GetComponent<ARRaycastManager>();
    }

    void Update() {
        // Detect screen touch
        if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) {
            Vector2 touchPosition = Input.GetTouch(0).position;

            // Perform AR Raycast against detected planes
            if (raycastManager.Raycast(touchPosition, hits, TrackableType.PlaneWithinPolygon)) {
                Pose hitPose = hits[0].pose;

                if (spawnedObject == null) {
                    // Instantiate object at the hit location
                    spawnedObject = Instantiate(objectToPlace, hitPose.position, hitPose.rotation);
                } else {
                    // Move existing object
                    spawnedObject.transform.position = hitPose.position;
                    spawnedObject.transform.rotation = hitPose.rotation;
                }
            }
        }
    }
}

Common Mistakes

  • Forgetting to add an `AR Plane Manager` component, resulting in raycasts hitting nothing.
  • Using standard Unity Physics Raycasts instead of `ARRaycastManager`. Standard physics do not interact with the AR point cloud.
  • Failing to scale the instantiated 3D model properly. AR Foundation operates in real-world meters (1 Unity unit = 1 meter).

Best Practices

Provide visual feedback to the user before they tap. Render a 'Placement Indicator' (a simple reticle or target) that updates its position every frame based on the center of the screen's raycast. Only allow object placement when a plane is actively detected.

Related Articles

AR games often utilize high-fidelity 3D assets that can bloat your game. Learn how to optimize these assets in our guide on Reducing Unity Mobile Build Size.

Conclusion

AR Foundation removes the headache of platform-specific AR development. By mastering the `ARRaycastManager` and plane detection, you can build immersive spatial experiences that compile flawlessly to both iOS and Android.