TIL: Unreal C++ CH3 팀프로젝트 64일차

박춘팔·2026년 7월 2일

언리얼 TIL

목록 보기
56/61

누적 학습 시간 : 694시간 34분

📅 2026-07-02

조 : Team12 RPG
프로젝트 명 : Katana(가제)
목표 : Kannagi Usagi / Sekiro Like와 비슷한 보스전투 구현
기여 파트

  • Enemy
  • AIController
  • BB, BT
  • BTTask
  • 팀 생산성 향상을 위한 UE5 프로젝트 컨벤션 수립 및 Git 워크플로우 최적화
  • 그래픽 리소스 관리 파이프라인 구축(예정)

TA 스터디

30일간 하루에 Material 하나씩 만들기 챌린지

UE5 보스 Enemy AI 기본 구조 구현

오늘은 1:1 보스 전투를 위한 Enemy AI 기본 구조를 잡았다.
프로젝트에서는 일반 Enemy를 따로 두지 않고, Enemy = Boss 개념으로 설계했다.

구현한 구조

현재 Enemy AI는 다음 흐름으로 동작한다.

EnemyCharacterBase
└── EnemyAIController
    └── BehaviorTree / Blackboard
        ├── SelectNextAction
        ├── RotateToTarget
        └── ExecuteAttack

EnemyCharacterBaseBehaviorTreeAssetEnemyAttackComponent를 가지고, EnemyAIController는 Possess 시 해당 BT를 실행한다.

Blackboard / Behavior Tree

Blackboard에는 기본적으로 다음 Key를 사용했다.

TargetActor
HomeLocation
SelectedAction
SelectedPattern

Behavior Tree는 확률로 다음 행동을 선택하고, 선택된 값에 따라 분기하도록 구성했다.

SelectedAction == 0 → 이동
SelectedAction == 1 → 일반공격
SelectedAction == 2 → 강공격

BT 구조는 대략 다음과 같다.

Root
└── Sequence
    ├── Select Next Action
    └── Selector
        ├── Move
        ├── Normal Attack
        └── Strong Attack

TargetActor 세팅

초기에는 OnPossess() 시점에 Player를 바로 가져오려 했지만, Player Pawn이 아직 준비되지 않아 TargetActor가 null이 되는 문제가 있었다.

그래서 EnemyAIController에서 일정 간격으로 Player를 다시 찾고, 성공하면 Blackboard의 TargetActor에 세팅하도록 수정했다.

UpdateTargetActor();

이후 RotateToTarget Task에서 정상적으로 Player를 바라보는 것까지 확인했다.

커스텀 BTTask

오늘 만든 주요 BTTask는 다음과 같다.

BTTask_SelectNextAction
BTTask_RotateToTarget
BTTask_ExecuteAttack

SelectNextAction은 확률 기반으로 다음 행동을 선택한다.

Move
NormalAttack
StrongAttack

RotateToTarget은 Blackboard의 TargetActor를 읽어 Enemy가 대상을 바라보게 한다.

ExecuteAttackEnemyAttackComponent의 공격 실행 함수를 호출한다.

공격 패턴 구조

공격은 EnemyAttackComponent에서 처리하도록 분리했다.

현재는 실제 애니메이션이 없기 때문에 SelectedAction, SelectedPattern을 기준으로 일반공격/강공격 패턴을 구분하는 단계까지 진행했다.

SelectedAction == 1 → 일반공격
SelectedAction == 2 → 강공격
SelectedPattern == 0 or 1

즉 최종적으로는 다음 네 가지 공격 패턴으로 확장할 수 있다.

일반공격 1
일반공격 2
강공격 1
강공격 2

애니메이션 대기 구조

공격 애니메이션이 붙으면 BTTask_ExecuteAttack은 바로 Succeeded를 반환하면 안 된다.

공격 시작 시에는:

EBTNodeResult::InProgress

를 반환하고, 몽타주가 끝났을 때:

OnAttackFinished.Broadcast();

를 호출해서 Task를 완료시키는 구조로 갈 예정이다.

즉 최종 흐름은 다음과 같다.

BTTask_ExecuteAttack
→ EnemyAttackComponent::ExecuteAttack()
→ Attack Montage 재생
→ Montage End
→ OnAttackFinished.Broadcast()
→ FinishLatentTask()
→ 다음 BT 노드 진행

오늘 진행 결과

오늘은 실제 공격 애니메이션이나 데미지 판정보다는, 보스 AI가 동작하기 위한 기본 파이프라인을 구성했다.

확인된 내용:

Enemy Possess 정상 동작
Behavior Tree 실행 정상
TargetActor 세팅 정상
확률 기반 행동 선택 정상
RotateToTarget 정상
ExecuteAttack 진입 정상
일반공격 / 강공격 패턴 분기 준비 완료
profile
이것 저것 다해보는 삶

0개의 댓글