기본 개념
매스 엔티티(MassEntity) 는 언리얼 엔진 5에서 사용 가능한 데이터 지향 계산을 위한 프레임워크입니다.
매스 엔티티의 주요 데이터 구조는 프래그먼트(Fragment) 로, 계산에 사용되는 최소 단위의 데이터 조각을 나타냅니다. 프래그먼트의 종류로는 트랜스폼, 속도, LOD 인덱스 등이 있습니다. 프래그먼트는 컬렉션으로 그룹화 가능하며, 이 컬렉션의 인스턴스는 ID와 연계될 수 있습니다. 이 컬렉션 인스턴스를 엔티티(Entity) 라고 부릅니다.
엔티티 생성은 객체 지향 프로그래밍의 클래스 인스턴싱과 유사합니다. 그러나 엔티티는 클래스와 기능을 엄격하게 선언하는 대신 프래그먼트 컴포지션으로 빌드되고 이 컴포지션은 런타임에서 변경할 수 있습니다. 예를 들어, 엔티티의 컴포지션은 트랜스폼과 속도 같은 두 가지 프래그먼트를 포함할 수 있습니다.
프래그먼트와 엔티티는 로직을 포함하지 않고 데이터만 갖는 엘리먼트임에 주의해야 합니다.
아키타입(Archetype) 은 컴포지션이 동일한 엔티티의 컬렉션입니다. 각 아키타입은 특정 환경설정의 여러 프래그먼트 타입으로 구성됩니다. 예를 들어 [트랜스폼, 속도] 프래그먼트 컴포지션을 갖는 아키타입이 있다고 합시다. 그러면 이 아키타입과 관련된 모든 엔티티는 동일한 프래그먼트 컴포지션을 갖습니다.
아키타입 내의 엔티티는 메모리 청크(Chunk) 로 조직됩니다. 이 방식은 메모리에서 동일한 아키타입의 엔티티와 관련된 프래그먼트를 가져올 때 최고의 퍼포먼스를 실현합니다.
프로세서(Processor) 는 프래그먼트에 프로세싱 로직을 공급하는 스테이트 없는 클래스입니다. 프로세서는 엔티티 쿼리(EntityQuery) 를 사용하여 작업 수행에 필요한 프래그먼트 타입을 지정합니다. 엔티티 쿼리는 개별 엔티티의 식별자에 관계 없이 프로세서에 프래그먼트 배치를 제공합니다.
태그(Tag) 는 데이터를 포함하지 않는 사소한 프래그먼트입니다. 태그의 존재 여부 자체가 데이터로 활용됩니다. 태그는 엔티티 컴포지션의 일부입니다.
청크 프래그먼트(ChunkFragment) 는 엔티티 대신 청크와 연결된 프래그먼트입니다. 청크 프래그먼트는 레벨 오브 디테일(Level of Detail, LOD) 계산 등의 관리 프로세스에 사용되는 청크 단위 데이터를 저장하는 데 사용됩니다. 청크 프래그먼트는 엔티티 컴포지션의 일부입니다.
엔티티 프로세싱
MassCommandBuffer
프로세서는 프래그먼트 또는 태그를 추가하거나 제거하여 엔티티의 컴포지션을 변경할 수 있습니다. 그러나 프로세스 중에 엔티티의 컴포지션을 변경하면 엔티티가 한 아키타입에서 다른 아키타입으로 이동하게 됩니다.
프로세서는 매스 커맨드 버퍼(MassCommandBuffer) 명령을 사용하여 컴포지션 변경을 요청할 수 있습니다. 이 명령은 위 문제를 예방하기 위해 현재 프로세싱 배치의 끝에서 배치 프로세스됩니다.
EntityView
프래그먼트 직렬 프로세싱은 엔티티에서 작업을 수행하는 가장 효율적인 방법입니다. 그러나 때로는 현재 프로세스 중이 아닌 다른 엔티티에도 액세스해야 합니다. 이를 위해 프로세서는 엔티티 뷰(EntityView) 명령을 사용합니다.
엔티티 뷰는 현재 프로세싱 큐에 없는 다른 엔티티의 데이터에 액세스하는 안전하고 최적화된 방법을 제공합니다.
서브시스템
매스 엔티티 프레임워크는 캡슐화 및 코드 정리를 위해 다수의 서브시스템으로 나뉩니다. 모든 서브시스템은 월드 서브시스템이므로, 서브시스템의 수명은 생성된 월드의 수명에 귀속됩니다.
매스 엔티티 매니저
매스 엔티티 매니저(MassEntity Manager)* 는 매스 엔티티 프레임워크에서 가장 중요한 부분입니다. 매스 엔티티 매니저는 엔티티 아키타입(Entity Archetype)을 생성하고 호스팅합니다.
매니저는 프래그먼트를 추가하거나 제거하는 등의 엔티티 작업을 위한 인터페이스 역할을 합니다. 또한 엔티티를 다른 아키타입으로 이전하는 역할도 합니다. 다른 서브시스템은 매스 커맨드 버퍼 명령을 사용하여 이 함수 기능을 비동기적으로 호출할 수 있습니다.
엔티티 템플릿
엔티티 템플릿(Entity Template) 은 언리얼 엔진 에디터의 매스 엔티티 환경설정(MassEntityConfig) 데이터로부터 생성됩니다. 이 에셋은 생성되는 동안 엔티티에 추가할 수 있는 특성(Trait) 세트를 선언합니다. 또한 매스 엔티티 환경설정 에셋은 부모 에셋을 갖고 특성을 상속받을 수 있습니다.
특성
특성(Trait) 은 특정 함수 기능에 공급되는 프래그먼트와 프로세서를 총칭하는 이름입니다. 엔티티에는 특성 인스턴스를 몇 개든 추가할 수 있습니다. 각 특성 인스턴스는 엔티티가 그 특성이 공급하는 행동을 보이도록 프래그먼트를 추가하고 환경설정합니다. 특성의 일반적인 예시로는 회피(Avoidance) 행동, 타깃 바라보기, 스테이트 트리(State Tree) 사용하기 등이 있습니다.