From fb069fe875d78e4cbb048bb0c8ea5cfb4c9b731d Mon Sep 17 00:00:00 2001 From: Paul Joannon Date: Thu, 5 Apr 2018 14:24:11 +0200 Subject: [PATCH] Translate Tutorials/Physics/RayCasting to C# --- tutorials/physics/ray-casting.rst | 102 +++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 10 deletions(-) diff --git a/tutorials/physics/ray-casting.rst b/tutorials/physics/ray-casting.rst index 892f0bd23..2cf0021e2 100644 --- a/tutorials/physics/ray-casting.rst +++ b/tutorials/physics/ray-casting.rst @@ -51,26 +51,51 @@ must be used. Use the following code in 2D: -:: +.. tabs:: + .. code-tab:: gdscript GDscript func _physics_process(delta): var space_rid = get_world_2d().space var space_state = Physics2DServer.space_get_direct_state(space_rid) + .. code-tab:: csharp + + public override void _PhysicsProcess(float delta) + { + var spaceRid = GetWorld2d().Space; + var spaceState = Physics2DServer.SpaceGetDirectState(spaceRid); + } + Or more directly: -:: +.. tabs:: + .. code-tab:: gdscript GDScript func _physics_process(delta): var space_state = get_world_2d().direct_space_state + .. code-tab:: csharp + + public override void _PhysicsProcess(float delta) + { + var spaceState = GetWorld2d().DirectSpaceState; + } + And in 3D: -:: +.. tabs:: + .. code-tab:: gdscript GDScript func _physics_process(delta): var space_state = get_world().direct_space_state + .. code-tab:: csharp + + public override void _PhysicsProcess(float delta) + { + var spaceState = GetWorld().DirectSpaceState; + } + Raycast query ------------- @@ -78,21 +103,37 @@ For performing a 2D raycast query, the method :ref:`Physics2DDirectSpaceState.intersect_ray() ` may be used. For example: -:: +.. tabs:: + .. code-tab:: gdscript GDScript func _physics_process(delta): - var space_state = get_world().direct_space_state + var space_state = get_world_2d().direct_space_state # use global coordinates, not local to node var result = space_state.intersect_ray(Vector2(0, 0), Vector2(50, 100)) + .. code-tab:: csharp + + public override void _PhysicsProcess(float delta) + { + var spaceState = GetWorld2d().DirectSpaceState; + // use global coordinates, not local to node + var result = spaceState.IntersectRay(new Vector2(), new Vector2(50, 100)); + } + The result is a dictionary. If the ray didn't hit anything, the dictionary will be empty. If it did hit something it will contain collision information: -:: +.. tabs:: + .. code-tab:: gdscript GDScript if result: print("Hit at point: ", result.position) + .. code-tab:: csharp + + if (result.Count > 0) + GD.Print("Hit at point: ", result["position"]); + The ``result`` dictionary when a collision occurs contains the following data: @@ -125,14 +166,26 @@ optional third parameter which is an array of exceptions. This is an example of how to use it from a KinematicBody2D or any other collision object node: -:: +.. tabs:: + .. code-tab:: gdscript GDScript extends KinematicBody2D func _physics_process(delta): - var space_state = get_world().direct_space_state + var space_state = get_world_2d().direct_space_state var result = space_state.intersect_ray(global_position, enemy_position, [self]) + .. code-tab:: csharp + + class Body : KinematicBody2D + { + public override void _PhysicsProcess(float delta) + { + var spaceState = GetWorld2d().DirectSpaceState; + var result = spaceState.IntersectRay(globalPosition, enemyPosition, new object[] { this }); + } + } + The exceptions array can contain objects or RIDs. Collision Mask @@ -146,7 +199,8 @@ The optional fourth argument for ``intersect_ray()`` is a collision mask. For example, to use same mask as the parent body, use the ``collision_mask`` member variable: -:: +.. tabs:: + .. code-tab:: gdscript GDScript extends KinematicBody2D @@ -155,6 +209,18 @@ member variable: var result = space_state.intersect_ray(global_position, enemy_position, [self], collision_mask) + .. code-tab:: csharp + + class Body : KinematicBody2D + { + public override void _PhysicsProcess(float delta) + { + var spaceState = GetWorld2d().DirectSpaceState; + var result = spaceState.IntersectRay(globalPosition, enemyPosition, + new object[] { this }, CollisionMask); + } + } + 3D ray casting from screen -------------------------- @@ -175,7 +241,8 @@ obtained. This is because ``origin`` changes in orthogonal mode, while To obtain it using a camera, the following code can be used: -:: +.. tabs:: + .. code-tab:: gdscript GDScript const ray_length = 1000 @@ -185,5 +252,20 @@ To obtain it using a camera, the following code can be used: var from = camera.project_ray_origin(event.position) var to = from + camera.project_ray_normal(event.position) * ray_length + .. code-tab:: csharp + + private const float rayLength = 1000; + + public override void _Input(InputEvent @event) + { + if (@event is InputEventMouseButton eventMouseButton && eventMouseButton.Pressed && eventMouseButton.ButtonIndex == 1) + { + var camera = (Camera)GetNode("Camera"); + var from = camera.ProjectRayOrigin(eventMouseButton.Position); + var to = from + camera.ProjectRayNormal(eventMouseButton.Position) * rayLength; + } + } + + Remember that during ``_input()``, the space may be locked, so in practice this query should be run in ``_physics_process()``.