mirror of
https://github.com/godotengine/godot-docs.git
synced 2026-01-03 05:48:42 +03:00
Translate Tutorials/Physics/RayCasting to C#
This commit is contained in:
@@ -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()``.
|
||||
|
||||
Reference in New Issue
Block a user