본문으로 건너뛰기
게임 수학 · 게임 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강. 상태 머신 기초 미완료 상태