기본 패턴
csharp
private readonly Collider[] results = new Collider[16];
int hitCount = Physics.OverlapSphereNonAlloc(transform.position, radius, results);설명
- Unity 공식 물리 성능 가이드는 배열을 새로 만드는 할당형 쿼리보다 NonAlloc 버전을 우선 고려하라고 설명합니다.
OverlapSphere,OverlapBox처럼 여러 결과를 돌려주는 API는 자주 호출되면 GC 부담이 쌓일 수 있습니다.- NonAlloc API는 결과 버퍼를 호출자가 직접 제공하므로 추가 할당 없이 재사용할 수 있습니다.
- 2D 물리에서는
NonAlloc이름 대신 배열이나List<T>를 받는 overload를 쓰는 방식이라는 점도 중요합니다.
짧은 예제
csharp
[SerializeField] private float detectRadius = 3f;
private readonly Collider[] hits = new Collider[32];
private void Update()
{
int count = Physics.OverlapSphereNonAlloc(transform.position, detectRadius, hits);
for (int i = 0; i < count; i++)
{
if (hits[i].CompareTag("Enemy"))
{
Debug.Log(hits[i].name);
}
}
}빠른 정리
| 항목 | 설명 |
|---|---|
| NonAlloc | 호출 중 추가 GC 할당을 줄임 |
| 결과 버퍼 | 미리 만든 배열을 재사용 |
| 반복 쿼리 | 탐지 시스템, AI 감지에 유용 |
| 2D 예외 | 배열/List overload로 같은 목적 달성 |
| 버퍼 크기 | 부족하면 일부 결과를 놓칠 수 있음 |
주의할 점
NonAlloc으로 바꿨더라도 결과 버퍼가 너무 작으면 충돌 대상을 일부 놓칠 수 있습니다. 성능 최적화와 정확도 사이의 최소 버퍼 크기를 실제 장면에서 검증해야 합니다.
참고 링크
2 sources