ARCore环境下射线检测(Raycast)失效求助:是否需改用TrackableHit?
解决ARCore环境下射线检测失效的问题
你说得没错,在ARCore场景里,普通的Physics.Raycast确实没法正常工作——因为它是针对Unity物理引擎的碰撞体设计的,而ARCore的空间追踪有自己的一套射线检测逻辑,必须用TrackableHit来处理AR场景中的可追踪对象(比如识别到的平面、自定义锚点等)。我来帮你修正代码,适配ARCore的环境:
核心问题说明
- 普通
Raycast依赖Unity物理世界的碰撞体,而ARCore识别的平面等对象是由ARCore的追踪系统管理的,不属于普通物理碰撞体系 - AR设备没有鼠标输入,你原来用的
Input.mousePosition在AR场景里是无效的,需要改用触摸输入
修正后的完整代码
using UnityEngine; using GoogleARCore; public class ARRaycastObject : MonoBehaviour { public enum HoverState { HOVER, NONE }; public HoverState hover_state = HoverState.NONE; // 引用ARSessionOrigin(确保场景中有这个核心组件) public ARSessionOrigin arSessionOrigin; void Update() { // AR设备用触摸输入,先判断是否有触摸操作 if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { Touch touch = Input.GetTouch(0); TrackableHit hit; // 设定射线检测的过滤规则,这里只检测平面内的区域,可根据需求调整 TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon; // 执行ARCore专属的射线检测 if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit)) { GameObject hitObject = hit.Trackable.gameObject; // 检查命中对象是否符合目标标签 if (hover_state == HoverState.NONE && hitObject.CompareTag("TestCollider")) { Destroy(hitObject); hover_state = HoverState.HOVER; } } else { // 未命中任何AR可追踪对象,重置状态 if (hover_state == HoverState.HOVER) { hover_state = HoverState.NONE; } } } else { // 无触摸输入时重置状态(AR场景里hover逻辑其实不太实用,建议改成点击触发逻辑) if (hover_state == HoverState.HOVER) { hover_state = HoverState.NONE; } } } }
关键修改点说明
- 替换射线检测API:用
Frame.Raycast代替Physics.Raycast,这个API是ARCore专门用来检测空间中可追踪对象的,能正确识别AR场景里的平面、锚点等 - 适配触摸输入:用
Input.GetTouch(0)获取AR设备的触摸位置,完全替代鼠标位置的逻辑 - 关联AR核心组件:确保场景中有
ARSessionOrigin组件,并在Inspector里把它赋值给脚本的对应字段,这是ARCore实现空间定位的基础 - 简化状态判断:去掉了冗余的标签判断分支,让逻辑更清晰
额外注意事项
- 你的测试对象(带
TestCollider标签)必须挂载在ARCore的Anchor对象下,这样ARCore才能追踪到它的空间位置 - 场景里必须配置
ARSession和ARSessionOrigin组件,这是ARCore运行的核心依赖 - 给测试对象添加合适的碰撞体(比如
BoxCollider),确保碰撞体大小和对象模型匹配 - 真机测试时要授予相机权限,否则ARCore无法识别空间平面
内容的提问来源于stack exchange,提问作者SandaleRaclette
相关产品推荐
相关产品推荐

