Unity ECS

이장근·2023년 4월 27일
0

Unity DOTS

목록 보기
5/6

ECS : Entity Component System

Entity: 엔티티는 어플리케이션을 채우는 것입니다. 데이터나 행동을 가지지 않으며, 어떤 데이터가 같이 있는지 식별합니다.

Components: 엔티티가 아니지만, 엔티티와 연관된 데이터 자체로 구성되어 있습니다.

System: 구성 데이터를 현재 상태에서 다음 상태로 변환하는 논리입니다. Entity와 Component를 조회해서 로직을 수행합니다.

Entity는 사실상 Archetype을 담고 있는 껍데기라고 이해하면 좋을 것 같다.

엔티티A와 B는 같은 아키타입M을 공유하며, Renderer가 없는 EntityC는 아키타입M 과 구분된 아키타입N을 가진다.
런타임에 엔티티의 아키타입 구성 요소를 추가/제거 할 수 있는데, 만약 엔티티B의 Renderer를 제거하면 아키타입N으로 이동하게 된다. 엔티티에 구성요소를 변경하려면 Component를 사용하면 된다. (add component)

Archetypes 창을 열려면 Window > DOTS > Archetypes로 이동합니다.

해당 창에서 사용중인 아키타입들을 볼 수 있는데, 그중 하나를 클릭하게 되면 우측에 상세 정보가 표기된다.
우측에 Components 항목을 보면 어떤 구성 요소들(Components)이 들어있는지 확인 할 수 있다.
Entity라는 항목에는 해당 아키타입에 들어있는 엔티티의 수를 알려준다.

만약 위의 Entity ABC의 예시로 들면, Archetype M의 Components 항목엔 [Translation][Rotation][LocalToWorld][Renderer]가 포함 되어있을 것이다.

에디터 아이콘 의미


(표 붙여넣기가 안되서 이미지로 붙여넣었음.)

구조적 변경 사항:

• 청크 생성
• 청크 파괴
• 청크에 엔티티 추가
• 청크에서 엔티티 제거
• ISharedComponentData 값을 설정하는 경우

구조적 변경 사항은 작업에서 수행할 수 없으며 주 스레드에서만 수행해야한다.
이를 위한 해결책은 EntityCommandBuffer를 사용하여 변경 사항을 기록해야 한다.

EntityCommandBuffer는 기록된 변경 사항을 나중에 다시 주 스레드에서 실행하여 변경 사항을 실행할 수 있다. 작업에서 컴포넌트를 즉시 추가하거나 제거 할 수는 없지만 EntityCommandBuffer를 사용하여 나중에 컴포넌트를 추가하거나 제거할 의도를 기록할 수 있다.

즉 ECB에 삭제 / 추가 명령을 넣어두면, 메인 스레드의 작업 시점까지 대기하고 있다가 해당 명령을 수행한다.

이렇게 번거롭게 작업하는 이유는, 기본적으로 ECS는 병렬적으로 실행되기 때문에 데이터가 사용중에 변경되는 일이 발생하는 걸 예방하기 위해서이다.

profile
Red Queen's Paradox

0개의 댓글