본문 바로가기

Unity/DOTS

DOTS 학습을 위한 기초 정리 #2 엔티티란,

반응형

원본 : https://docs.unity3d.com/Packages/com.unity.entities@0.0/manual/ecs_entities.html

 

Entities | Package Manager UI website

Entities Entities are one of the three principle elements of a

docs.unity3d.com

엔티티(Entity)

  엔티티 구성 요소 시스템(Entity Component System) 아키텍처의 세 가지 주요 요소 중 하나로 게임이나 프로그램에서 '사물'을 나타냅니다. 행동(기능)이나 데이터를 가지고 있지는 않지만, 어떤 데이터가 함께 속하는지 식별하는 용도로 사용됩니다.  시스템(System)은 행동(기능)을 제공하며, 구성 요소(Component)는 데이터를 저장하는 역할을 합니다.

 

 엔티티는 기본적으로 ID를 뜻합니다. 쉽게 말해 이름조차 갖지 않은 초경량 GameObject로 생각할 수 있습니다. 다른 구성 요소 또는 엔티티에 대한 참조를 저장하는 유일한 안정적인 방법이 이 엔티티(ID)입니다.

 

 EntityManager는 세계(World) 내의 모든 엔티티들을 관리합니다. 또한 엔티티 목록을 관리하고 최적의 성능을 위해 엔티티와 관련된 데이터를 구성합니다.

 

 엔티티에 유형(Type)이 없더라도 엔티티 그룹은 연관된 엔티티 유형에 따라 분류 될 수 있습니다. 엔티티를 생성하고 컴포넌트를 엔티티에 추가하면 엔티티매니저는 기존 엔티티에 고유 한 컴포넌트 조합을 추적합니다. 이러한 고유 조합을 원형(Archetype)이라고합니다. 엔티티에 컴포넌트를 추가 할 때 엔티티매니저는 EntityArchetype을 사용하여 해당 Archetype을 준수하는 새로운 에티티를 생성할 수 있습니다. EntityArchetype을 미리 생성하고 이를 사용하여 엔티티를 생성 할 수도 있습니다.

 

엔티티 만들기 

 엔티티를 만드는 가장 쉬운 방법은 Unity Editor에 있습니다. 장면에 배치 된 GameObjects와 Prefabs를 런타임(실행중)에 엔티티로 변환토록 설정할 수 있습니다. 게임이나 프로그램의 보다 역동적인 부분에 대해서는 작업에서 여러 엔티티를 만드는 산란 시스템(Spawnning System)을 만들 수 있습니다. 마지막으로, EntityManager.CreateEntity 함수 중 하나를 사용하여 한 번에 하나씩 엔티티를 만들 수도 있습니다.

 

EntityManager로 엔티티 생성하기

 EntityManager.CreateEntity 함수 중 하나를 사용하여 엔티티를 만듭니다. 엔티티는 EntityManager와 동일한 세계(World)에서 작성됩니다.

 

다음과 같은 방법으로 엔티티를 하나씩 만들 수 있습니다.

 1. ComponentTpye 객체의 배열을 사용하여 구성 요소가 있는 엔티티를 만듭니다.

 2. EntityArchetype을 사용하여 컴포넌트로 엔티티를 생성합니다.

 3. Instantiate(인스턴스화)를 사용하여 현재 데이터가 포함된 기존 엔티티를 복사합니다.

 4. 컴포넌트가 없는 엔티티를 작성한 후 컴포넌트를 추가합니다.(구성 요소를 즉시 추가하거나 추가 구성 요소가 필요할 때 사용할 수 있습니다.)

 

한 번에 여러 엔티티를 만들 수도 있습니다.

 1. CreateEntity를 사용하여 동일한 Archetype을 가진 새로운 엔티티로 NativeArray를 채웁니다.

 2. Instantiate를 사용하여 NativeArray에 현재 데이터를 포함하여 기존 엔티티의 복사본을 채웁니다.

 3. CreateChunk와 함께 지정된 Archetype을 가진 지정된 수의 엔티티로 채워진 청크를 명시적으로 생성합니다.

 

구성 요소 추가 및 제거

 엔티티가 생성 된 후에는(혹은 후에도) 컴포넌트를 추가하거나 제거할 수 있습니다. 이렇게하면 영향을받는 엔티티의 Archetype이 변경되고 EntityManager는 변경된 데이터를 새로운 메모리 덩어리로 이동하고 원래 덩어리의 컴포넌트 배열을 압축해야합니다.

 

 구조 변경을 유발하는 엔티티 (즉, SharedComponentData 값을 변경하는 컴포넌트를 추가 또는 제거하고 엔티티를 파기하는)를 변경하면 작업 내에서 수행 할 수 없기 때문에 작업에서 수행 할 수 있는 데이터가 무효화 될 수 있습니다. 대신, 이러한 유형의 변경 사항을 EntityCommandBuffer에 적용 하고 작업 완료 후 이 명령 버퍼를 실행하는 명령을 추가합니다.

 

 Entity Manager는 NativeArray의 모든 엔티티는 물론 단일 엔티티에서 컴포넌트를 제거하는 기능을 제공합니다. 자세한 내용은 '컴포넌트' 항목을 참조하십시오.

 

엔티티 반복

 일치하는 컴포넌트 세트를 가진 모든 엔티티를 반복하는 것은 ECS 아키텍처의 중심에 있습니다. Entity Data Access를 참조하십시오.

 

 

 

 

#정리

 1. 엔티티란 ECS 중 E를 뜻하며, 각 객체를 식별하기 위한 기본단위 ID이다. 따라서 자체적으로 기능이나 데이터를 내포하고 있진 않다.

 2. 엔티티는 세계를 단위로 엔티티 매니저에 의해 관리받는다. 세계는 다음항목에서 다뤄진다.

 3. 엔티티 매니저는 엔티티를 관리하기 위해 연관있는 유형의 엔티티 끼리 그룹화 한다.

 4. 엔티티를 만들 때에는 크게 세가지 항목이 있다.

   가) 엔티티에 구성 요소를 첨가하여 만든다.

   나) 구성 요소를 이용하여 엔티티를 만든다.

   다) 이미 데이터가 있는 엔티티를 복사한다.

 5. 엔티티는 만들어진 후에도 수정할 수 있다.

 6. 구조가 변경되는 수정의 경우 현 작업중인 엔티티에게 영향을 끼칠 수 있다. 따라서 명령 버퍼를 통해 작업이 완료 된 후 변경할 수 있도록 한다.

 7. 특정 컴포넌트를 포함하고 있는 엔티티만을 골라서 반복하여 처리할 수 있는 아키텍처가 있다.

반응형