feat: added raycasting support for physics engine 2D

This commit is contained in:
2025-06-09 18:11:20 +03:00
parent adfa6c6ba0
commit 6a41407005
6 changed files with 226 additions and 2 deletions

View File

@@ -19,6 +19,7 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
private readonly ICollisionDetector2D collisionDetector = null!;
private readonly ICollisionResolver2D collisionResolver = null!;
private readonly IRaycastResolver2D raycastResolver = null!;
public int IterationPerStep { get => _iterationCount; set => _iterationCount = value < 1 ? 1 : value; }
@@ -43,6 +44,34 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
rigidBody.BehaviourController.OnBehaviourAdded.RemoveListener(delegateOnBehaviourAdded);
rigidBody.BehaviourController.OnBehaviourRemoved.RemoveListener(delegateOnBehaviourRemoved);
}
public RaycastResult? Raycast(Ray2D ray, float length = float.MaxValue)
{
RaycastResult? closestResult = null;
float closestDistance = float.MaxValue;
for (int i = 0; i < colliders.Count; i++)
if (raycastResolver.RaycastAgainst(colliders[i], ray, length) is RaycastResult raycastResult)
{
float magnitudeSquared = raycastResult.Position.FromTo(ray.Origin).MagnitudeSquared;
if (magnitudeSquared > closestDistance)
continue;
closestDistance = magnitudeSquared;
closestResult = raycastResult;
}
return closestResult;
}
public void Raycast(Ray2D ray, IList<RaycastResult> results, float length = float.MaxValue)
{
results.Clear();
for (int i = 0; i < colliders.Count; i++)
if (raycastResolver.RaycastAgainst(colliders[i], ray, length) is RaycastResult raycastResult)
results.Add(raycastResult);
}
public void Step(float deltaTime)
{
@@ -203,15 +232,17 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
{
collisionDetector = new CollisionDetector2D();
collisionResolver = new CollisionResolver2D();
raycastResolver = new RaycastResolver2D();
delegateOnBehaviourAdded = OnBehaviourAdded;
delegateOnBehaviourRemoved = OnBehaviourRemoved;
}
public PhysicsEngine2DStandalone(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver)
public PhysicsEngine2DStandalone(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver, IRaycastResolver2D raycastResolver)
{
this.collisionDetector = collisionDetector;
this.collisionResolver = collisionResolver;
this.raycastResolver = raycastResolver;
delegateOnBehaviourAdded = OnBehaviourAdded;
delegateOnBehaviourRemoved = OnBehaviourRemoved;