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