Unity/Unity 개발

A* 경로 탐색 알고리즘 적용

leedh1211 2025. 5. 12. 22:11

문제점

기존에 몬스터 AI가 플레이어를 따라가도록 단순 추적 로직을 쓰고 있었는데,
장애물이 있는 경우 벽에 막혀서 가만히 서 있거나, 돌아가는 판단을 전혀 하지 못했다.
경로를 우회하는 방식이 전혀 없었기 때문에 맵 구조가 복잡해질수록 AI가 제대로 동작하지 않았다.

 

 

시도해본 것

처음엔 이동 방향을 바라보는 방향으로 유지하면서 Raycast로 벽을 감지하거나,
물리적으로 부딪히면 방향을 바꾸는 식으로 해결하려 했는데
정확성과 유연성이 너무 떨어졌고, 장애물을 지나지 못하는 문제는 그대로였다.

결국 A* 알고리즘을 도입해서 경로를 계산하고,
장애물이 있을 때는 계산된 경로를 따라가도록 변경했다.

해결방안

 

  • A* 알고리즘으로 GridManager에서 몬스터 위치 ~ 플레이어 위치까지의 경로를 계산
  • 경로가 있으면 _isFollowingPath 상태로 전환해서, 하나씩 좌표를 따라가게 처리
  • 일정 거리 이하로 가까워지면 다음 좌표로 넘어가고,
    마지막 도착 지점까지 다다르면 추적 종료
  • 플레이어가 지속적으로 움직이는 게임 특성상 경로를 따라가는 방식이 장애물이 있을 때는 잘 작동하지만,
    반대로 장애물이 없을때는 불필요한 계산이 많이필요할것 같았다.
    → 그래서 A*와 단순 추적을 상황에 따라 분기하는방식으로 수정했다.

 

주의점

 

  • A*는 장애물 회피에는 확실히 효과적이지만, 항상 최적의 선택은 아님
  • 장애물이 없는 평지에서는 A* 없이 단순하게 벡터 방향만 따라가는 게 빠르고 자연스러움
  • 그래서 평소엔 단순 추적, 장애물이 감지되면 A*로 전환하는 하이브리드 구조가 가장 현실적
  • 몬스터의 현재 위치와 타일 좌표를 잘 동기화하지 않으면 경로 계산이 어긋남
  • 실제 이동은 Rigidbody2D.MovePosition()으로 처리해야 충돌 이슈가 적고 깔끔함