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
相关产品推荐
相关产品推荐

