PART 5 · 강의 1/3

MassRepresentation

수만 개의 엔티티를 시각적으로 표현하는 Representation 시스템을 학습합니다

01

4가지 표현 타입

LOD 거리에 따른 시각적 표현 단계

UMassRepresentationSubsystem은 각 엔티티의 거리에 따라 4가지 시각적 표현 중 하나를 선택합니다.

LOD 단계 표현 타입 비용 거리
High Full Actor (Skeletal Mesh) 가장 높음 카메라 근접
Medium Low-Res Actor 중간 중거리
Low Instanced Static Mesh (ISM) 매우 낮음 원거리
Off 시각적 표현 없음 없음 최원거리/시야 밖
표현 타입 전환 개념도 // 카메라 거리에 따른 표현 타입 전환 // // 카메라 ◉ 시야 밖 // ├──────────┤───────────┤──────────────┤──────────────┤ // │ Full Actor│ Low Actor │ ISM │ No Visual │ // │ (High) │ (Medium) │ (Low) │ (Off) │ // │ │ │ │ │ // │ Skeletal │ Simplified│ Static Mesh │ 시뮬레이션만 │ // │ Animation │ Mesh │ Instanced │ │ // │ Full │ Limited │ Vertex Anim │ │ // │ Physics │ No Physics│ No Physics │ │ // ├──────────┤───────────┤──────────────┤──────────────┤ // 0m 50m 200m 1000m 5000m+
ISM의 위력

Instanced Static Mesh(ISM)는 하나의 드로우 콜로 수천 개의 메시를 렌더링합니다. City Sample에서 원거리의 보행자와 차량이 ISM으로 표현되어, 수만 개의 엔티티를 실시간으로 표시할 수 있습니다.

02

Representation Fragment

시각화에 사용되는 주요 Fragment

Fragment 역할
FMassRepresentationFragment 현재 표현 타입, 이전 표현 타입, 전환 상태
FMassRepresentationLODFragment LOD 거리 계산 결과, 가시성 정보
FMassActorFragment Actor 스폰 시 AActor 참조
FMassInstancedStaticMeshInfoFragment ISM 인스턴스 ID, 메시 정보
C++ - Visualization Trait 설정 // MassEntityConfig에서 Visualization Trait 설정 // // UMassVisualizationTrait: // High Resolution: // Actor Class: ABP_Character // Low Resolution: // Actor Class: ABP_SimpleCharacter // Static Mesh Description: // [0] Static Mesh: SM_Character_LOD0 // Material: MI_Character // [1] Static Mesh: SM_Character_Shadow (그림자 전용) // // Actor 풀링 설정: // Pool Size: 50 (동시에 스폰 가능한 Actor 수) // → 카메라 주변 50개만 Full Actor로 표시 // → 나머지 수천 개는 ISM으로 표현
03

Representation Processor

시각적 표현 업데이트를 처리하는 Processor

Representation 시스템은 여러 Processor가 협력하여 동작합니다.

Representation 처리 흐름 // Phase: PostPhysics // UMassVisualizationLODProcessor // → 카메라 거리 기반 LOD 레벨 계산 // → FMassRepresentationLODFragment 업데이트 // // Phase: FrameEnd // UMassRepresentationProcessor // → LOD 변경 감지 // → 표현 타입 전환 결정 // - ISM → Actor: Actor 풀에서 스폰 // - Actor → ISM: Actor 풀로 회수 // → ISM 인스턴스 트랜스폼 업데이트 // → Actor 트랜스폼 동기화 // // UMassRepresentationActorManagementProcessor // → Actor 스폰/디스폰 실행 // → 풀링 관리
FrameEnd 단계의 중요성

시각화 처리는 반드시 FrameEnd 단계에서 수행합니다. 이동, 물리, AI 등 모든 처리가 끝난 후에 최종 위치를 기반으로 렌더링 데이터를 갱신해야 하기 때문입니다.

04

Vertex Animation (ISM)

ISM에서의 정점 애니메이션 기법

ISM은 Static Mesh이므로 Skeletal Animation이 불가능합니다. 대신 Vertex Animation Texture(VAT)를 사용하여 Static Mesh가 움직이는 것처럼 보이게 합니다.

VAT 워크플로우 // Vertex Animation Texture 파이프라인 // // 1. Skeletal Mesh + Animation을 베이크 // → 텍스처에 프레임별 정점 위치 저장 // → Walk, Run, Idle 등 애니메이션별 텍스처 // // 2. Material에서 VAT 텍스처 샘플링 // → World Position Offset으로 정점 이동 // → 프레임 인덱스 = Time * FrameRate // // 3. ISM Custom Data로 애니메이션 제어 // → PerInstanceCustomData[0] = AnimationIndex // → PerInstanceCustomData[1] = PlaybackPosition // → PerInstanceCustomData[2] = PlaybackSpeed // // 장점: // - GPU에서 처리되므로 CPU 부하 없음 // - 수천 개의 ISM이 각자 다른 애니메이션 재생 가능 // // 단점: // - 애니메이션 품질이 Skeletal보다 낮음 // - 메모리 사용량 (텍스처 크기) // - 블렌딩이 제한적
실험적 기능

ISM 기반 Vertex Animation은 MassGameplay에서 실험적(Experimental)으로 분류됩니다. 모든 사용 사례에서 완전히 지원되지 않을 수 있으며, API가 변경될 수 있습니다.

SUMMARY

핵심 요약

  • MassRepresentation은 거리에 따라 High Actor, Low Actor, ISM, None 4단계로 엔티티를 표현한다
  • ISM(Instanced Static Mesh)은 하나의 드로우 콜로 수천 메시를 렌더링하여 원거리 엔티티에 최적이다
  • FMassRepresentationFragment와 FMassRepresentationLODFragment가 표현 상태를 관리한다
  • 시각화 처리는 FrameEnd 단계에서 수행하여 모든 로직 처리가 완료된 후 렌더링 데이터를 갱신한다
  • VAT(Vertex Animation Texture)로 ISM에서도 애니메이션 효과를 구현할 수 있다 (실험적)
  • Actor 풀링 시스템이 Actor 스폰/디스폰의 비용을 관리한다
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: MassRepresentation Trait 설정

MassEntityConfig에 MassRepresentation Trait을 추가하고, Static Mesh와 머티리얼을 할당하세요. ISM(Instanced Static Mesh)으로 수천 개의 엔티티가 효율적으로 렌더링되는 것을 확인하세요.

실습 2: Representation 타입 비교

FMassRepresentationType의 None, StaticMeshInstance, Actor 세 가지 모드를 비교하세요. 카메라 거리에 따라 자동으로 ISM / Actor 전환이 일어나는 것을 관찰하세요.

심화 과제: 커스텀 Visualization Processor

UMassVisualizationProcessor를 분석하고, 엔티티 상태(팀, 체력 등)에 따라 머티리얼 인스턴스의 색상을 동적으로 변경하는 커스텀 시각화 로직을 추가하세요.