10
09

Physics.RaycastAll

이 함수는 광선과 교차하는 모든 RaycastHit 객체의 배열을 반환한다.

결과 배열에 대한 메모리를 동적으로 할당한다.

즉, 호출될 때마다 RaycastHit 개체를 저장할 새 배열을 생성한다.

배열에 메모리를 할당하므로
특히 자주 호출되거나 성능이 중요한 시나리오에서 가비지 수집 오버헤드가 발생할 수 있다.

광선이 닿는 모든 객체를 가져와야 하고 결과 배열을 직접 관리하고 싶지 않을 때 유용하다.

RaycastAll의 문제는 여러 충돌체를 랜덤으로 검색하는 것이다.

즉, RaycastAll에 의해 리턴 되는 정보는 물체를 통과한 레이저로써

시작점과 가까이 있는 순서대로 배열에 들어가는 것이 아니라, 실제 결과값은 예측 할 수 없는 순서로 저장된다.
만약 RaycastAll로 반환된 데이터의 순서가 중요하다면, Array.Sort 를 이용해 배열을 정렬하는 방법도 있다.

Array.Sort메서드를 사용하여 배열을 오름차순으로 정렬할 수 있다.

만약 내림차순으로 정렬하려면 Sort메서드로 반환된 것을 Reverse메서드를 활용하여 반환한다.

Physics.RaycastNonAlloc

이 함수는 와 유사 Physics.RaycastAll하지만 결과 배열에 메모리를 할당하지 않는다.
즉, 내부적으로 RaycastHit 배열을 생성하여 리턴하는 방식이 아니다.

대신, RaycastHit 객체를 저장하기 위해 사전 할당된 배열
(외부에서 이미 생성된 배열을 out 파라미터로 다시 사용할 수 있음)을 제공할 수 있다.

여러 레이캐스트에 동일한 배열을 재사용하면 가비지 수집 오버헤드를 줄이고 성능을 향상시킬 수 있다.

광선과 교차하는 RaycastHit 객체의 수를 반환한다.

불필요한 메모리 할당을 방지하므로 여러 레이캐스트를 자주 수행해야 할 때 유용하다.

RaycastAll과 마찬가지로 랜덤한 순서로 충돌된 정보의 배열을 반환한다.

효과적으로 사용하려면 LayerMask같은 기능을 활용하여
레이캐스팅 결과로 반환되는 개수가 한정적일 때 최대 길이의 배열을 사용하여
반복적인 배열을 재할당없이 사용해야 한다.

요약

Physics.RaycastAllRaycastHit 객체의 배열을 반환하고 호출될 때마다 메모리를 할당하는 반면,

Physics.RaycastNonAlloc미리 할당된 배열을 사용하고 적중 수를 반환할 수 있으므로
빈번한 메모리 할당 없이 여러 레이캐스트를 수행하는 보다 효율적인 방법을 제공한다.
성능이 중요한 시나리오에서 많은 레이캐스트를 수행해야 하는 경우
메모리 오버헤드를 최소화하고 성능을 향상시키기 위해 사용하는 것이 좋겠다.

Raycast 관련 참고하기 좋은 글

'유니티 개발 기술 > 물리 & 시뮬레이션' 카테고리의 다른 글

오일러 각, 쿼터니언  (0) 2023.07.31
가속도계를 이용하기 위한 Input.acceleration  (0) 2023.07.22
Raycast 살펴보기  (0) 2023.05.23
Joints  (0) 2023.05.06
AddTorque 함수, Physic Material  (0) 2023.05.05
COMMENT