Contents
접기
728x90
기본 개념
Collider[] hits = Physics.OverlapSphere(position, radius, LayerMask.GetMask("Enemy"));
- 지정한 구체 범위 안의 Collider들을 감지
- 배열로 리턴 → 범위 안 적이 몇 명인지 알 수 있음
- 하지만 매 프레임 돌리면 성능 문제 발생
문제점
- Collider 오브젝트가 많아질수록 느려짐
- GC Alloc 발생 (배열 새로 생성 → 메모리 낭비 → 렉 유발)
- 모바일/저사양 환경에서는 프레임 드랍 위험
최적화 방법
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
'GameDevelop > Unity기초쌓기' 카테고리의 다른 글
트러블슈팅-빌드시 안드로이드 유니티앱 바로꺼짐 (0) | 2025.09.17 |
---|---|
Unity 트러블슈팅 – TakeDamage가 호출되지 않음 (0) | 2025.06.09 |
[Unity] SerializeField + 프로퍼티 패턴 (0) | 2025.06.08 |
Unity FSM 구조 – 방치형 RPG에 맞게 단순화 (0) | 2025.06.08 |
Unity 3D 방치형 RPG – 코어 구조 정리 (0) | 2025.06.05 |