Unity 射线检测实现解析:空间索引、窄相求交与查询优化 📅 2026/8/11 2:36:10 引言:30 次射线调用为什么能吃掉 14msProfiler 里Physics.Raycast占用 14ms,而场景只有 200 多个 Collider、每帧调用 30 次左右——这个比例明显反常。调整 Trigger 交互参数几乎无变化,说明瓶颈不在 API 参数,而在底层执行路径:射线检测的成本由空间索引的遍历质量与碰撞体的求交算法决定,与调用形式关系不大。本文拆解从托管层调用到原生层求交的完整链路,并给出定位与优化此类问题的方法。一、射线的数据模型与应用场景1.1 轻量结构射线的数学表示是原点加方向:[ \mathbf{p}(t) = \mathbf{o} + t \cdot \mathbf{d}, \quad t \in [0, t_{max}] ]// 引擎内部 Ray 结构(示意):纯数据,无虚函数、无分配 struct Ray { Vector3f origin; // 世界空间起点 Vector3f direction; // 单位方向向量(构造时归一化) float maxDistance; // 检测上限,截断遍历 };方向在入口归一化是关键:后续所有求交公式都假设单位方向,t值直接等于世界距离;若方向未归一化,每步都要补偿长度,误差与开销双输。托管层UnityEngine.Ray只是该结构的包装。1.2 三类典型应用