홈으로 돌아가기

Unity의 스티어링 비헤이비어: 에이전트 네비게이션

이 기사는 수중 Unity 3D 미로에서 물고기 에이전트 탐색을 위한 스티어링 비헤이비어 적용을 설명합니다. seek, pursuit, evade 알고리즘이 수학 공식과 함께 상세히 다뤄집니다. 이 접근법은 전역 경로 계획 없이 부드럽고 반응형 움직임을 보장합니다.

Unity 3D의 에이전트 네비게이션 스티어링 비헤이비어
Advertisement 728x90

Unity 3D에서 에이전트 네비게이션을 위한 스티어링 행동 구현하기

스티어링 행동은 동적 환경에서 자율 에이전트의 반응형 네비게이션을 제공합니다. Unity 프로젝트에서 에이전트(세 종류의 물고기)는 수중 미로를 이동하며 플레이어의 잠수함에 반응합니다. 각 종류는 기본 행동(추적, 추격, 회피, 배회, 충돌 회피)의 조합을 사용합니다. 이를 통해 전역 경로 탐색 없이도 부드러운 궤적이 가능해집니다.

이 접근법은 매 프레임마다 로컬 벡터 계산에 의존합니다. 에이전트는 목표물, 위협, 장애물을 고려하여 원하는 방향으로 속도와 방향을 조정합니다. 단순한 규칙들을 결합하면 복잡하고 자연스러운 움직임이 생성됩니다.

스티어링 행동의 기본 유형

스티어링 행동은 벡터 수학을 통해 구현되는 기본 유형으로 나뉩니다:

Google AdInline article slot
  • 추적: 에이전트 위치에서 목표물까지의 벡터를 계산하고 정규화하여 원하는 속도 방향으로 적용합니다.
  • 추격: 목표물의 속도와 방향을 기반으로 위치를 예측한 후 예측 지점을 추적합니다.
  • 회피: 예측된 위협 위치에서 반대 방향으로 추격합니다.
  • 배회: 에이전트 앞쪽 구체의 디스크 반경 내에서 무작위 편차가 적용된 기본 방향입니다.
  • 충돌 회피: 전방으로 레이를 스캔하여 가장 가까운 장애물에서 멀어지도록 조종합니다.

이러한 행동들은 가중치를 부여하여 합산되며, 최대 힘에 의해 제한되는 최종 스티어링 힘을 생성합니다.

수중 환경에서는 미로 벽으로 인해 충돌 회피가 중요합니다. 배회는 잠수함 영역 밖의 식용 물고기에게 다양성을 추가합니다.

물고기 에이전트를 위한 행동 모델

물고기는 식용, 위험, 독성 세 종류로 구분됩니다. 각 종류는 스티어링 행동을 기반으로 한 알고리즘에 대응합니다:

Google AdInline article slot
  • 따라가기(초기 모든 종류): 잠수함을 향해 추적하며 선형성을 피하기 위해 약간의 무작위 노이즈를 추가합니다.
  • 추격(위험/독성): 부드러운 방향 평활화를 적용한 추격입니다.
  • 회피(식용): 상호작용 영역에 진입하면 추적에서 회피 + 측면 오프셋으로 전환합니다.

부드러움은 계수 α ∈ [0,1]로 현재 방향과 원하는 방향을 보간하여 보장됩니다. 속도는 v_max로 제한되며, 수명 t_life ≤ T_max가 고려됩니다.

알고리즘의 수학적 구현

표기법:

  • x_s — 잠수함 위치
  • x_f — 물고기 위치
  • v_f — 물고기 속도
  • Δt — 시간 간격
  • R — 영역 반경
  • v_max — 최대 속도
  • u — 상향 벡터
  • t_life — 수명
  • T_max — 최대 수명

거리: d = ||x_s - x_f||

Google AdInline article slot

목표물까지의 단위 벡터: e_t = (x_s - x_f) / ||x_s - x_f||

따라가기

d = ||x_s - x_f|| > R

e_follow = e_t

노이즈 추가: e_follow = normalize(e_follow + k_r r), 여기서 r은 무작위 벡터 ||r|| < ε

추격

e_p = e_t

평활화: e_new = normalize((1-α) e_cur + α e_p)

v_f = v_max * e_new

회피

d > R이면: e = e_follow*

그렇지 않으면: e_evade = -e_t + lateral_offset (u × e_t에 수직)

v_f = v_max * normalize(e_evade)

위치 업데이트: x_f += v_f * Δt

이 공식들은 Unity에서 에이전트의 Update()에 통합됩니다. 충돌 회피는 레이캐스트 히트 감지 시 우선순위 스티어링 힘으로 추가됩니다.

Unity 통합 및 최적화

Unity에서는 위치/회전에 Transform을, 물리에는 Rigidbody(선택 사항)를 사용합니다. 스티어링 힘은 AddForce를 통해 또는 속도를 직접 설정하여 적용됩니다.

주요 성능 측면:

  • 네비메시 없이 로컬 계산 수행.
  • 회피를 위한 레이캐스트 제한(원뿔 형태로 3-5개 레이).
  • 물고기 스폰/디스폰을 위한 풀링.

행동은 3D 미로에 적응합니다: 수직 이동은 u-벡터를, 장애물은 Collider의 벽을 고려합니다.

시니어 개발자를 위해: 도착(목표물 근처에서 감속), 분리(에이전트 간 거리), 응집/무리짓기(물고기 군집)로 모델을 확장할 수 있습니다.

핵심 요약

  • 지역성: 스티어링 행동은 비용이 많이 드는 A*와 같은 계획을 피하므로 50개 이상의 에이전트에 적합합니다.
  • 결합 가능성: 가중치를 부여한 힘 합산으로 행동을 계층화할 수 있습니다(배회 + 추적 + 회피).
  • 반응성: 재계획 없이 잠수함 움직임에 즉시 적응합니다.
  • 부드러움: 보간으로 인해 덜덜거림이 방지되며, 수중 환경에 현실적입니다.
  • 확장성: 리더 추종 또는 그룹 행동을 쉽게 추가할 수 있습니다.

— Editorial Team

Advertisement 728x90

다음 읽기