컨텐츠 검색
[GAS/Day 1] 게임 로직의 진화: 오토마타부터 Gameplay Tags와 State Tree까지

2026. 1. 22. 12:57Unreal Engine/GAS

게임 개발을 하다 보면 캐릭터의 상태를 관리하는 문제에 늘 직면하게 됩니다. "지금 캐릭터가 무슨 행동을 하고 있지?", "공격 중에 점프가 되면 안 되는데?"와 같은 고민들입니다.

 

오늘은 이러한 게임 로직을 설계하는 근본적인 이론인 오토마타와 상태 머신(FSM)의 기초부터, 객체지향적인 State Pattern, 그리고 언리얼 엔진 5의 최신 기능인 Gameplay TagsState Tree까지 그 발전 과정을 총정리해 보겠습니다.

1. Boolean 지옥

프로그래밍 입문 단계에서는 캐릭터의 상태를 관리하기 위해 수많은 bool 변수를 사용하곤 했습니다.

bool bIsIdle = true;
bool bIsWalking = false;
bool bIsRunning = false;
bool bIsJumping = false;
bool bIsAttacking = false;
bool bIsStunned = false;
// ... 상태가 계속 늘어남

이 방식은 직관적으로 보이지만 변수가 늘어날수록 치명적인 한계를 드러냅니다.

  • 논리적 모순: 실수로 bIsIdle과 bIsRunning이 동시에 true가 되면 논리적 오류가 발생합니다.
  • 조건문 지옥: 상태를 확인할 때마다 if (!bIsStunned && !bIsJumping ...) 처럼 수많은 조건을 복잡하게 연결해야 합니다.

이러한 '관리 지옥'을 해결하기 위해 등장한 이론적 토대가 바로 오토마타와 상태 머신입니다.


2. 질서를 부여한 오토마타와 상태 머신 (FSM)

불리언 변수의 난잡함을 해결하기 위해, 우리는 컴퓨터 과학의 근본적인 이론을 빌려왔습니다.

2-1. 오토마타 (Automata)란?

오토마타는 계산 이론에서 사용하는 '스스로 작동하는 기계'를 뜻하는 추상적인 계산 모델입니다.

  • 정의: 입력이 들어왔을 때 내부의 규칙에 따라 상태를 바꾸고, 최종적으로 어떤 결과를 내놓을지 수학적으로 정의한 것입니다.
  • 게임에서의 적용: 게임 AI나 로직에서는 예측 가능한 결과를 위해 결정론적 유한 오토마타(DFA)를 주로 사용합니다. 이는 하나의 상태에서 하나의 입력을 받았을 때, 다음 상태가 오직 하나로 정해지는 모델입니다.

2-2. 유한 상태 머신 (Finite State Machine, FSM)

오토마타 이론을 바탕으로, 가질 수 있는 상태가 유한한 시스템을 설계하는 모델이 바로 상태 머신입니다.

일상생활의 신호등이나 자판기가 대표적인 예시입니다.

 

상태 머신은 다음 3가지 핵심 요소로 작동합니다.

  1. 상태 (State): 시스템의 현재 상황 (예: 대기, 달리기, 공격).
  2. 입력/이벤트 (Input): 상태를 변화시키는 트리거 (예: 버튼 입력, HP 0 이하).
  3. 전이 (Transition): 조건이 맞을 때 상태가 바뀌는 것 (예: '대기' → '달리기').

2-3. FSM이 해결한 것

FSM은 Enum을 사용하여 현재 상태를 단 하나(CurrentState)로 규정합니다.

  • 상태의 독점: "한 번에 하나의 상태만 가질 수 있다"는 규칙을 강제하여, 논리적 모순을 원천 차단했습니다.
  • 명확한 흐름: 스위치(Switch) 문 등을 통해 상태별 로직을 분리하여 코드의 가독성과 유지보수성을 높였습니다.

3. 구현의 고도화: State Pattern과 계층적 상태 기계 (HSM)

초기 FSM은 Enum과 Switch 문으로 구현했지만, 로직이 비대해지면 관리가 힘들어졌습니다.

이를 해결하기 위해 구조적인 발전이 이루어졌습니다.

3-1. State Pattern (상태 패턴)

상태를 단순히 Enum으로 두는 것이 아니라, 각 상태를 하나의 객체(Class)로 만드는 것입니다.

  • 구조: IState 인터페이스를 상속받아 OnEnter, OnUpdate, OnExit 함수를 구현합니다 .
  • 장점: 상태별 로직이 캡슐화되어 관리가 편해지고, 다형성을 활용하여 유연한 확장이 가능합니다 .

3-2. 계층적 상태 기계 (HSM, Hierarchical State Machine)

"걷기, 뛰기, 앉기" 상태에서 공통적으로 "피격" 처리를 해야 한다면 중복 코드가 발생합니다. 이를 해결한 것이 HSM입니다 .

  • 특징: Combat(전투)이라는 상위 상태(Super State) 아래에 Attack, Defend 같은 하위 상태를 두어, 공통 로직을 부모 상태에서 처리합니다 .
  • 예시: 언리얼 엔진의 애니메이션 블루프린트(ABP)의 State Machine이 바로 이 HSM 구조입니다.

4. 유연함을 더한 Gameplay Tags

FSM과 HSM으로 행동의 흐름은 완벽해졌습니다.

하지만 게임이 복잡해지면서 "상태는 하나여야 하는데, 속성은 여러 개여야 하는" 상황이 발생했습니다.

 

예를 들어, 캐릭터가 [달리는(Action)] 동시에 [독에 걸렸고(Debuff)] + [침묵 상태(Debuff)]이면서 + [이동 속도 버프(Buff)]를 받아야 한다면 어떨까요?

FSM으로 이를 구현하려면 Run_Poisoned_Silenced 처럼 상태의 개수가 폭발적으로 늘어나거나, 다시 FSM 내부에 bool 변수를 섞어 쓰는 '2차 불리언 지옥'에 빠지게 됩니다.

4-1. Gameplay Tags란?

이 문제를 해결하기 위해 언리얼 엔진은 Gameplay Tags 시스템을 제안합니다.

Gameplay Tags는 Character.State.Jumping 처럼 점(.)으로 구분된 계층적 문자열 태그 시스템입니다.

GameplayTagContainer라는 바구니에 여러 태그를 담아 관리합니다.

4-2. 왜 Gameplay Tags가 해결책인가?

항목 bool 방식(과거) GameplayTags 방식(최신)
확장성 새 bool 추가마다 코드 수정 Tag만 추가, 코드 변경 없음
조건 체크 복잡한 if 문 (&&, !) HasTag, HasAllTags 등으로 깔끔하게 처리
네트워크 복제 변수마다 Replicated 설정 필요 Tag Container 하나만 동기화하면 해결
디버깅 각 bool 확인 (노가다) Gameplay Debugger에서 한눈에
쿼리 불가능 "Character.State.\*" 검색
최적화 - FName 기반으로 관리되어 문자열 비교보다 매우 빠르고 가벼움
유지보수 변수 이름 변경 어려움 Tag 이름만 변경

Gameplay Tags는 FSM의 "단일 상태" 제약을 넘어, 여러 상태(버프, 디버프, 속성)를 동시에 중첩하여 관리할 수 있게 해줍니다.

즉, FSM이 '행동의 뼈대'를 잡는다면, Gameplay Tags는 '속성의 살'을 붙이는 역할을 합니다.


5. AI 로직의 미래: Behavior Tree와 State Tree

마지막으로 복잡한 AI 설계를 위한 최신 기능들입니다.

5-1. Behavior Tree (행동 트리)

FSM이 '상태' 중심이라면, Behavior Tree는 '행동' 중심입니다.

  • 특징: 조건(Decorator)과 우선순위에 따라 행동을 선택하며, 트리 구조로 되어 있어 시각적인 파악이 쉽습니다 . 주로 AI의 의사결정 로직에 사용됩니다.

5-2. State Tree (UE5의 새로운 제안)

최근 언리얼 엔진 5는 HSM + Behavior Tree + Gameplay Tags의 장점을 결합한 State Tree를 선보였습니다.

  • 구조: 상태를 계층적으로 구성(HSM)하되, 내부 동작은 Task와 Selector(Behavior Tree 개념)로 처리합니다 .
  • 장점: Gameplay Tags와 연동하여 조건을 평가하며, 일반적인 게임 로직부터 AI까지 아우르는 매우 효율적이고 현대적인 시스템입니다.

6. 결론: 가장 이상적인 설계 방식

게임 프로그래밍의 역사는 복잡성을 제어하기 위한 투쟁이었습니다.

이제 우리는 이 모든 도구를 적재적소에 사용해야 합니다.

  1. 오토마타와 FSM: 캐릭터의 메인 행동 흐름(대기→이동→공격)을 제어하여 논리적 뼈대를 세웁니다.
  2. Gameplay Tags: FName 기반의 빠른 속도를 활용하여, 캐릭터의 속성과 상태 이상(버프, 쿨타임, 무적)을 유연하게 관리합니다.
  3. State Tree/Behavior Tree: 복잡한 AI의 판단 로직이나 방대한 게임 상태를 체계적으로 구현합니다.

'Unreal Engine > GAS' 카테고리의 다른 글

[GAS/Day 2] 직접 구현 vs GAS 비교  (0) 2026.01.26