public static bool OverlapCapsuleCustom <T, C>(ref T target, float3 point1, float3 point2, float radius, ref C collector, CollisionFilter filter, QueryInteraction queryInteraction = QueryInteraction.Default) where T : struct, ICollidable where C : struct, ICollector <DistanceHit> { Assert.IsTrue(collector.MaxFraction == 0); CapsuleCollider collider = default; float3 center = (point1 + point2) / 2; CapsuleGeometry geometry = new CapsuleGeometry { Radius = radius, Vertex0 = point1 - center, Vertex1 = point2 - center }; collider.Initialize(geometry, filter, Material.Default); ColliderDistanceInput input; unsafe { input = new ColliderDistanceInput { Collider = (Collider *)UnsafeUtility.AddressOf(ref collider), MaxDistance = 0.0f, Transform = new RigidTransform { pos = center, rot = quaternion.identity } }; } if (queryInteraction == QueryInteraction.Default) { return(target.CalculateDistance(input, ref collector)); } else { unsafe { var interactionCollector = new QueryInteractionCollector <DistanceHit, C> { Collector = collector, }; bool returnValue = target.CalculateDistance(input, ref interactionCollector); collector = interactionCollector.Collector; return(returnValue); } } }
public static bool CapsuleCastCustom <T, C>(ref T target, float3 point1, float3 point2, float radius, float3 direction, float maxDistance, ref C collector, CollisionFilter filter, QueryInteraction queryInteraction = QueryInteraction.Default) where T : struct, ICollidable where C : struct, ICollector <ColliderCastHit> { CapsuleCollider collider = default; float3 center = (point1 + point2) / 2; CapsuleGeometry geometry = new CapsuleGeometry { Radius = radius, Vertex0 = point1 - center, Vertex1 = point2 - center }; collider.Initialize(geometry, filter, Material.Default); ColliderCastInput input; unsafe { input = new ColliderCastInput { Collider = (Collider *)UnsafeUtility.AddressOf(ref collider), Orientation = quaternion.identity, Start = center, End = center + direction * maxDistance }; } if (queryInteraction == QueryInteraction.Default) { return(target.CastCollider(input, ref collector)); } else { unsafe { var interactionCollector = new QueryInteractionCollector <ColliderCastHit, C> { Collector = collector }; bool returnValue = target.CastCollider(input, ref interactionCollector); collector = interactionCollector.Collector; return(returnValue); } } }