컴포넌트 기반 엔터티 아키텍처에서 "시스템"의 역할은 무엇입니까?


177

엔터티 구성 요소 및 시스템에 대해 많이 읽었으며 엔터티가 ID라는 아이디어는 매우 흥미 롭습니다.

그러나 이것이 어떻게 구성 요소 측면이나 시스템 측면에서 완벽하게 작동하는지 모르겠습니다. 구성 요소는 일부 관련 시스템에서 관리하는 데이터 개체 일뿐입니다. 충돌 시스템은 일부 BoundsComponent를 공간 데이터 구조와 함께 사용하여 충돌이 발생했는지 확인합니다.

지금까지는 좋았지 만 여러 시스템이 동일한 구성 요소에 액세스해야하는 경우 어떻게해야합니까? 데이터는 어디에 살아야합니까? 입력 시스템은 엔티티 BoundsComponent를 수정할 수 있지만 물리 시스템은 일부 렌더링 시스템과 동일한 구성 요소에 액세스해야합니다.

또한 엔터티는 어떻게 구성됩니까? 내가 많이 읽은 장점 중 하나는 엔터티 구성의 유연성입니다. 시스템이 본질적으로 구성 요소에 연결되어 있습니까? 새로운 구성 요소를 도입하려면 새로운 시스템을 도입하거나 기존 시스템을 수정해야합니까?

내가 자주 읽은 또 다른 것은 엔터티의 '유형'이 가지고있는 구성 요소에 의해 유추된다는 것입니다. 내 엔터티가 ID 인 경우 로봇 엔터티를 일부 시스템에서 이동하거나 렌더링하여 수정해야한다는 것을 어떻게 알 수 있습니까?

긴 게시물이 유감입니다 (또는 적어도 내 휴대 전화 화면에서는 그렇게 보입니다)!

답변:


336

엔터티 구성 요소 시스템을 표현하고 구현하는 방법에는 여러 가지가 있지만 여기에는 한 가지 방법에 대한 설명이 있습니다. 엔터티 / 컴포넌트 / 시스템 아키텍처에 대한 구체적인 정의가 없으므로 이는 하나의 구현 일뿐입니다.

도움이 될 수있는 엔터티 / 구성 요소 / 시스템 아키텍처에 대한 비유를 소개하겠습니다. 실체를 열쇠처럼 생각합시다.

엔터티

엔터티 키

키에는 또한 이빨이 있습니다 (진한 파란색). 엔터티 키의 톱니는이를 구성하는 구성 요소입니다. 같은 이빨을 가지고 있더라도 ID로 구별 할 수 있습니다. 그렇다면 열쇠는 무엇에 적합합니까? 자물쇠. 자물쇠는 우리의 시스템입니다. 예를 들어, 운동 시스템.

시스템

운동 시스템 잠금

잠금 장치는 키에 위치와 속도에 대한 톱니가있는 경우에만 작동합니다. 이 시스템은 위치와 속도가있는 엔티티 만 처리합니다. 이러한 시스템이 처리 할 엔티티를 인식하는 방법을 설정하는 방법에는 여러 가지가 있지만 한 가지 방법은을 사용하는 것 long입니다. 각 비트는 구성 요소 유형용으로 예약되어 있습니다. 이 예에서는 64 비트 대신 4 비트 유형을 가정합니다. 예제 엔터티에는 사용 가능한 모든 구성 요소가 있습니다. 따라서 핵심은입니다 1111. 그런 다음 시스템은을 가진 엔티티를 찾습니다 11--. 합니다 ( -스프라이트 또는 건강이 있다면 운동은 상관하지 않기 때문에 걱정하지 않는다 대표). 간단한 AND조작으로 개체를 확인할 수 있습니다 . 따라서 우리 엔티티는 if와 일치합니다 ((1111 & 1100) == 1100). 내가 당신을 잃어버린 경우 비트 연산 에 대해 좀 더 확인하십시오 .

보시다시피 시스템은 외부 리소스에 액세스 할 수 있습니다. 시간, 그래픽, 사운드 등에 액세스 할 수 있습니다. 한 번에 하나의 키를 가져 와서 데이터를 처리하는 작은 프로세서 일뿐입니다. 운동 시스템은 속도, 델타 시간 및 위치를 취합니다. 그런 다음 일부 계산을 수행하고 결과를 다시 제자리에 저장합니다.

엔티티 키는 실제로 생성하기가 쉽습니다. 마음대로 추가하거나 제거 할 수 있습니다. 엔티티는 신경 쓰지 않으며 구성 요소를 그룹화하고 유지하는 방법 일뿐입니다. 구성 요소는 상호 의존성이 없습니다. 구성 요소가 서로 상호 작용하는 가장 가까운 것은 시스템이 구성 요소를 작동시키고 이동 예와 같이 데이터를 사용하여 서로 데이터를 업데이트 할 때입니다.

아이디어를 구체화하는 데 도움이되는 다른 시스템을 살펴 보겠습니다.

도면 시스템 잠금

이것이 우리의 그림 시스템입니다. 일치하는 구성 요소를 찾습니다 1-1-. 이 엔티티는 다음과 같은 이유로 일치합니다. ((1111 & 1010) == 1010)또한 엔티티 스프라이트를 해당 위치에 그려서이 시스템이 정보를 화면에 출력 함을 알 수 있습니다.

좋아, 하나 더 다른 엔터티를 살펴보고 지금까지의 예에 어떻게 적용되는지 살펴 보겠습니다.

움직일 수없는 엔터티 키

보다시피이 엔터티에는 연결된 구성 요소가 더 적습니다. 구성 요소를 살펴보면 바위 같은 정적 항목이 될 수 있습니다. 위치와 스프라이트가 있습니다. 움직이지 않으며 건강상의 변화에 ​​영향을받지 않습니다. 이 엔티티는 1010의 키를 생성합니다. 그러면이 엔티티에서 어떤 시스템이 작동합니까? 점검 해보자:

우리의 운동 시스템에 반대 : ((1010 & 1100) != 1100)아니. 필요한 구성 요소가 없기 때문에 이동 시스템이이 엔티티를 신경 쓰지 않는 것 같습니다.

우리의 그림 시스템에 대해 : ((1010 & 1010) == 1010)이봐, 일치합니다. 이 엔터티는 도면 시스템에서 작동합니다. 드로잉 시스템은 정의 된 위치에 스프라이트를 그립니다.


바라건대 구성 요소를 가져 와서 작동하는 다른 시스템을 추가하는 것이 얼마나 쉬운 지 알 수 있기를 바랍니다. 귀하의 질문에 답변 해 드리겠습니다.

여러 시스템이 동일한 구성 요소에 액세스해야하는 경우 어떻게합니까? 데이터는 어디에 살아야합니까?

일반적으로 시스템은 차례로 작동합니다. 요구 사항과 일치하는 모든 엔터티를 처리 한 후 다음 시스템도 동일하게 수행합니다. 데이터는 개체와 함께 존재합니다. 시스템에 아무것도 저장되어서는 안되며, 단지 잠금이되는 열쇠입니다. 열쇠는 정보가 머무르고 자물쇠에서 자물쇠로 이동하는 곳입니다.

엔터티는 어떻게 구성됩니까? 시스템이 본질적으로 구성 요소에 연결되어 있습니까? 새로운 구성 요소를 도입하려면 새로운 시스템을 도입하거나 기존 시스템을 수정해야합니까?

엔터티는 단지 구성 요소의 가방입니다. 그들은 고유 한 ID와 구성 요소 목록을 가지고 있습니다. 시스템은 위에서 설명한 방식으로 구성 요소에만 연결됩니다. 시스템이 작동하지 않는 구성 요소를 가질 수 있지만 이는 의미가 없습니다. 마찬가지로 엔터티가없는 구성 요소를 찾고있는 시스템을 가질 수 있습니다. 잠금과 일치하는 엔티티가 작성되기를 기다리는 중일 수 있으므로 의미가 없습니다. 예, 새 구성 요소를 도입하면 해당 구성 요소를 활용하는 시스템을 만들고 싶을 것입니다. 그렇지 않으면 존재하지 않는 자물쇠를 위해 키에 치아를 추가하는 것입니다.

내 엔터티가 ID 인 경우 로봇 엔터티를 일부 시스템에서 이동하거나 렌더링하여 수정해야한다는 것을 어떻게 알 수 있습니까?

long엔터티에 포함 된 구성 요소를 정의 하는 키를 사용하여 이것에 대답한다고 생각 합니다. 열쇠가 자물쇠에 맞기 때문에 알 것입니다.

휴! 긴 글이었습니다! (또는 적어도 내 대형 모니터에서는 그렇게 보입니다.)


23
이 핵심 비유는 이제 전체 아이디어를 이해하는 데 실제로 도움이됩니다. 훌륭한 아이디어! 롤 마지막 단락 :)에서
bio595

16
+1 내가 본 엔터티 구성 요소 시스템에 대한 최고의 설명을 위해. :영형!
knight666

7
나에게서 -1-이것은 나쁜 접근 방식이 아니라 접근 방식으로 묘사되어 있기 때문입니다. 그러나 컴포넌트와 서비스가 분리되어 있지 않은 시스템이 많이 있으며 (예 : Unity) 시스템이 처리 할 엔티티를 알 수있는 간단한 방법이 있습니다 (엔티티가 생성 될 때 추가).
Kylotan

37
나는 "말을 할 @Kylotan 이러한 시스템이 처리 할 엔티티 인식하지만 한 가지 방법이를 사용하는 방법을 설정하는 여러 가지 방법이 있습니다 long. "또한, 나는 보통 호버 텍스트로 (유용하지 않은 답변을 아래로 투표를 예약 말한다). 그들이 다루고있는 주제의 100 %를 다루지 않는 모든 답변에 대해 투표를한다면 많은 시간을 할애한다고 생각합니다.
MichaelHouse

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.