您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
88 行
2.7 KiB
88 行
2.7 KiB
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.XR.ARFoundation;
|
|
using UnityEngine.XR.ARSubsystems;
|
|
|
|
namespace UnityEngine.XR.ARFoundation.Samples
|
|
{
|
|
/// <summary>
|
|
/// Listens for touch events and performs an AR raycast from the screen touch point.
|
|
/// AR raycasts will only hit detected trackables like feature points and planes.
|
|
///
|
|
/// If a raycast hits a trackable, the <see cref="placedPrefab"/> is instantiated
|
|
/// and moved to the hit position.
|
|
/// </summary>
|
|
[RequireComponent(typeof(ARRaycastManager))]
|
|
public class PlaceOnPlane : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
[Tooltip("Instantiates this prefab on a plane at the touch location.")]
|
|
GameObject m_PlacedPrefab;
|
|
|
|
/// <summary>
|
|
/// The prefab to instantiate on touch.
|
|
/// </summary>
|
|
public GameObject placedPrefab
|
|
{
|
|
get { return m_PlacedPrefab; }
|
|
set { m_PlacedPrefab = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// The object instantiated as a result of a successful raycast intersection with a plane.
|
|
/// </summary>
|
|
public GameObject spawnedObject { get; private set; }
|
|
|
|
void Awake()
|
|
{
|
|
m_RaycastManager = GetComponent<ARRaycastManager>();
|
|
}
|
|
|
|
bool TryGetTouchPosition(out Vector2 touchPosition)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (Input.GetMouseButton(0))
|
|
{
|
|
var mousePosition = Input.mousePosition;
|
|
touchPosition = new Vector2(mousePosition.x, mousePosition.y);
|
|
return true;
|
|
}
|
|
#else
|
|
if (Input.touchCount > 0)
|
|
{
|
|
touchPosition = Input.GetTouch(0).position;
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
touchPosition = default;
|
|
return false;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (!TryGetTouchPosition(out Vector2 touchPosition))
|
|
return;
|
|
|
|
if (m_RaycastManager.Raycast(touchPosition, s_Hits, TrackableType.PlaneWithinPolygon))
|
|
{
|
|
// Raycast hits are sorted by distance, so the first one
|
|
// will be the closest hit.
|
|
var hitPose = s_Hits[0].pose;
|
|
|
|
if (spawnedObject == null)
|
|
{
|
|
spawnedObject = Instantiate(m_PlacedPrefab, hitPose.position, hitPose.rotation);
|
|
}
|
|
else
|
|
{
|
|
spawnedObject.transform.position = hitPose.position;
|
|
}
|
|
}
|
|
}
|
|
|
|
static List<ARRaycastHit> s_Hits = new List<ARRaycastHit>();
|
|
|
|
ARRaycastManager m_RaycastManager;
|
|
}
|
|
}
|