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

Godot相机射线投射问题:GDScript正常C#返回空字典

问题:Godot中C#射线检测返回空Dictionary,GDScript版本正常

问题描述

在Godot中实现相机向世界发射射线的功能时,GDScript版本运行完全正常,但改写为C#版本后,返回的Dictionary始终为空。进一步观察发现:只有视口特定区域能检测到射线(即使该区域无物体),且移动相机后该区域位置保持不变。

原代码对比

GDScript 正常代码

func shootRay():
    var space_state = get_world().direct_space_state
    var mouse_position = get_viewport().get_mouse_position()
    rayOrigin = cam.project_ray_origin(mouse_position)
    rayEnd = rayOrigin + cam.project_ray_normal(mouse_position) * 2000
    var intersection = space_state.intersect_ray(rayOrigin, rayEnd)

    if not intersection.empty():
        return intersection

C# 存在问题的代码

private Dictionary shootRay(){
    PhysicsDirectSpaceState spaceState = GetWorld().DirectSpaceState;
    Vector2 mouseScreenPos = GetViewport().GetMousePosition();
    _rayOrigin = _camera.ProjectRayOrigin(mouseScreenPos);
    _rayEnd = _rayOrigin + _camera.ProjectLocalRayNormal(mouseScreenPos) * 2000;
    Dictionary intersection = spaceState.IntersectRay(_rayOrigin, _rayEnd);

    return intersection;
}

解决方案

问题根源在于C#代码中错误调用了ProjectLocalRayNormal方法:该方法返回的是相机本地空间的射线法线,而GDScript中的project_ray_normal对应的C#方法是ProjectRayNormal(返回世界空间的射线法线)。

将C#代码中的ProjectLocalRayNormal替换为ProjectRayNormal即可解决问题,修改后的代码如下:

private Dictionary shootRay(){
    PhysicsDirectSpaceState spaceState = GetWorld().DirectSpaceState;
    Vector2 mouseScreenPos = GetViewport().GetMousePosition();
    _rayOrigin = _camera.ProjectRayOrigin(mouseScreenPos);
    _rayEnd = _rayOrigin + _camera.ProjectRayNormal(mouseScreenPos) * 2000;
    Dictionary intersection = spaceState.IntersectRay(_rayOrigin, _rayEnd);

    return intersection;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:06:23