public static void DrawCapsuleCast2DHits(RaycastHit2D[] hits, Vector2 origin, Vector2 size, CapsuleDirection2D capsuleDirection, float angle, Vector2 direction, Color color, int maxCount = -1) { if (maxCount < 0) { maxCount = hits.Length; } if (maxCount == 0) { return; } direction.EnsureNormalized(); DrawCapsuleStructure2D capsuleStructure2D = new DrawCapsuleStructure2D(size, capsuleDirection, angle); for (int i = 0; i < maxCount; i++) { DrawCapsule2DFast(origin + direction * hits[i].distance, capsuleStructure2D, DrawLine); } void DrawLine(Vector3 a, Vector3 b, float v) => lineDelegate(a, b, color); }
public static void DrawCapsule2D(Vector2 origin, Vector2 size, CapsuleDirection2D capsuleDirection, float angle, Color color, float duration = 0) { DrawCapsuleStructure2D capsuleStructure2D = new DrawCapsuleStructure2D(size, capsuleDirection, angle); DrawCapsule2DFast(origin, capsuleStructure2D, DrawLine); void DrawLine(Vector3 a, Vector3 b, float t) => lineDelegate(a, b, color, duration); }
internal static void DrawCapsule2DFast(Vector2 offset, DrawCapsuleStructure2D capsuleStructure2D, LineDelegate lineDelegate) { Vector2 r1 = offset + capsuleStructure2D.VerticalOffset; Vector2 r2 = offset - capsuleStructure2D.VerticalOffset; DrawArc2D(r1, capsuleStructure2D.Left, capsuleStructure2D.Radius, 180, lineDelegate); DrawArc2D(r2, capsuleStructure2D.Left, capsuleStructure2D.Radius, -180, lineDelegate); lineDelegate(r1 + capsuleStructure2D.ScaledLeft, r2 + capsuleStructure2D.ScaledLeft, 0); lineDelegate(r1 + capsuleStructure2D.ScaledRight, r2 + capsuleStructure2D.ScaledRight, 0); }
public static void DrawCapsuleCast2D( Vector2 origin, Vector2 size, CapsuleDirection2D capsuleDirection, float angle, Vector2 direction, float distance, Color colorStart, Color colorEnd) { direction.EnsureNormalized(); DrawCapsuleStructure2D capsuleStructure2D = new DrawCapsuleStructure2D(size, capsuleDirection, angle); Color color = colorStart; DrawCapsule2DFast(origin, capsuleStructure2D, DrawLine); var scaledDirection = direction * distance; Vector2 destination = origin + scaledDirection; float dot = Vector2.Dot(PerpendicularClockwise(capsuleStructure2D.VerticalOffset), direction); float sign = Mathf.Sign(dot); float scaledRadius = capsuleStructure2D.Radius * sign; Vector2 o1 = PerpendicularCounterClockwise(direction) * scaledRadius; Vector2 o2 = PerpendicularClockwise(direction) * scaledRadius; Vector2 originA = origin + capsuleStructure2D.VerticalOffset + o1; Vector2 originB = origin - capsuleStructure2D.VerticalOffset + o2; Vector2 currentA = originA; Vector2 currentB = originB; for (int i = 1; i <= 10; i++) { float t = i / (float)10; color = Color.Lerp(colorStart, colorEnd, t); Vector2 nextA = originA + scaledDirection * t; Vector2 nextB = originB + scaledDirection * t; DrawLine(currentA, nextA, t); DrawLine(currentB, nextB, t); currentA = nextA; currentB = nextB; } color = colorEnd; DrawCapsule2DFast(destination, capsuleStructure2D, DrawLine); void DrawLine(Vector3 a, Vector3 b, float v) => lineDelegate(a, b, color); }