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

Godot 4.3正交相机射线检测Tile碰撞失败求助

俯视正交相机Tile检测失败的解决方案

针对你在Godot 4.3中遇到的鼠标悬停Tile(Area3D)检测失败问题,以下是精准修复方案:

1. 修正ProjectPosition的参数错误

正交相机的ProjectPosition方法第二个参数是视口深度值(范围0到1,0对应近平面,1对应远平面),而非世界空间坐标。你传入的Position.Y +20完全不符合正交相机的参数要求,导致射线目标位置计算错误。

修复代码:

private GodotObject CastMouseRay() {
    Vector2 mousePosition = GetViewport().GetMousePosition();
    // 正交相机下用1.0作为远平面深度参数
    downwardRay.TargetPosition = rayCastingCamera.ProjectPosition(mousePosition, 1.0f);
    downwardRay.ForceRaycastUpdate();
    return downwardRay.GetCollider();
}

更可靠的通用写法(适配正交/透视相机):

private GodotObject CastMouseRay() {
    Vector2 mousePosition = GetViewport().GetMousePosition();
    // 获取世界空间的射线起点和方向
    Vector3 rayOrigin = rayCastingCamera.ProjectRayOrigin(mousePosition);
    Vector3 rayDir = rayCastingCamera.ProjectRayNormal(mousePosition);
    // 设置射线起点(世界空间)和足够长的目标位置
    downwardRay.GlobalPosition = rayOrigin;
    downwardRay.TargetPosition = rayOrigin + rayDir * 100.0f; // 100足够覆盖场景范围
    downwardRay.ForceRaycastUpdate();
    return downwardRay.GetCollider();
}

2. 匹配碰撞层与掩码

RayCast3D默认的碰撞掩码可能未包含Tile所在的碰撞层,导致无法检测到Area3D:

  • 打开Tile的Area3D属性面板,确认Collision Layer(比如设为第2层)
  • 打开RayCast3D的属性面板,在Collision Mask中勾选对应层(第2层)
  • 确保Area3D的Monitorable属性为true(默认开启,若被关闭需重新勾选)

3. 修复RayCast3D的节点设置

  • 确保RayCast3D的Enabled属性为true,否则射线不会生效
  • 检查RayCast3D挂在Camera3D下的局部方向:Camera3D旋转-90度后,RayCast的局部Cast To应指向下方(比如设置为(0, -10, 0),长度足够覆盖相机到Tile的距离)

4. 修正代码语法错误

你的_Input方法缺少闭合的大括号,导致逻辑异常,修复后:

public override void _Input(InputEvent @event)
{
    if (Input.IsActionPressed("selection"))
    {
        if (detectedCollider != null)
        {
            GD.Print("Selected object is: " + detectedCollider.ToString());
        } else {
            GD.Print("No collider detected");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:05:16