콘텐츠로 이동

UE5 Mass Entity — 대규모 엔티티 시뮬레이션 (ECS)

Mass Entity는 UE5의 ECS(Entity Component System) 프레임워크입니다. 전통적인 Actor 기반 접근과 달리 데이터(Fragment)와 로직(Processor)을 분리하고 캐시 친화적 SoA(Structure of Arrays) 레이아웃으로 수천 개 엔티티를 효율적으로 처리합니다.


Entity — 고유 ID (데이터 없음, 순수 핸들)
Fragment — 엔티티에 붙는 데이터 컴포넌트 (USTRUCT)
Tag — 데이터 없는 마커 (필터링용)
Archetype — Fragment 조합이 동일한 엔티티 묶음
Processor — Archetype을 쿼리해 Fragment를 처리하는 시스템
Trait — 여러 Fragment/Processor를 묶은 재사용 단위

// Fragment: 순수 데이터 구조체
USTRUCT()
struct FMassVelocityFragment : public FMassFragment
{
GENERATED_BODY()
FVector Value = FVector::ZeroVector;
};
USTRUCT()
struct FMassHealthFragment : public FMassFragment
{
GENERATED_BODY()
float Current = 100.0f;
float Max = 100.0f;
};
// Tag: 상태 마커 (데이터 없음)
USTRUCT()
struct FMassDeadTag : public FMassTag
{
GENERATED_BODY()
};

UCLASS()
class UMoveProcessor : public UMassProcessor
{
GENERATED_BODY()
public:
UMoveProcessor();
protected:
virtual void ConfigureQueries() override;
virtual void Execute(FMassEntityManager& EntityManager,
FMassExecutionContext& Context) override;
private:
FMassEntityQuery EntityQuery;
};
UMoveProcessor::UMoveProcessor()
{
// 이 Processor가 처리할 Phase 지정
ExecutionFlags = (int32)EProcessorExecutionFlags::All;
ProcessingPhase = EMassProcessingPhase::PrePhysics;
}
void UMoveProcessor::ConfigureQueries()
{
// Velocity와 Transform이 모두 있는 엔티티만 쿼리
EntityQuery.AddRequirement<FMassVelocityFragment>(
EMassFragmentAccess::ReadOnly);
EntityQuery.AddRequirement<FTransformFragment>(
EMassFragmentAccess::ReadWrite);
EntityQuery.AddTagRequirement<FMassDeadTag>(
EMassFragmentPresence::None); // Dead 태그 없는 것만
}
void UMoveProcessor::Execute(FMassEntityManager& EntityManager,
FMassExecutionContext& Context)
{
float DeltaTime = Context.GetDeltaTimeSeconds();
EntityQuery.ForEachEntityChunk(EntityManager, Context,
[DeltaTime](FMassExecutionContext& Ctx)
{
// Chunk 단위로 SIMD 친화적 처리
TArrayView<const FMassVelocityFragment> Velocities =
Ctx.GetFragmentView<FMassVelocityFragment>();
TArrayView<FTransformFragment> Transforms =
Ctx.GetMutableFragmentView<FTransformFragment>();
const int32 Count = Ctx.GetNumEntities();
for (int32 i = 0; i < Count; ++i)
{
FVector NewLoc = Transforms[i].GetTransform().GetLocation()
+ Velocities[i].Value * DeltaTime;
Transforms[i].GetMutableTransform().SetLocation(NewLoc);
}
});
}

4. Trait 정의 — 재사용 가능한 설정 묶음

섹션 제목: “4. Trait 정의 — 재사용 가능한 설정 묶음”
UCLASS()
class UMovableTrait : public UMassEntityTraitBase
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere)
float MaxSpeed = 300.0f;
virtual void BuildTemplate(
FMassEntityTemplateBuildContext& BuildContext,
const UWorld& World) const override
{
// 이 Trait이 필요한 Fragment 추가
BuildContext.AddFragment<FMassVelocityFragment>();
BuildContext.AddFragment<FTransformFragment>();
// 초기값 설정
FMassVelocityFragment& Vel =
BuildContext.AddFragmentWithDefaultValue<FMassVelocityFragment>();
Vel.Value = FVector::ZeroVector;
}
};

// EntityManager를 통한 엔티티 생성
void AMySpawner::SpawnCrowd(int32 Count)
{
UMassEntitySubsystem* EntitySubsystem =
World->GetSubsystem<UMassEntitySubsystem>();
FMassEntityManager& EntityManager = EntitySubsystem->GetMutableEntityManager();
// 아키타입 빌드
FMassArchetypeHandle Archetype =
EntityManager.CreateArchetype(
{FMassVelocityFragment::StaticStruct(),
FTransformFragment::StaticStruct()});
// 배치 생성 (효율적)
TArray<FMassEntityHandle> Entities;
EntityManager.BatchCreateEntities(Archetype, Count, Entities);
// Fragment 초기화
for (auto& Entity : Entities)
{
FMassVelocityFragment& Vel =
EntityManager.GetFragmentDataChecked<FMassVelocityFragment>(Entity);
Vel.Value = FMath::VRand() * 200.0f;
}
}

Mass Entity는 렌더링이 없으므로 Niagara 또는 ISM(Instanced Static Mesh)으로 시각화합니다.

MassEntity → FTransformFragment 위치 데이터
MassVisualization Processor → ISMComponent 인스턴스 위치 동기화

플러그인: MassGameplay, MassRepresentation 활성화 필요


항목Actor 기반Mass Entity
1만 에이전트불가 (~10fps)가능 (60fps+)
메모리 레이아웃AoS (캐시 미스)SoA (캐시 친화적)
틱 오버헤드Actor마다 vtableChunk 배치 처리
렌더링개별 메시ISM/Niagara

Mass Entity는 수천~수만 개의 단순한 에이전트(군중, 트래픽, NPC 무리)를 60fps로 시뮬레이션할 수 있는 UE5의 ECS 솔루션입니다. Fragment로 데이터를 정의하고, Processor로 Chunk 단위 배치 처리를 구현하며, Trait으로 재사용 가능한 엔티티 템플릿을 구성하는 것이 핵심 패턴입니다.