有人能告诉我我的密码出了什么问题吗?我用GDScript编写了这个函数,然后用C#重写了它。它在GDScript中运行得很好,但我似乎在C#中得到了一本空洞的字典。
我所要做的就是从摄像机里向世界投射一束光线。
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 intersectionC#:
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;
}编辑:当我停留在我的视口的某一特定区域时,它实际上检测到了一个光线投射,即使在这个区域里什么都没有。即使我移动相机,它探测到的区域也保持不变。
编辑:我必须将ProjectLocalRayNormal更改为ProjectRayNormal
发布于 2022-08-06 12:08:03
--它在GDScript中工作得很好,但我似乎在C#上得到了一本空洞的字典
您可以看到GDScript专门检查空的Dictionary。
if not intersection.empty():
return intersectionGDScript将在空Dictionary的情况下返回null ( GDScript中的方法没有指定返回类型,因此它返回一个变量,如果没有命中return语句,则为null )。对于C#中的代码来说不是这样。
您可以阅读intersect_ray的文档
如果光线没有交叉任何内容,则返回一个空字典。
它确认了一个空的Dictionary是预期的。
增编:虽然我一开始没有注意到,但在所讨论的代码中,project_ray_normal在GDScript中被翻译成了C#中的ProjectLocalRayNormal。应该是ProjectRayNormal__。
发布于 2022-08-06 12:34:31
我不得不改变
_rayEnd = _rayOrigin + _camera.ProjectLocalRayNormal(mouseScreenPos) * 2000;
至
_rayEnd = _rayOrigin + _camera.ProjectRayNormal(mouseScreenPos) * 2000;
https://stackoverflow.com/questions/73259570
复制相似问题