Przeglądaj źródła

Translate Tutorials/Physics/RayCasting to C#

Paul Joannon 7 lat temu
rodzic
commit
fb069fe875
1 zmienionych plików z 92 dodań i 10 usunięć
  1. 92 10
      tutorials/physics/ray-casting.rst

+ 92 - 10
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() <class_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()``.