开发环境及一些说明
Unity:2021.1.14flc1
导入Package:
AR Foundation:4.1.7
ARCore XR Plugin:4.1.7
(在进行配置前需要先将Unity中的Android环境配置好)
对ARFoundation的使用学习可以参考unity官网的文档:
http://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.1/manual/index.html本文只个例演示射线检测,还有其他方法可以使用。也可以到ARCore的官网:https://developers.google.cn/ar对这部分SDK的功能和环境配置有个更好的了解。
两个网站的中文翻译我觉得都挺令人头疼的,看不懂的部分地方建议可以用英文文档理解一下。
AR射线检测管理器ARRaycastManager
使用此组件对可跟踪对象(即物理环境中检测到的特征对象)进行光线投射。
在安卓环境下ARRaycastManager主要用于单光线投射
ARRaycastManager.Raycast(Ray, List, TrackableType)
对可跟踪对象(即检测到的特征,如平面)投射光线。
如果光线投射命中trackableTypes中的可跟踪项,则为True。
public bool Raycast(Ray ray, List<ARRaycastHit> hitResults, TrackableType trackableTypes =
TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds |
TrackableType.PlaneWithinInfinity | TrackableType.PlaneEstimated |
TrackableType.Planes | TrackableType.FeaturePoint | TrackableType.Image |
TrackableType.Face | TrackableType.All)
Enum TrackableType
表示XR中可跟踪类型的标志。“可跟踪”是指设备能够跟踪的物理环境中物件的类型,例如曲面。
可以将多个类型按位或组合在一起,例如,TrackableType.PlaneWithinPolygon | TrackableType.FeaturePoint
通常在射线检测中与XRRaycastHit结合使用。其取值可以参考下面的表格,摘自unity官方文档
脚本编写
public class RaycastHitTest_1 : MonoBehaviour
{
public GameObject defaultPrefab;
private ARRaycastManager raycastManager;
private List<ARRaycastHit> hits = new List<ARRaycastHit>();
// Start is called before the first frame update
void Start()
{
raycastManager = GetComponent<ARRaycastManager>();
}
// Update is called once per frame
void Update()
{
if(Input.touchCount == 0)
{
return;
}
//如果触屏次数为0,则不进行操作
Vector2 touchPosition = Input.GetTouch(0).position;
//射线检测命中trackableTypes中的可跟踪项,则为True
if (raycastManager.Raycast(touchPosition, hits, TrackableType.PlaneWithinPolygon))
{
Pose hitPose = hits[0].pose;//获取该帧第一次命中的pose
Vector3 gamePosition= new Vector3(hitPose.position.x, hitPose.position.y+0.1f, hitPose.position.z);
GameObject box = Instantiate(defaultPrefab, gamePosition, defaultPrefab.transform.rotation);
}
}
}
注意在unity界面中的ARRaycastManager控件中将你所要生成的GameObject拖入到Default Prefab中,或者用代码来实现这部分的设置。
运行结果
点击平面内产生的效果
如果在实际使用这份代码的话会发现每次点击很容易生成一个以上的GameObject,这里是相关的解决办法:
Unity开发(Android):控制设备单次触碰单次响应