[2025_11_25]직선 거리 기반 타겟팅의 한계와 길찾기 알고리즘의 필요성
2025. 11. 25. 21:05ㆍTIL
문제 상황



csharp
private Transform FindNearEnemy()
{
// 1. 범위 내 모든 적 감지
int count = Physics.OverlapSphereNonAlloc(playerPos, stateMachine.BaseDetectionRange,
enemyBuffer, stateMachine.Player.EnemyLayer);
// 2. 직선 거리로 정렬
enemies.Sort((a, b) => a.distance.CompareTo(b.distance));
// 3. 가까운 순서대로 Raycast로 장애물 체크
foreach (var enemy in enemies)
{
Vector3 direction = (enemy.transform.position - playerPos).normalized;
if (Physics.Raycast(playerPos, direction, out RaycastHit hit,
enemy.distance, stateMachine.Player.obstacleLayer))
{
continue; // 장애물 있으면 다음 적으로
}
return enemy.transform; // 장애물 없는 가장 가까운 적 반환
}
}
```
원했던 동작:
- 가장 가까운 적을 타겟으로 선택
- 장애물이 있으면 경사면을 따라 우회하며 이동
- 이동 중에도 계속 최단 경로 계산
실제 동작:
- 장애물 뒤의 적은 아예 타겟에서 제외됨
- 직선 거리로만 판단해서 실제 이동 거리는 고려 안 함
- 경사면 우회 같은 복잡한 경로 처리 불가능
현재 로직의 한계
플레이어 → 적A (거리 5m, 직선 가능)
↘ 적B (거리 3m, 벽 있음 → 우회 시 7m)
현재 코드: 적B 선택 불가 (Raycast 막힘)
원하는 것: 적B를 우회 경로로 선택 가능해야 함
문제점:
- 직선 거리 != 실제 이동 거리: Vector3.Distance는 장애물 무시
- Raycast는 직선만 체크: 우회로 존재 여부를 알 수 없음
- 동적 경로 재계산 불가: 한 번 타겟 정하면 끝
배운 점
복잡한 지형에서는 길찾기 알고리즘이 필수
방식장점단점적합한 상황
| 직선 거리 + Raycast | 간단, 빠름 | 우회로 처리 불가 | 장애물 없는 오픈 필드 |
| NavMesh | Unity 내장, 사용 쉬움 | Bake 필요, 동적 장애물 제한적 | 대부분의 3D 게임 |
| A / 다익스트라* | 유연함, 커스터마이징 가능 | 직접 구현 필요 | 복잡한 경로 로직 필요 시 |
길찾기 알고리즘이 해결하는 것들
csharp
// 현재 방식: 직선만 체크
float distance = Vector3.Distance(playerPos, enemyPos); // 3m
bool canSee = !Physics.Raycast(...); // false → 포기
// 길찾기 알고리즘: 실제 이동 경로 계산
Path path = navMeshAgent.CalculatePath(playerPos, enemyPos);
float realDistance = path.GetTotalLength(); // 7m → 가능!
길찾기가 고려하는 것:
- 장애물 우회 경로
- 경사면, 계단 등 지형
- 여러 경로 중 최단 경로
- 동적으로 경로 재계산
핵심 교훈
"직선 거리가 아닌 실제 이동 거리로 생각해야 한다!"
- 2D 평면 게임 → 직선 거리로도 충분
- 3D 복잡한 지형 → 길찾기 알고리즘 필수
- 성능이 중요하면 → NavMesh (Unity 최적화)
- 특수한 로직 필요 → A* 직접 구현
설계 변경 포인트:
직선 Raycast로 장애물 체크- NavMesh 경로 계산으로 실제 이동 거리 체크
- A*로 맵 세팅 해서 실제 이동 거리 계산
- 경사면 우회, 계단 등 자연스럽게 처리 가능
'TIL' 카테고리의 다른 글
| [2025_11_27]BigInteger기반의 NumberFormatting (0) | 2025.11.28 |
|---|---|
| [2025_11_26]기획자와 협업할 때 데이터 관리에 대한 고민 (0) | 2025.11.26 |
| [2025_11_24]유니티 Batching을 이용한 최적화 및 Addressble (0) | 2025.11.25 |
| [2025_11_21] 프로젝트 마무리 (0) | 2025.11.21 |
| [2025_11_20]3d에서 캐릭터의 물리 문제 (0) | 2025.11.20 |