Unity开发ARFoundation相关应用首先安装ARFoundation包
然后设置XR
1.基础AR场景框架搭建
2.一个基本的点击克隆物体到识别的平面脚本
挂在XROrigin上
脚本AppController 脚本说明书
## 业务逻辑
`AppController` 脚本旨在实现一个基本的 AR 应用程序功能:用户通过触摸屏幕选择位置,然后在这个位置上克隆并放置一个预制的游戏对象。这个功能在 AR 应用程序中很常见,例如在游戏、教育或设计应用程序中,用户可以在现实世界的位置上放置虚拟物体。
代码:
using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
[RequireComponent(typeof(ARRaycastManager))]//当你在脚本中使用 [RequireComponent] 属性时,Unity编辑器会在编辑模式下自动检查并确保该组件存在于游戏对象上。如果该组件不存在,Unity会提示你添加它。这有助于避免在运行时出现错误,因为如果脚本依赖于某个组件,而该组件没有出现在游戏对象上,那么在游戏运行时尝试访问该组件的任何尝试都会导致错误或异常。
public class AppController : MonoBehaviour
{
// 主要实现了用户点击位置,克隆游戏物体
//1.获取用户点击位置,发射射线,碰撞到平面,返回坐标,克隆物体在此
public GameObject OnePrefab;//将来被克隆放置的预制体
static List<ARRaycastHit> ManyHits;//存储很多个 撞击物体后的相关信息
private ARRaycastManager OneRaycastManager;//存储射线发射器组件
private GameObject TempObj = null;//用户点击地面后!存储克隆在地面上被放置的物体
void Start()
{
ManyHits = new List<ARRaycastHit>();//声明投射
OneRaycastManager = this.gameObject.GetComponent<ARRaycastManager>();//获取脚本所在物体的ARRaycastManager组件
}
// 获取用户点击行为,
void Update()
{
if (Input.touchCount == 0)//如果点击0
{
return;
}
// 获取第一个触摸点的信息
Touch OneTouch = Input.GetTouch(0);//获取第一个触摸点
//开始声明射线然后投射出去,物理引擎是用physic.Raycast。这里用ARRaycastManager投射,就像人扔东西一样
//一边发射一边判断是否射中平面
if (OneRaycastManager.Raycast(OneTouch.position, ManyHits, TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds))
{
//AR射线管理器组件向触摸点的位置发射一根射线并且击中平面,射线追踪类型为虚拟多边形平面目标类型
Debug.Log("射线发射成功, /射线击中了边界内的平面开始处理命中结果");
Pose FirstHitPose = ManyHits[0].pose;//存储第一个击中目标信息,包括对方名字、交叉点坐标
//开始克隆
if (TempObj == null)
{
TempObj = GameObject.Instantiate(OnePrefab, FirstHitPose.position, FirstHitPose.rotation);
}
else
{
TempObj.transform.position = FirstHitPose.position;
}
//为了防止重复点击,重复克隆,可以判断TempObj 是不是空
}
}
}
## 程序逻辑
1. **组件依赖**:
- 脚本使用 `[RequireComponent(typeof(ARRaycastManager))]` 属性来确保游戏对象上存在 `ARRaycastManager` 组件。这个组件是 AR Foundation 的一部分,用于处理射线检测和跟踪。
2. **变量声明**:
- `OnePrefab` 是一个公共变量,用于存储将要被克隆的预制体。
- `ManyHits` 是一个静态列表,用于存储射线检测的结果。
- `OneRaycastManager` 是 `ARRaycastManager` 类型的变量,用于存储获取到的 `ARRaycastManager` 组件。
- `TempObj` 是一个 `GameObject` 类型的变量,用于存储克隆后放置在地面上的物体。
3. **初始化**:
- 在 `Start` 方法中,脚本初始化 `ManyHits` 列表,并获取 `ARRaycastManager` 组件。
4. **射线检测与克隆**:
- 在 `Update` 方法中,脚本首先检查是否有触摸事件发生(`Input.touchCount`)。
- 如果有触摸事件,脚本获取第一个触摸点的信息,并使用 `OneRaycastManager` 进行射线检测。
- 如果射线检测成功击中平面(`TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds`),脚本将获取第一个命中点的 `Pose`。
- 脚本随后检查 `TempObj` 是否为空。如果是空的,意味着这是第一次点击,脚本将实例化一个新的游戏对象并放置在命中点位置。
- 如果 `TempObj` 不为空,脚本将更新其位置到新的命中点。
## 核心算法介绍
1. **射线检测**:
- `ARRaycastManager.Raycast` 方法用于从用户触摸点发射射线,并检测射线是否击中了 AR 场景中的平面。
- 射线检测的类型由 `TrackableType` 参数指定,这里使用了 `PlaneWithinPolygon` 和 `PlaneWithinBounds` 来限制射线只检测用户定义的特定平面区域。
2. **克隆与放置**:
- 脚本使用 `GameObject.Instantiate` 方法来克隆预制体,并使用 `Pose` 来设置克隆物体的位置和旋转。
- 通过检查 `TempObj` 的状态,脚本确保用户不会重复克隆物体,除非之前的克隆物体被移除或销毁。
## 使用说明
- 将 `AppController` 脚本附加到一个游戏对象上,并确保该游戏对象上有 `ARRaycastManager` 组件。
- 在 Unity 编辑器中,将你希望克隆的预制体拖拽到 `OnePrefab` 变量上。
- 运行应用程序,通过触摸屏幕来选择位置并放置克隆的物体。
## 注意事项
- 确保你的 AR 设备或模拟器已经正确设置并支持 AR Foundation。
- 调整射线检测的类型和参数,以适应你的应用程序需求。
- 如果需要限制克隆物体的数量,可以添加额外的逻辑来管理 `TempObj` 的生命周期。
TrackableType.PlaneWithinPolygon 是什么意思
TrackableType.PlaneWithinPolygon
是 Unity AR Foundation 中的一个枚举值,用于指定射线检测(Raycast)的目标类型。这个枚举值是 TrackableType
的一个成员,它定义了射线检测可以击中的跟踪目标类型。
在 AR 应用中,平面(Plane)是指由 AR 系统识别的环境表面,通常是水平或垂直的表面,如地板、墙壁或桌面。PlaneWithinPolygon
特指那些被定义为多边形边界内的平面。这意味着射线检测将只寻找并返回位于用户定义的多边形区域内的平面。
使用 TrackableType.PlaneWithinPolygon
可以限制射线检测的结果,使其只返回特定区域内的平面,这对于某些特定的 AR 场景和交云操作非常有用。例如,你可能只想在用户放置的特定区域(如一个虚拟房间的地面上)进行交互,而不是任何可见的平面。
在实际使用中,你可以将 TrackableType.PlaneWithinPolygon
作为参数传递给 ARRaycastManager.Raycast
方法,来指定射线检测的类型。这样,只有当射线击中了多边形区域内的平面时,射线检测才会返回命中结果。