행동 트리 모델의 구현
NPC 행동 트리 모델
- 내비게이션 메시 추가
'액터 배치-볼륨-내비메시 바운드 볼륨' 추가
브러시 세팅에서 볼륨 크기를 충분히 크게 지정
'프로젝트 세팅-엔진-내비게이션 메시'에서 런타임 생성 옵션을 Dynamic으로 변경
- NPC 행동 트리
Detect 서비스로 범위 내 Pawn을 타겟으로 세팅
- 타겟이 없으면
랜덤 이동
- 타겟이 있는 경우
하던 일을 멈추고
- 공격 가능하다면
공격하며 타겟을 향해 회전
- 공격 불가하다면
타겟을 향해 이동

실습코드
https://github.com/dnjfs/ArenaBattle/commit/f45df07c70e3139044b3af52f2394123c9e208c9
- BTTaskNode, BTService, BTDecorator 상속하여 구현
- 상속하여 BT에서 사용 가능
사진에선 BTTaskNode 타입으로 FindPatrolPos, TurnToTarget, Attack을 추가하였고
BTService 타입으로 Detect
BTDecorator 타입으로 AttackInRange 구현 (이름은 CanAttack으로 지정)
- 인터페이스 추가하여 NPC 기능 확장
- NPC 캐릭터 클래스에서 인터페이스 구현 후 BT 관련 클래스에서 인터페이스의 함수 활용
UBrainComponent::GetAIOwner() 함수로 AIController를 찾고,
AController::GetPawn() 함수로 캐릭터를 찾아 인터페이스 클래스로 캐스팅하여 사용
EBTNodeResult::Type UBTTask_Attack::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
EBTNodeResult::Type Result = Super::ExecuteTask(OwnerComp, NodeMemory);
APawn* ControllingPawn = Cast<APawn>(OwnerComp.GetAIOwner()->GetPawn());
if (ControllingPawn == nullptr)
return EBTNodeResult::Failed;
IABCharacterAIInterface* AIPawn = Cast<IABCharacterAIInterface>(ControllingPawn);
if (AIPawn == nullptr)
return EBTNodeResult::Failed;
...
AIPawn->AttackByAI();
return EBTNodeResult::InProgress;
}