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

Physics.Raycast返回异常结果:射线距离莫名为0的问题排查

问题原因及修复方案

核心问题1:射线方向参数错误

你创建Ray时,第二个参数传入的是middle2.transform.position——但Ray构造方法的第二个参数需要的是方向向量,不是终点坐标。正确的方向应该是终点位置减去起点位置的向量(middle2.transform.position - middle1.transform.position)。如果直接传终点坐标,射线方向会变成从世界原点指向middle2的向量,完全偏离了你需要检测的路径,导致某些位置射线直接击中起点附近的碰撞体,返回距离0。

核心问题2:检测距离固定不合理

你给Physics.Raycast设置的最大检测距离是固定值0.7f,但实际需要检测的是middle1到middle2之间的区域,应该动态计算这段距离(比如用Vector3.Distance(startPos, endPos)),否则当两点间距超过0.7f时射线会被截断,小于时可能误判碰撞位置。

额外可能原因:起点处于碰撞体内部

如果middle1的位置已经进入大立方体(tag为world)的碰撞体内部,射线检测会直接返回距离0——因为射线起点就在碰撞体范围内。这种情况需要检查空物体middle1的位置是否和大立方体碰撞体有重叠。

修正后的代码

private void GetMiddleDist()
{
    middleDist = 0f;
    Vector3 startPos = middle1.transform.position;
    Vector3 endPos = middle2.transform.position;
    Vector3 direction = endPos - startPos;
    float maxDistance = direction.magnitude;

    // 避免两点重合导致的无效检测
    if (maxDistance <= 0f) return;

    Ray ray = new Ray(startPos, direction);
    Debug.DrawLine(startPos, endPos, Color.red);

    if (Physics.Raycast(ray, out RaycastHit hit, maxDistance))
    {
        if (hit.collider.CompareTag("world"))
        { 
            middleDist = hit.distance;
        }
    }
}

另外,还可以给Physics.Raycast添加忽略层参数,比如忽略小立方体自身的碰撞体,避免射线误检测到自身导致距离异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:45:26