Names of certain concepts and methods may differ between AR Foundation and the
ARCore SDK for Unity. These are listed in the table below for easy reference.
publicARRaycastManagerRaycastManager;// set from the Editor Inspector.voidUpdate(){Touchtouch;if(Input.touchCount < 1||(touch=Input.GetTouch(0)).phase!=TouchPhase.Began){return;}if(EventSystem.current.IsPointerOverGameObject(touch.fingerId)){return;}ARRaycastraycast=RaycastManager.AddRaycast(touch.position,_estimateDistance);if(raycast!=null){// You can instantiate a 3D object here if you haven’t set Raycast Prefab in the scene.…}}
Monitor the ARRaycast tracking state
If ARCore has an accurate 3D pose, the ARRaycast.trackingState will be Tracking.
Otherwise, it will start with Limited
and transition to Tracking once ARCore has an accurate 3D pose. Once the tracking state becomes Tracking,
it will not revert to
Limited.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-07-14 UTC."],[[["\u003cp\u003eLearn to use the Instant Placement API or persistent raycasts in your AR apps.\u003c/p\u003e\n"],["\u003cp\u003eUnderstand fundamental AR concepts and ARCore session configuration as prerequisites.\u003c/p\u003e\n"],["\u003cp\u003eSet up your scene with AR Session Origin, AR Session, and AR Raycast Manager components.\u003c/p\u003e\n"],["\u003cp\u003ePlace objects by performing hit tests using \u003ccode\u003eARRaycastManager.AddRaycast\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eMonitor the \u003ccode\u003eARRaycast\u003c/code\u003e tracking state to determine the accuracy of the 3D pose.\u003c/p\u003e\n"]]],[],null,["# Instant Placement developer guide for AR Foundation\n\nLearn how to use the\n[Instant Placement API](/ar/develop/unity-arf/instant-placement/overview), or\n[persistent raycasts](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/manual/raycast-manager.html#persistent-raycasts), in your own apps.\n\nPrerequisites\n-------------\n\nMake sure that you understand [fundamental AR concepts](/ar/develop/fundamentals)\nand how to [configure an ARCore session](/ar/develop/unity-arf/session-config) before proceeding.\n\nConcept names\n-------------\n\nNames of certain concepts and methods may differ between AR Foundation and the\nARCore SDK for Unity. These are listed in the table below for easy reference.\n\n|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **AR Foundation** | **ARCore SDK for Unity** |\n| [Persistent raycasts](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/manual/raycast-manager.html#:~:text=Persistent%20raycasts,ARRaycastManager%20component%20from%20script%20code.) | Instant Placement |\n| [ARRaycastManager.AddRaycast(Vector2, float)](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/manual/raycast-manager.html#persistent-raycasts) | [Frame.RaycastInstantPlacement(float, float, float, out TrackableHit)](https://developers.google.com/ar/reference/unity/class/GoogleARCore/Frame#raycastinstantplacement) |\n| [ARRaycast](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARRaycast.html) | [TrackableHit](https://developers.google.com/ar/reference/unity/struct/GoogleARCore/TrackableHit) |\n| (No equivalence) | [InstantPlacementPoint](https://developers.google.com/ar/reference/unity/class/GoogleARCore/InstantPlacementPoint) |\n| [ARRaycast.trackingState](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARTrackable-2.html#UnityEngine_XR_ARFoundation_ARTrackable_2_trackingState) | [InstantPlacementPointTrackingMethod](https://developers.google.com/ar/reference/unity/class/GoogleARCore/InstantPlacementPoint?#trackingmethod) |\n\nPrerequisites\n-------------\n\nThis guide assumes you have already installed and configured Unity. If not, see\nthe [Getting started with ARCore Extensions for AR Foundation](/ar/develop/unity-arf/getting-started-extensions)\nfor installation and setup steps.\n\nConfigure a new session with `ARRaycastManager`\n-----------------------------------------------\n\nInstant Placement (persistent raycasts) is available out of the box with the AR\nFoundation package. Follow these steps to set up your scene. \n\n### AR Foundation 4.x\n\n\u003cbr /\u003e\n\n1. Add the predefined game objects **AR Session Origin** and\n **AR Session**.\n\n2. Add the **AR Raycast Manager** component into the\n **AR Session Origin** game object.\n\nWhen Raycast Prefab is not null, [`ARRaycastManager`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/manual/raycast-manager.html)\nwill instantiate the prefab and automatically sync its pose with the pose of\n[`ARRaycast`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARRaycast.html).\n\n\u003cbr /\u003e\n\n### AR Foundation 5.x\n\n\u003cbr /\u003e\n\n1. Add the predefined game objects **XR Origin** and\n **AR Session**.\n\n2. Add the **AR Raycast Manager** component into the\n **XR Origin** game object.\n\nWhen Raycast Prefab is not null, [`ARRaycastManager`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/manual/raycast-manager.html)\nwill instantiate the prefab and automatically sync its pose with the pose of\n[`ARRaycast`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARRaycast.html).\n\n\u003cbr /\u003e\n\n### AR Foundation 6.x\n\n\u003cbr /\u003e\n\n1. Add the predefined game objects **XR Origin** and\n **AR Session**.\n\n2. Add the **AR Raycast Manager** component into the\n **XR Origin** game object.\n\nWhen Raycast Prefab is not null, [`ARRaycastManager`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/manual/raycast-manager.html)\nwill instantiate the prefab and automatically sync its pose with the pose of\n[`ARRaycast`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARRaycast.html).\n\n\u003cbr /\u003e\n\nPlace an object\n---------------\n\nIn a new ARCore session, perform a hit test using\n[`ARRaycastManager.AddRaycast(Vector2, float)`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARRaycastManager.html#UnityEngine_XR_ARFoundation_ARRaycastManager_AddRaycast_UnityEngine_Vector2_System_Single_). \n\n public ARRaycastManager RaycastManager; // set from the Editor Inspector.\n\n void Update()\n {\n Touch touch;\n if (Input.touchCount \u003c 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)\n {\n return;\n }\n\n if (EventSystem.current.IsPointerOverGameObject(touch.fingerId))\n {\n return;\n }\n\n ARRaycast raycast = RaycastManager.AddRaycast(touch.position, _estimateDistance);\n if (raycast != null)\n {\n // You can instantiate a 3D object here if you haven't set Raycast Prefab in the scene.\n ...\n }\n }\n\nMonitor the ARRaycast tracking state\n------------------------------------\n\nIf ARCore has an accurate 3D pose, the [`ARRaycast.trackingState`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARTrackable-2.html#UnityEngine_XR_ARFoundation_ARTrackable_2_trackingState) will be [`Tracking`](https://docs.unity3d.com/Packages/com.unity.xr.arsubsystems@4.2/api/UnityEngine.XR.ARSubsystems.TrackingState.html).\nOtherwise, it will start with [`Limited`](https://docs.unity3d.com/Packages/com.unity.xr.arsubsystems@4.2/api/UnityEngine.XR.ARSubsystems.TrackingState.html)\nand transition to [`Tracking`](https://docs.unity3d.com/Packages/com.unity.xr.arsubsystems@4.2/api/UnityEngine.XR.ARSubsystems.TrackingState.html) once ARCore has an accurate 3D pose. Once the tracking state becomes [`Tracking`](https://docs.unity3d.com/Packages/com.unity.xr.arsubsystems@4.2/api/UnityEngine.XR.ARSubsystems.TrackingState.html),\nit will not revert to\n[`Limited`](https://docs.unity3d.com/Packages/com.unity.xr.arsubsystems@4.2/api/UnityEngine.XR.ARSubsystems.TrackingState.html)."]]