🎯 AI 타겟 추적과 행동 취소 조건 정리
게임에서 AI가 똑똑하게 행동하려면 "언제 타겟을 쫓고, 언제 멈춰야 하는지"를 구분하는 것이 매우 중요합니다. 이번 글에서는 타겟 조건 체크, Line of Sight, 그리고 AI Perception이 어떤 역할을 하는지 정리해봅니다.
✅ TickTask에서 조건 체크하는 이유
1. 타겟이 죽었는지 확인
AI가 이미 죽은 캐릭터를 쫓아가는 건 어색합니다. 그래서 매 틱마다 유효한 타겟인지 확인해야 합니다.
if (!IsValid(Target) || Target->IsPendingKill())
{
FinishLatentTask(OwnerComp, EBTNodeResult::Failed);
return;
}
2. Line of Sight 체크 (시야 내 존재 여부)
적이 벽 뒤로 숨었다면, 더 이상 보이지 않아야 합니다. AI는 LineOfSightTo()를 통해 시야에 있는지 확인하고, 아닐 경우 행동을 중단하거나 다른 상태로 전환할 수 있습니다.
if (!AIController->LineOfSightTo(Target))
{
FinishLatentTask(OwnerComp, EBTNodeResult::Failed);
return;
}
3. 너무 멀어졌는지 체크
추격 도중 타겟이 일정 거리 이상 멀어졌다면 추격을 중단할 수도 있습니다.
💡 Latent Task라는 개념
AI가 타겟을 향해 이동하는 행동(Task)은 한 프레임 안에 끝나는 즉시 작업이 아니라, 일정 시간이 걸리는 행동입니다. 이런 행동을 언리얼에서는 "Latent Task"라고 부릅니다.
Latent Task란?
- "즉시 끝나지 않고, 일정 시간이 걸리는 Task"
- 예: "타겟까지 이동" → 몇 초가 걸릴 수 있음
왜 중요할까?
- UBTTaskNode::ExecuteTask()에서 즉시 성공/실패를 반환하지 않고 InProgress 상태로 유지 가능
- 실제로 이동이 완료되었을 때 FinishLatentTask()를 호출해서 성공 처리를 해줘야 합니다
AIController->MoveToActor(Target);
return EBTNodeResult::InProgress; // Task는 아직 진행 중
// 이동 완료 시 호출
FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded);
Latent Task는 이동 도중 타겟이 사라지거나 죽는 경우, TickTask()를 통해 조건을 체크하고 행동을 중단하는 데도 활용됩니다.
👁️ AI Perception은 언제 사용하나?
AI Perception은 AI가 타겟을 처음 감지하는 데 사용됩니다. 이후 행동은 Behavior Tree가 관리합니다.
주요 구성 요소
- Sight (시야 감지)
- Hearing (소리 감지)
- Damage, Touch 등
동작 흐름 예시
- AI Perception이 Player를 감지
- OnPerceptionUpdated() 함수에서 Target 설정
- Blackboard에 Target 저장
- Behavior Tree에서 해당 Target을 기반으로 행동 실행
🤖 Perception vs TickTask 비교
구분 역할 예시
| AI Perception | 타겟을 "감지" (인지) | Player 등장 확인 |
| BT Tick Task | 타겟을 계속 "유지"할지 확인 | 타겟이 죽거나 사라졌는지 체크 |
Perception은 시작점이고, TickTask는 지속 관리입니다.
🧠 결론 요약
- 타겟을 계속 추적하려면 중간 조건 검사가 필수입니다.
- 죽었거나, 안 보이거나, 너무 멀어진 경우 행동을 종료해야 자연스럽습니다.
- AI Perception은 감지를 담당하고, TickTask는 유지와 중단을 판단합니다.
- Latent Task는 시간 지연이 있는 행동을 관리하기 위한 구조이며, Tick과 함께 조건 검사를 통해 더 똑똑한 AI를 만들 수 있습니다.
이런 구조를 활용하면, 훨씬 똑똑하고 자연스러운 AI를 만들 수 있습니다!
'언리얼 엔진' 카테고리의 다른 글
| Unreal AI - Behavior Tree Task 종류 및 커스텀 구현 가이드 (0) | 2025.04.07 |
|---|---|
| Unreal AI - NavMesh 기반 이동 vs 커스텀 이동 정리 (0) | 2025.04.07 |
| Unreal AI - 블루프린트 to C++ 컨버팅 순서 가이드 (0) | 2025.04.04 |
| Unreal AI - AIController 헤더 구성과 멤버 선언 이유 (0) | 2025.04.04 |
| Unreal AI - 블루프린트 ↔ C++ 양방향 통신 방법 (1) | 2025.04.02 |