유니티에서 Physics.SphereCastAll 정렬하기
2020. 9. 28. 15:01ㆍ참고
RaycastHit[] hitList = Physics.SphereCastAll(...)
얼마전 관통형 무기 구현에서 벽 감지에 문제가 있었습니다.
레이저 빔을 맞은 대상 리스트가 정렬되지 않음.
참고 : SphereCastAll, SphereCastNonAlloc
이 영상만 보면 순서대로 잘 나옵니다.
왜?
순서대로 부딪혔으니까... OTL...
생각외로 정렬 코드 검색이 안되네요. (니가 구현해라.)
(사용중인 MIT License 코드를 간소하게 수정)
public static class PhysicsExtensions
{
private class AscendingDistanceComparer : IComparer<RaycastHit>
{
public int Compare(RaycastHit h1, RaycastHit h2)
{
return h1.distance < h2.distance ? -1 : (h1.distance > h2.distance ? 1 : 0);
}
}
private static AscendingDistanceComparer ascendDistance = new AscendingDistanceComparer();
public static void SortClosestToFurthest(RaycastHit[] hits)
{
if (hits.Length < 2) return;
Array.Sort<RaycastHit>(hits, 0, hits.Length, ascendDistance);
}
}
이제 사용후 정렬하면 OK.
RaycastHit[] hitList = Physics.SphereCastAll(...);
PhysicsExtensions.SortClosestToFurthest(hitList);
추가.
폭발형 무기의 타겟 정렬.
물론 순서 관계 없는 폭발이면 정렬도 필요없다.
Physics.OverlapSphere, LINQ 사용.
// https://stackoverflow.com/questions/59505652/is-there-a-specific-order-to-the-colliders-that-physics-overlapsphere-returns
Collider[] cols = Physics.OverlapSphere(center, radius);
var newCols = cols.OrderBy(c => Vector3.Distance(center, c.transform.position)).ToArray();