Узнайте, как использовать Instant Placement API или постоянные raycasts в своих приложениях.
Предварительные условия
Прежде чем продолжить, убедитесь, что вы понимаете фундаментальные концепции AR и то, как настроить сеанс ARCore .
Названия концепций
Названия некоторых концепций и методов могут различаться в AR Foundation и ARCore SDK для Unity. Для удобства они перечислены в таблице ниже.
Фонд АР | ARCore SDK для Unity |
Постоянные лучи | Мгновенное размещение |
ARRaycastManager.AddRaycast(Vector2, float) | Frame.RaycastInstantPlacement(float, float, float, out TrackableHit) |
ARRaycast | TrackableHit |
(Нет эквивалента) | InstantPlacementPoint |
ARRaycast.trackingState | InstantPlacementPointTrackingMethod |
Предварительные условия
В этом руководстве предполагается, что вы уже установили и настроили Unity. Если нет, ознакомьтесь с инструкциями по установке и настройке в разделе «Начало работы с расширениями ARCore для AR Foundation» .
Настройте новый сеанс с помощью ARRaycastManager
Мгновенное размещение (постоянные лучи) доступно «из коробки» в пакете AR Foundation. Выполните следующие шаги, чтобы настроить сцену.
AR Фонд 4.x
Добавьте предопределённые игровые объекты AR Session Origin и AR Session .
Добавьте компонент AR Raycast Manager в игровой объект AR Session Origin .
Если Raycast Prefab не равен нулю, ARRaycastManager
создаст экземпляр префаба и автоматически синхронизирует его положение с положением ARRaycast
.
AR Фонд 5.x
Добавьте предопределённые игровые объекты XR Origin и AR Session .
Добавьте компонент AR Raycast Manager в игровой объект XR Origin .
Если Raycast Prefab не равен нулю, ARRaycastManager
создаст экземпляр префаба и автоматически синхронизирует его положение с положением ARRaycast
.
Поместите объект
В новом сеансе ARCore выполните проверку попадания с помощью ARRaycastManager.AddRaycast(Vector2, float)
.
public ARRaycastManager RaycastManager; // set from the Editor Inspector.
void Update()
{
Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)
{
return;
}
if (EventSystem.current.IsPointerOverGameObject(touch.fingerId))
{
return;
}
ARRaycast raycast = 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.
…
}
}
Отслеживайте состояние отслеживания ARRaycast
Если ARCore имеет точную 3D-позу, ARRaycast.trackingState
будет Tracking
. В противном случае он начнется с Limited
и перейдет в Tracking
как только ARCore получит точную трехмерную позу. Как только состояние отслеживания станет Tracking
, оно не вернется к Limited
.