언리얼 AI 기초 정리 (AIController, Behavior Tree, Blackboard)

언리얼 AI 학습 노트. 강의 8.1~8.2 개념만. BT 구조 헷갈릴 때 다시 보기.

AIController와 빙의

지금까지 폰은 플레이어 컨트롤러가 수동 조종. AI는 플레이어 대신 AIController가 폰에 빙의해서 제어. 빙의 방식은 플레이어 컨트롤러와 동일.

NPC = 플레이어가 조종 안 하지만 레벨에 배치되는 캐릭터.

자동 빙의 설정: 캐릭터 클래스에서 AIControllerClass 지정 + AutoPossessAI를 PlacedInWorldOrSpawned로 두면 레벨 배치/스폰 시 자동 빙의.

필요 모듈: AIModule, NavigationSystem, GameplayTasks (Build.cs에 추가). 빠뜨리면 링크 에러 나니까 AI 작업 시작 전에 먼저 추가.

네비게이션 메시

NPC가 스스로 이동하려면 네비 메시 필요. NavMeshBoundsVolume을 레벨에 배치, 크기 설정 후 P키로 녹색 영역 확인(이게 이동 가능 영역).

핵심 함수 두 개:

  • GetRandomPointInNavigableRadius(): 이동 가능한 랜덤 목적지 반환
  • SimpleMoveToLocation(): 목적지로 폰 이동

FSM vs Behavior Tree

Finite State Machine: 상태 노드를 수평으로 연결. 상하 관계 없음. 모든 상태에서 모든 상태로 전환 가능. 구현 쉽지만 노드 많아지면 폭발적으로 복잡해짐.

Behavior Tree: 우선순위 + 트리 구조. 수직. 상위 노드가 어떤 서브트리를 실행할지 결정, 하위는 자기 작업만. 노드 많아도 가독성 유지. 대신 규칙과 노드 용도를 알아야 해서 진입장벽 있음.

Behavior Tree 기본 규칙

  • 위, 좌측일수록 우선순위 높음
  • 시작 노드 설정 불필요. 항상 왼쪽부터 깊이 우선 탐색
  • 각 노드를 Task라고 부름
  • Task는 단독 실행 불가. 반드시 Composite Task를 거쳐야 함

Blackboard

BT가 판단에 쓰는 데이터를 저장한 애셋. 매 순간 업데이트되며 BT 동작에 영향. BT의 분기 조건, 이동 목표 등이 전부 여기 키로 들어감.

Composite Task 세 종류 (라면 기계 비유)

  • Sequence: 자식들을 왼쪽부터 순서대로. 실패가 나오면 거기서 멈춤. (라면 없으면 물도 안 담음)
  • Selector: 자식 중 조건 맞는 하나 선택. 실패하면 다음 자식으로 넘어감. (신라면 없으면 너구리)
  • Parallel: 자식들을 동시에. 실패 나오면 멈춤

Task 수행 결과 네 가지

  • InProgress: 수행 중. 결과는 나중에 알려줌 (지연 Task)
  • Succeeded: 성공
  • Failed: 내부 요인 실패. 수행은 했는데 실패
  • Aborted: 외부 요인으로 중단됨

Failed와 Aborted 구분이 중요. Failed는 자기가 못한 거, Aborted는 밖에서 끊은 거.

Composite에 부착하는 기능 세 가지

  • Decorator: 이 Composite가 실행될 조건 지정 (if문 역할)
  • Service: 이 Composite 수행 중 일정 주기로 Tick 호출 (주기적 감지/갱신)
  • Observer Abort: Decorator 조건 부합 시 해당 Composite 내 작업 모두 중지하고 루트부터 다시

이 세 개가 BT의 핵심 도구. Decorator는 분기, Service는 주기 감지, Observer Abort는 중단/재시작.

+ Recent posts