5 분 소요

State Tree와 Mass AI에 대하여 알아보자

김하연 튜터님의 Notion 자료를 바탕으로 강의를 들으며
수정 및 재작성한 블로깅용 글

  • Mass Entity 라고도 표현함

  • MassAI, MassEntity, Mass Crowd, MassGameplay 등의 플러그인을 설치
    • MassEntity : 본체
  • ZoneGraph도 켜야 함
    (5.5 기준?)

1. Mass AI - Zone Graphs 🗺️

Mass AI란?

대규모 군중 시뮬레이션 시스템으로,
Entity Component System (ECS) 아키텍처를 사용
(ECS?)

전통적인 AI vs Mass AI

구분 전통적인 AI Mass AI
구조 개별 액터 + AI Controller 경량 Entity + ECS
적합 규모 수십 명 수천 명
성능 개별 처리 (느림) 일괄 처리 (빠름)
  • Entity : AI와 유사하다고 일단 생각

Zone Graph의 개념

Zone Graph는 NPC의 이동 경로와 영역을 정의하는 내비게이션 시스템입니다.

  • NavMesh
    “어디를 걸을 수 있는가?”
    (어디까지 갈 수 있는가?)
  • Zone Graph
    “어떤 경로를 따라 걸을 것인가?”
    (ex - 고속도로 차선)
    • 규칙이 있는 하나의 길
      (도시에서 AI들이 규칙에 따라 이동(인도, 횡단보도 등))

Zone Graph 구성 요소

Alt를 눌러 추가 조작이 가능

  • Show -> Zone graph를 킴으로서
    선택하지 않은 Zone Graph도 볼 수 있음

1) Zone Shape (형태)

  • Spline (스플라인)
    길, 보도, 복도 같은 선형 경로
  • Polygon (폴리곤)
    광장, 공원, 건물 내부 같은 넓은 영역

2) Lanes (차선)

각 Zone Shape 내의 세부 이동 경로:
(Project Settings - Engine - ZoneGraph에서 설정 가능)

  • Width: 차선의 폭
  • Direction: Forward(전진), Backward(후진), Both(양방향)
  • Tags: 접근 권한 제어
  • Speed: 속도 제한 (선택사항)

3) Tags (태그)

NPC 유형경로를 ‘연결’하는 분류 시스템:
(Project Settings - Engine - ZoneGraph에서 설정 가능)

  • Pedestrian: 보행자용 경로
  • Vehicle: 차량용 도로
  • HighClass: VIP 전용 구역

태그 시스템 활용

계층화된 세계 구축

일반 농민 → Pedestrian 태그만 → 공공 도로만 접근
상인 → Pedestrian + Merchant 태그 → 상점 내부도 접근
귀족 → All 태그 → 성과 정원까지 접근
  • 엔진에서 설정하는 것 말고
    ZoneShape 내부의 Tag 자체도 존재함
    • 세부적인 설정용도의 Tag
      • 같은 보행자용 도로이지만,
        마을 안/ 위험지대 도로 구분 등의 용도로 구분 가능

2. Mass Entity Config Asset ⚙️

도로를 깔았으니 그 규칙을 따를 Entity를 만들기

Config Asset이란?

  • *Mass Entity의 설계도
  • Blueprint가 액터를 정의하듯, Config Asset은 Mass 엔티티를 정의

  • MassEntityConfigAsset 으로 생성

핵심 개념

여러 ‘특성’을 조합하여 Entity를 만듦

1) Fragments (프래그먼트)

엔티티가 보유하는 데이터 조각:

  • Transform Fragment: 위치와 회전
  • Velocity Fragment: 속도
  • Health Fragment: 체력

2) Traits (특성)

엔티티에 기능을 추가하는 모듈:

  • Movement Trait: 이동 기능
  • Avoidance Trait: 충돌 회피
  • Animation Trait: 애니메이션

MassAI 관련 Traits

  • MassActorFragment : Mass AI 관련하여 필요한 프래그먼트
  • AgentRadiusFragment : NPC의 충돌 범위를 지정
  • MassViewInfoFragment : LOD 관련 정보를 저장 (최적화)
  • AgentCapsuleCollisionSync : 아래의 ‘동기화’ 관련하여 필요한 기능

Crowd 관련

  • CrowdMember
  • Crowd Visualization

이런 대량의 AI 를 다루는 경우 LOD 같은 최적화 옵션을 잘 체크해야 함

3) Processors (프로세서)

Fragments를 처리하고 업데이트하는 시스템

  • 이러한 Entity들을 ‘한번에’ 처리하는 거대한 로직
    (Entity는 ‘정보’만, 로직을 프로세서가 처리)

Traits와 Fragments의 관계

Movement Trait 추가
  ↓
자동으로 추가되는 Fragments:
  - Transform Fragment
  - Velocity Fragment
  - Movement Parameters Fragment
  ↓
Movement Processor 활성화

모듈식 설계의 장점

  • 필요한 기능만 선택적 추가
  • 메모리 효율성 극대화
  • 다양한 NPC 유형 쉽게 생성

자동으로 작동하는 시스템들

Config Asset에서 추가한 Traits 덕분에

  • Avoidance Trait: 다른 NPC와 충돌 예측 및 회피
  • Movement Trait: 부드러운 이동 처리
  • Steering Trait: 자연스러운 회전
  • Navigate Obstacle Trait: 장애물 우회

추가 코드 없이 자동으로 작동!

3. Sync (동기화) 🔄

  • MassEntity : Entity 기준으로 동작
  • Actor : Actor 기반의 실제 동작

이 둘의 행동을 실제로 동기화 해야 함

Sync란?

Mass Entity(데이터)와 Visual Actor(3D 캐릭터) 사이의 정보 동기화

Mass Entity (두뇌)
    ↕️ Sync
Visual Actor (몸)
  • Sync Transform은 끄는편이 좋을 수 있음

동기화 방향

  • Mass to Actor: Mass 계산 → 액터 적용 (가장 일반적)
  • Actor to Mass: 액터 상태 → Mass 전달
  • Both Ways: 양방향 동기화

예시

Agent Movement Sync (Mass to Actor):

Mass가 새 위치 계산 → Visual Actor를 그 위치로 이동

Player Navigation Obstacle (Actor to Mass):

플레이어 이동 → Mass 시스템에 위치 알림 → NPC가 회피

여기까지 왔으면
도로와 그 위의 데이터 세팅은 어느정도 한 편

  • 적당한 캐릭터 BP 생성
  • Config 쪽의 Visualization에서
    고/저해상도 캐릭터에 해당 캐릭터를 넣어줌
    • Params의 LOD 세팅 중 StaticMeshInstance로 설정하는 경우, 멀리 있으면 T-Pose 같은 표시가 될 수 있으므로 주의
  • ZoneGraph Navigation
    Lane을 실제로 걸을 수 있게 하는 Trait
    Tag를 조합
    Any : or 조건 (하나라도 만족하면 가능)
    All : and 조건 (전부 만족할때 가능)
    Not : Not 조건 (이 태그 있으면 절대 안감)
  • Movement를 설정하여 움직임에 대한 수치 추가 설정
    (있어야 함!)

  • Mass Spawner를 이용하여 실제로 생성
    • config와 수량을 세팅
    • ZoneGraph를 통해 Spawn Data 설정하기
  • Zone Graph 빌드까지 하면 Zone Graph 위를 걸을 수 있음

  • 다만 State Tree 설정은 아직 안했기에 실제로 걷지 않음
    (기능을 알지만, 실제 판단 주체가 없는 상황)
    (BT는 사용 x)
    • 성능 이슈
      (AI 한마리당 AI Controller가 필요)

4. Wander (배회) State 구현 🚶

Wander의 두 단계

  1. 목표 찾기: 어디로 갈지 결정
  2. 이동하기: 그곳까지 경로 따라 이동

Task 구성

Task 1: ZG Find Wander Target

  • 주변 도로의 정보를 읽을 수 있고
    임의의 위치 선택
현재 위치에서 Zone Graph 검색
  ↓
태그 필터링 (Pedestrian, HighClass)
  ↓
무작위 지점 선택
  ↓
Output: Wander Target Location

Task 2: ZG Path Follow

  • 실제 이동
  • Task 하나당 State 하나씩 파는게 좋지 않나?
    • 내부적으로 자동 연동이 됨
    • 따로 파면 전역 변수 하나 파야 함
    • 단순한 무한루프 용이기에 그 부분은 괜찮음
Input: Wander Target Location (Task 1의 출력)
  ↓
경로 계산
  ↓
경로 따라 이동

Transition 설정

On State Completed → Transition to Root

Wander 완료 → Root로 돌아가기 → Wander 재시작 → 무한 반복

5. Mass AI 디버깅 🎨

디버그 명령어 (게임 내 ‘ 키)

  • 기본 뷰: Mass 데이터 + 위치
  • Shift + V: 속도, 상태 등 추가 정보
  • Shift + O: 회피(Avoidance) 시각화
  • Shift + C: 경로(Zone Graph) 표시
  • Shift + S: Shape 표시

시각적 요소

  • : Mass 엔티티 위치
  • 메시: Visual Actor 위치
  • 화살표: 이동 방향과 의도
  • 노란색 선: 목표 방향 (Smooth Orientation)
  • 작은 선들: 회피 벡터
  • Maroon 화살표: 원하는 목적지

6. 플레이어-NPC 상호작용 🤪

문제

  • NPC는 다른 Mass 엔티티만 인식
  • 플레이어는 Mass 엔티티가 아님
  • 결과: NPC가 플레이어를 “보지 못함”

해결: Navigation Obstacle

  • Navigation Obstacle?
    장애물로 인식하는 Trait

플레이어를 Mass 시스템에 등록

Player Config Asset 생성
  ↓
Traits 추가:
  - Agent Capsule Collision Sync (Actor to Mass)
  - Navigation Obstacle
  ↓
플레이어 위치를 매 프레임 Mass에 전달
  ↓
NPC가 플레이어를 회피

Mass AI 는 CharacterMovement를 이용하지 않음

  • 그렇기에 ABP 설정 시엔 해당 부분에 유의할 것

AI Controller는 사용하지 않음

  • BT를 사용하지 않는 이유가 AI Controller를 개당 사용하게 되므로
    AI Controller 자체를 하나씩 생성하지 않기 위해 사용하는 기능

  • Entity라는 데이터 덩어리를 Processer가 움직여 주는 방식임

  • 세부 로직은 State Tree를 이용하여 로직 처리가 가능함

추가 질문들

  • Mass Entity 의 요소를 런타임 중에 추가/제거 등도 가능함

  • Mass Spawn으로 태어나는 요소들은 Actor가 아니며 Entity라는 매우 가벼운 요소임
    • 거듭 말하듯 Data(Fragment)들을 기반으로 Processor가 움직여 주는 것
    • 다만 필요에 따라 MassActorTrait 등을 통해 실제 Actor 등으로 변환 가능함
  • 그래도 State Tree를 이용하여 전투 로직을 짤 순 있음
    (GAS 연동시 ASC 를 달아야 하기에 Actor 승격이 필요함)
    (AI끼리만 싸운다면 GAS 대신, 자체적인 대미지 처리를 고려)
    • AI 끼리는 자체적인 대미지 처리
    • AI <-> Player 의 경우에, AI를 Actor로 승격하여 GAS를 통해 대미지 처리하기
  • Mass Entity끼리 공격이 가능함

댓글남기기