Translate Tutorials/Physics/RayCasting to C#

This commit is contained in:
Paul Joannon
2018-04-05 14:24:11 +02:00
parent 790a866d17
commit fb069fe875

View File

@@ -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()``.