如何在 Godot 中以 2D 方式从光标/鼠标下方进行光线投射?

How does one Raycast from under the cursor/mouse in 2D in Godot?

提问人:Hulda Gnodima 提问时间:9/22/2023 更新时间:9/22/2023 访问量:179

问:

我属于在这里洗牌的团结人群,喜欢我所看到的:)我在网上找不到太多东西,所以想问一下,也许它将来会帮助其他人。

我添加了一个 Area2D 节点,其子节点是 CollisionShape2D(包含圆形) 我在场景中制作了一个 RayCast2D 节点。 我添加了一个脚本,我称之为“CheckUnderCursor”。 在其中,基于文档(但将传递的“Create”属性调整为鼠标光标位置)(但调整传递的“Create”属性为鼠标光标位置)

​

    public override void _PhysicsProcess(double delta)
    {
        var spaceState = GetWorld2D().DirectSpaceState;
        // use global coordinates, not local to node
        var query = PhysicsRayQueryParameters2D.Create(GetViewport().GetMousePosition(), GetViewport().GetMousePosition() );
        var result = spaceState.IntersectRay(query);
        if (result.Count > 0)
        {
            GD.Print(result);
        }
    }

但是,将光标悬停在我知道对撞机所在的位置上不会打印任何命中。我想知道是否有人知道我哪里出了问题,以及如何在 Godot 2D 中直接从光标正确进行光线投射?:)我怀疑我给 Create 提供了错误的“to”位置,但我不知道我应该在 2D 空间中给出什么值。

提前非常感谢 <3

C# 游戏引擎 Godot 光线投射 Godot4

评论


答:

1赞 Theraot 9/22/2023 #1

通常,您不需要这样做,因为您可以设置 to 的属性,然后覆盖 或 连接到信号。还有和信号。input_pickableArea2Dtrue_input_eventinput_eventmouse_enteredmouse_exited

话虽如此,有时您需要通过其他方式进行查询......

现在有几件事:

  • 您需要全局坐标(在本例中为 2D 世界的坐标)中的位置,而不是视口坐标。
  • 你不想与光线相交,你想与一个点相交。
var spaceState = GetWorld2D().DirectSpaceState;
var query = new PhysicsPointQueryParameters2D();
query.position = GetGlobalMousePosition();
var result = spaceState.intersect_point(query);
if (result.Count > 0)
{
    GD.Print(result);
}

顺便说一句,如果你需要调试你的碰撞体,你可以在“调试”菜单中启用“可见碰撞形状”。

我希望这会有所帮助。