본문으로 건너뛰기
게임 수학 · 게임 AI 기초집LESSON 15

Blackboard

난이도초급
예상 시간45분
선수지식14강의 NavMesh 이동

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를 추가합니다.

KeyType의미
TargetActorObject, Actor Base현재 플레이어
PatrolLocationVector다음 순찰 목적지
HasLineOfSightBool거리·각도·Trace 통과
DistanceToTargetFloatUI·Decorator용 실제 거리
AIStateEnum 또는 Name현재 상태

C++ · 파일 경로: Source/TopDownSurvival/AI/MathAIController.h

MathAIController.h · Key와 갱신
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

MathAIController.cpp · Blackboard 갱신
#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. 핵심 요약

MINI QUIZ

Blackboard 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1다음 중 “Blackboard”의 핵심 요약을 실제 상황에 맞게 적용한 것은 무엇인가요?
  2. 문제 2“Blackboard”에서 ‘Blackboard를 저장 게임처럼 사용’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

15강. Blackboard 미완료 상태