You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实现空间定位的基础
  • 简化状态判断:去掉了冗余的标签判断分支,让逻辑更清晰

额外注意事项

  1. 你的测试对象(带TestCollider标签)必须挂载在ARCore的Anchor对象下,这样ARCore才能追踪到它的空间位置
  2. 场景里必须配置ARSession和ARSessionOrigin组件,这是ARCore运行的核心依赖
  3. 给测试对象添加合适的碰撞体(比如BoxCollider),确保碰撞体大小和对象模型匹配
  4. 真机测试时要授予相机权限,否则ARCore无法识别空间平面

内容的提问来源于stack exchange,提问作者SandaleRaclette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:16:32