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

상태 머신 기초

난이도초급
예상 시간45분
선수지식16강의 Behavior Tree

17강. 상태 머신 기초

1. 이번 강의에서 해결할 문제

조건문은 있지만 적이 왜 Patrol에서 Chase로 바뀌었는지 기록하기 어렵고 공격 거리 경계에서 상태가 흔들립니다. 현재 상태와 전환 원인을 명시합니다.

2. 학습 목표

3. 핵심 개념

Finite State Machine은 한 시점에 하나의 상태를 갖고 조건에 따라 전환합니다.

전환 규칙
Idle → Patrol: 시작 준비 완료
Patrol → Chase: 목표가 추적 거리와 시야 안
Chase → Attack: 목표가 공격 거리와 시야 안
Attack → Chase: 공격 이탈 거리 초과
Chase → Patrol: 목표 상실 시간이 임계값 초과

Behavior Tree와 상태 머신은 경쟁 관계가 아닙니다. 상태는 현재 판단을 요약하고 BT는 해당 상태에서 실행할 행동 순서를 조합할 수 있습니다.

4. 단계별 실습

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

MathAIController.h · 추가
public:
EEnemyAIState GetAIState() const { return CurrentState; }

private:
EEnemyAIState DetermineState(float Distance, bool bVisible) const;
void SetAIState(EEnemyAIState NewState);

UPROPERTY(VisibleInstanceOnly, Category = "AI|State")
EEnemyAIState CurrentState = EEnemyAIState::Idle;

UPROPERTY(EditDefaultsOnly, Category = "AI|State")
float ChaseDistance = 1200.0f;

UPROPERTY(EditDefaultsOnly, Category = "AI|State")
float AttackDistance = 150.0f;

UPROPERTY(EditDefaultsOnly, Category = "AI|State")
float AttackExitDistance = 190.0f;

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

MathAIController.cpp · 상태 결정
EEnemyAIState AMathAIController::DetermineState(
float Distance, bool bVisible) const
{
if (!bVisible)
{
return EEnemyAIState::Patrol;
}

if (CurrentState == EEnemyAIState::Attack &&
Distance <= AttackExitDistance)
{
return EEnemyAIState::Attack;
}

if (Distance <= AttackDistance)
{
return EEnemyAIState::Attack;
}
if (Distance <= ChaseDistance)
{
return EEnemyAIState::Chase;
}
return EEnemyAIState::Patrol;
}

void AMathAIController::SetAIState(EEnemyAIState NewState)
{
if (CurrentState == NewState) return;

UE_LOG(LogTemp, Display, TEXT("%s state %d -> %d"),
*GetName(), static_cast<int32>(CurrentState), static_cast<int32>(NewState));
CurrentState = NewState;

if (UBlackboardComponent* Blackboard = GetBlackboardComponent())
{
Blackboard->SetValueAsEnum(
TEXT("AIState"), static_cast<uint8>(CurrentState));
}
}

Blueprint·Blackboard 작업

BB_EnemyCombat의 AIState를 Enum Key로 만들고 EnemyAIState를 선택합니다. BT Branch Decorator가 AIState 값으로 Attack, Chase, Patrol을 선택하게 합니다.

5. 코드와 수학·AI가 동작하는 이유

공격 상태에서는 더 넓은 AttackExitDistance까지 유지해 경계에서 작은 위치 변화가 상태를 뒤집지 않습니다. 상태가 실제로 바뀔 때만 로그와 Blackboard를 갱신해 불필요한 Observer 이벤트를 줄입니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

상태 머신 기초 미니 퀴즈

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

0 / 2
  1. 문제 1“상태 머신 기초”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2“상태 머신 기초”의 작업 기준으로 ‘상태마다 중복 거리 계산’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

17강. 상태 머신 기초 미완료 상태