Blackboard
15강. Blackboard
1. 이번 강의에서 해결할 문제
Behavior Tree Task마다 플레이어를 다시 찾고 거리와 시야를 다시 계산합니다. AIController가 계산한 현재 판단 데이터를 Blackboard에 기록해 조건과 행동이 같은 사실을 읽게 합니다.
2. 학습 목표
3. 핵심 개념
Blackboard는 장기 영구 저장소가 아니라 실행 중인 AI가 판단에 필요한 값을 공유하는 공간입니다. 공식 Behavior Tree 문서에서는 Blackboard가 Tree가 결정을 내리는 데 사용하는 사용자 정의 Key를 보관한다고 설명합니다.
원본 상태와 판단 데이터는 구분합니다. HealthComponent가 체력 원본을 소유하고 Blackboard는 IsLowHealth 같은 판단 결과를 필요할 때 보관할 수 있습니다.
4. 단계별 실습
Unreal Editor 작업
Content/AI에 BB_EnemyCombat을 만들고 다음 Key를 추가합니다.
| Key | Type | 의미 |
|---|---|---|
| TargetActor | Object, Actor Base | 현재 플레이어 |
| PatrolLocation | Vector | 다음 순찰 목적지 |
| HasLineOfSight | Bool | 거리·각도·Trace 통과 |
| DistanceToTarget | Float | UI·Decorator용 실제 거리 |
| AIState | Enum 또는 Name | 현재 상태 |
C++ · 파일 경로: Source/TopDownSurvival/AI/MathAIController.h
private:
static const FName TargetActorKey;
static const FName PatrolLocationKey;
static const FName HasLineOfSightKey;
static const FName DistanceToTargetKey;
void UpdateBlackboardForTarget(AActor* Target);
C++ · 파일 경로: Source/TopDownSurvival/AI/MathAIController.cpp
#include "BehaviorTree/BlackboardComponent.h"
const FName AMathAIController::TargetActorKey(TEXT("TargetActor"));
const FName AMathAIController::PatrolLocationKey(TEXT("PatrolLocation"));
const FName AMathAIController::HasLineOfSightKey(TEXT("HasLineOfSight"));
const FName AMathAIController::DistanceToTargetKey(TEXT("DistanceToTarget"));
void AMathAIController::UpdateBlackboardForTarget(AActor* Target)
{
UBlackboardComponent* Blackboard = GetBlackboardComponent();
APawn* Enemy = GetPawn();
if (!Blackboard || !Enemy)
{
return;
}
const bool bValidTarget = IsValid(Target);
const float Distance = bValidTarget
? FVector::Dist2D(Enemy->GetActorLocation(), Target->GetActorLocation())
: TNumericLimits<float>::Max();
const bool bVisible = bValidTarget && HasClearSight(Target);
Blackboard->SetValueAsObject(TargetActorKey, bValidTarget ? Target : nullptr);
Blackboard->SetValueAsFloat(DistanceToTargetKey, Distance);
Blackboard->SetValueAsBool(HasLineOfSightKey, bVisible);
}
BehaviorTreeAsset에 BB_EnemyCombat을 연결하고 AIController의 RunBehaviorTree가 성공하면 GetBlackboardComponent가 해당 AI 인스턴스의 값을 제공합니다.
5. 코드와 수학·AI가 동작하는 이유
AIController가 거리와 시야를 한 번 계산해 Blackboard에 기록하면 Decorator와 Task가 같은 Snapshot을 읽습니다. Key 타입이 잘못되거나 이름이 다르면 기본값처럼 보여 원인을 찾기 어려우므로 상수 이름과 에디터 Key를 정확히 맞춥니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
Blackboard 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.