[2025_11_25]직선 거리 기반 타겟팅의 한계와 길찾기 알고리즘의 필요성

2025. 11. 25. 21:05TIL

문제 상황

현재 배치
현재 이동 경로
원하는 이동 경로
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를 우회 경로로 선택 가능해야 함

문제점:

  1. 직선 거리 != 실제 이동 거리: Vector3.Distance는 장애물 무시
  2. Raycast는 직선만 체크: 우회로 존재 여부를 알 수 없음
  3. 동적 경로 재계산 불가: 한 번 타겟 정하면 끝

배운 점

복잡한 지형에서는 길찾기 알고리즘이 필수

방식장점단점적합한 상황

직선 거리 + 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*로 맵 세팅 해서 실제 이동 거리 계산
  • 경사면 우회, 계단 등 자연스럽게 처리 가능