TIL_106 : Mass Entity (Zone Graph)

김펭귄·2026년 2월 9일

Today What I Learned (TIL)

목록 보기
106/109

1. Mass Entity

  • Entity Component System (ECS)를 활용하여 AI를 컨트롤 (일괄 처리)

  • 일반 Behavior Tree, State Tree를 이용하는 것(개별 처리)보다 훨씬 성능이 우수

  • 각 AI를 하나씩 처리하는게 아니라, 다 데이터(엔티티)로 보고 일괄 처리하여 많은 수의 AI를 컨트롤 가능

  • 그래서 AI Controller도 사용 안 함

  • 대규모 전쟁 시스템, 도시 시뮬레이션 등 AI 많을 때 사용하면 좋음

2. 플러그인

  • Mass Entity : 객체지향설계가 아니라 데이터 지향 설계를 가능하게 해주는 FrameWork

  • Mass Gameplay : 데이터 지향 설계에서 존재하는 단순한 데이터들의 덩어리들을 액터 시스템에 연결

  • Mass AI : State Tree랑 연결해주어, AI의 두뇌역할을 해주는 플러그인

  • Mass Crowd : 렌더링 알고리즘과 AI끼리 안 부딪히게 해주는 알고리즘 등이 들어있음

  • ZoneGraph : AI 전용 도로망(NavMesh보다 가벼움)

3. Zone Graph

  • 보행자도로, 차선처럼 경로/방향이 정해져있는 AI(Entity)가 다닐 수 있는 도로

  • Nav Mesh는 각 지점들이 연결되어 있는 네트워크의 일종

  • 그래서 AI가 다음 지점으로 길찾기 알고리즘을 하게 되면, NavMesh는 전부 다 해야해서 엄청 오래 걸리고, Zone Graph는 그냥 방향따라 이동만 하면 되므로 엄청 가벼움

  • 단점으로는, 방향따라서만 가고, NavMesh처럼 자유로운 움직임은 불가능

3.1. 생성

Details
  • Shape Type
    • Spline : 차선, 보행로 처럼 직선도로 만들 때 사용
    • Polygon : 교차로처럼 직선 Spline 2개를 중간에서 연결할 때 주로 사용

  • Lane Profiles : 이전에 생성한 Zone Shape는 정말 단순 도로 모양만 설치한 것.
    Edit Profile 또는 Project Settings에서 Lane Profile로 다양한 도로를 생성

  • Lanes : 이 도로가 몇 차선인지를 설정. 각 차선마다 너비, 이동 방향, 어떤 태그를 가진 Entity가 사용 가능한지를 지정

  • 이 세팅에서 Tag는 각 차선이 어떤 차선인지를 정하는 것.
    Zone Shape의 Detail에 있는 Tags는 이 Zone Graph가 어떤 도로인지를 정하는 것.

  • 즉, 태그를 가진 차선이 여러개가 있는 Zone graph의 Tag를 정하는 것.
    같은 Zone Graph여도 마을에 있냐, 던전에 있냐 이런것처럼 도로 전체의 Tag를 설정

3.2. 배치

  • 설치하고 사진처럼 Zone Graph를 보이게 해야 다른 도로 설치할 때도 나머지 잘 보임

  • zone graph의 끝 점(흰색점)을 이동하며 도로 설정

  • Alt키 누르고 이동 시, 도로 꺾임

  • 도로 생성하고 Build 탭에서 Build ZoneGraph를 해주어야 도로로 인식함

4. Entity 데이터 (Config)

  • Entity의 데이터들을 한 번에 설계도로 가지고, 이 설계도로 AI들을 계속 생성하는 방식이 Mass Entity(ECS) 방법

  • Entity의 설계도인 Data Asset을 생성

  • 이 빈 설계도에 Trait를 추가해주면서 기능을 추가해주는 것

4.1. ECS의 3가지 핵심 요소

  1. Traits : 엔티티들의 특성. 이걸로 엔티티의 모든 기능을 추가해줌

  2. Fragments : 가장 작은 데이터 단위

  3. Processor : Entity는 로직 없이, 데이터만 가짐. 이들을 거대한 프로세서가 감시하여 Traits만 보고 일괄처리하여 동작시킴

  • 그래서 그냥 특성만 넣어준 설계도만 만들면, 코드 없이 프로세서가 알아서 AI들을 조종해줌

4.2. 추가할 Trait

  • Assorted Fragments : 여러 fragment를 담아주는 잡동사니 주머니
    • Mass Actor Fragment : 필수요소로, 이 설계도를 어떤 액터로 변신시킬지를 정함
    • Transform Fragment : Transform 정보를 가지게 함
    • Agent Radius Fragment : 이 객체의 부피를 설정하여, 충돌 감지에 사용
    • Mass viewer Info Fragment : 카메라와의 거리를 측정하여 LOD 가능하게 해줌

  • Agent Capsule Collision Sync

    • 프로세서의 움직임 명령(Mass)대로, AI의 capsule도 동기화해주는 특성
    • Mass to Actor해주어야, 프로세서의 명령(Mass)에 따라 움직임.
      Actor to Mass는 액터의 움직임을 Mass에게 전달해주는 것으로, 특별한 상황에서만 사용
      Both Actor는 양방향 동기화
    • Sync Transform은 해제하여 충돌 크기만 동기화하고, 위치는 안 건들림
  • Agent Movement Sync

    • 이동을 동기화 시키는 것으로 동일하게 Mass to Actor로 설정
  • Agent Orientation Sync

    • 이동방향을 향하게 회전하도록 동기화. Mass to Actor로 설정
  • Crowd Member

    • 지금까지 이동관련 설정을 했고, 이제 군중(Entity)로 승격해주는 속성
    • 회피, 군중 네비게이션 등이 가능해짐

  • Crowd Visualization : LOD 가능하게 해줌
    • High Res : 가까운 애들 높은 해상도로 사용할 액터 클래스
    • Low Res : 먼 애들, 저해상도로 사용할 액터
    • Params : 여기서 언제 High/Low Res 쓸 지 정함. Static Mesh는 메시로 바꿔버리고, None은 안 보이게 됨
    • LOD Max Count : 최대 몇 마리까지 고해상도로 할 건지 세팅

  • Zone Graph Navigation
    • 이제 눈에 보이고, 어디로 이동할지를 정해야함. 이 속성 통해 Zone Graph 길 찾기 함
    • Any는 태그 하나라도 가지는 도로 사용 가능, All은 해당 Tag가 다 있어야 사용 가능, Not은 없어야 사용 가능

  • Movement
    • 이 특성 사용하게 되면 캐릭터의 무브먼트 컴포넌트는 무시되고, Mass에 의해서만 움직이게 됨
    • 여기서 걷기 속도 등 움직임 관련 설정해줌
  • Steering
    • 목표 지점을 향해 방향을 꺾는 정도 설정

  • Avoidance : 물체에 안 부딪히게 피하게 해주는 알고리즘 속성

  • Navigation Avoidance : 나 피하라고 알려주는 속성

  • Smooth Orientation : 부드럽게 방향 회전해줌

  • LODCollector : LOD 정보 수집해주게 함

4.3. AI 캐릭터에 붙이기

  • 프로세서가 명령을 내리면, 이 Mass Agent가 알아들어서 명령을 수행함

  • 밑에 Trait는 이 캐릭터에만 더 특성추가해주고 싶을 때 사용

5. Mass Spawner

  • 이제 만든 설계도로 엔티티들을 만들어 소환해줌

  • 알아서 이쁘게 소환해주고 알아서 메모리 관리도 해줌

배치 없이 레벨에 있기만 하면 됨Details
  • Count로 개수, Entity types로 소환할 Entity 설정

  • Proportion으로 확률에 따라 다른 설계도 사용도 가능

  • Spawn Data Generators : 어디에 소환할 건지

    • ZoneGraph~ : Zone Graph에서 스폰
    • EQS~ : EQS 이용해 소환
  • 실행하면 사진처럼 LOD에 따라 다른 액터로 잘 소환됨

6. State Tree 연결

  • State Tree까지 연결해주어야 Entity가 행동이 가능해짐

  • Behavior Tree는 각자가 판단하고 동작하는 객체지향형 방식이라 ECS에서 못 씀

  • 기존 Data Asset에 State Tree Trait를 추가하고, 새로 만들어줌

Mass Behavior로 선택

  • ZG Find Wander Target으로 이동할 위치를 찾음. Tags 설정해주기

  • ZG Path Follow를 이용해 위치로 이동함. 윗 task에서 찾은 위치인 WanderTargetLocation으로 설정

  • Movement Style이 Isvalid면 Config 특성 따라가겠다는 뜻

7. 애니메이션

  • AI들은 Mass로 일괄 처리되어 이동하기 때문에 Movement Component의 값이 정확하진 않게 됨

  • 따라서 Movement Component에서 값 가져오는 애니메이션을 수정해야함

  • 기존 ABP에서 단순 Ground Speed만으로 bShouldMove값을 정해줌

8. 결과 영상

  • LOD에 따라 액터도 바뀜

8.1. 디버깅

  • Activation 단축키(')를 누르면 디버깅 가능

  • AI 밑의 동그라미는 충돌 감지 영역

  • 각 화살표는 이동할 위치랑, AI의 forward vector

  • 여러 단축키 눌러 원하는 정보 확인도 가능 (shift + n은 zone graph 경로)

9. 플레이어 회피

  • 현재 플레이어는 장애물로 인식 안 해서 회피하지 않음

  • 플레이어용 Data Asset을 만들어 장애물로 인식해주면 됨

  • AI와 반대로, 플레이어의 위치를 Mass에게 알려줘야하므로 Actor to Mass로 설정

  • 그리고 플레이어에게 Mass Agent 컴포넌트 달고 데이터 에셋 추가하면 됨

profile
반갑습니다

0개의 댓글