GameDevelop/Unity기초쌓기

[Unity] OverlapSphereNonAlloc 등 을 이용한 OverlapSphere 최적화

도도돋치 2025. 6. 9. 12:07
Contents 접기
728x90

기본 개념

Collider[] hits = Physics.OverlapSphere(position, radius, LayerMask.GetMask("Enemy"));

 

  • 지정한 구체 범위 안의 Collider들을 감지
  • 배열로 리턴 → 범위 안 적이 몇 명인지 알 수 있음
  • 하지만 매 프레임 돌리면 성능 문제 발생

 

문제점

  1. Collider 오브젝트가 많아질수록 느려짐
  2. GC Alloc 발생 (배열 새로 생성 → 메모리 낭비 → 렉 유발)
  3. 모바일/저사양 환경에서는 프레임 드랍 위험

 

 

최적화 방법

1. LayerMask 필터링

  • 감지할 레이어만 지정해서 불필요한 체크 줄이기
LayerMask enemyMask = LayerMask.GetMask("Enemy");
Collider[] hits = Physics.OverlapSphere(position, radius, enemyMask);

 

2. OverlapSphereNonAlloc 사용

배열을 미리 만들어 두고, 그 안에 결과를 덮어쓰기 → GC 발생 0

private Collider[] hits = new Collider[10]; // 미리 배열 준비
int count = Physics.OverlapSphereNonAlloc(position, radius, hits, LayerMask.GetMask("Enemy"));

for (int i = 0; i < count; i++) {
    Enemy enemy = hits[i].GetComponent<Enemy>();
    if (enemy != null) enemy.TakeDamage(10);
}

 

3. 체크 주기 줄이기

  • 매 프레임 Update 대신, 코루틴으로 일정 주기마다 감지
IEnumerator AutoDetectEnemy() {
    while (true) {
        CheckForEnemy();
        yield return new WaitForSeconds(0.2f); // 0.2초마다 감지
    }
}

 

4. 탐지 범위 최적화

  • 범위(radius)가 커질수록 연산량 증가 → 꼭 필요한 범위로만 설정

 

정리

  • LayerMask → 불필요한 감지 줄이기
  • OverlapSphereNonAlloc → GC Alloc 0, 성능 최적화
  • 코루틴 감지 → 매 프레임 부하 줄이기
  • 탐지 범위 조절 → 최소한으로
728x90