소개
엔터티 구성 요소 시스템은 객체 지향 아키텍처 기술입니다.
객체 지향 프로그래밍과 마찬가지로이 용어의 의미에 대한 보편적 인 합의는 없습니다. 그러나 엔터티 구성 요소 시스템은 상속에 대한 아키텍처 대안으로 특별히 의도 된 것 입니다. 상속 계층은 객체 가 무엇인지를 표현하는 데 자연 스럽지만 특정 종류의 소프트웨어 (예 : 게임)에서는 객체 가 하는 것을 표현하는 것이 좋습니다.
C ++ 또는 Java 작업에 익숙한 "클래스 및 상속"모델과 다른 객체 모델입니다. 엔터티는 JavaScript 또는 자체에서와 같이 프로토 타입과 마찬가지로 클래스만큼 표현력이 뛰어납니다. 이러한 모든 시스템은 서로의 관점에서 구현 될 수 있습니다.
예
하자 말 Player
과 실체 Position
, Velocity
그리고 KeyboardControlled
뻔한 일을 할 구성 요소.
entity Player:
Position
Velocity
KeyboardControlled
우리는 알고 Position
에 의해 영향을해야 Velocity
하고, Velocity
에 의해 KeyboardControlled
. 문제는 이러한 효과를 어떻게 모델링하고 싶은가입니다.
엔터티, 구성 요소 및 시스템
구성 요소가 서로를 참조하지 않는다고 가정하십시오. 외부 Physics
시스템은 모든 Velocity
구성 요소를 통과 Position
하고 해당 엔티티를 업데이트합니다 . Input
시스템은 모든 횡단 KeyboardControlled
구성 요소와를 업데이트합니다 Velocity
.
Player
+--------------------+
| Position | \
| | Physics
/ | Velocity | /
Input | |
\ | KeyboardControlled |
+--------------------+
이는 다음 기준을 충족시킵니다.
시스템은 이제 이벤트를 처리 하고 구성 요소가 설명하는 동작을 제정 합니다. 또한 충돌과 같은 엔터티 간 상호 작용을 처리합니다.
엔터티 및 구성 요소
그러나 구성 요소가 있다고 가정 할 서로에 대한 참조를 가지고있다. 이제 엔티티는 단순히 일부 구성 요소를 작성하고 함께 바인딩하며 수명을 관리하는 생성자입니다.
class Player:
construct():
this.p = Position()
this.v = Velocity(this.p)
this.c = KeyboardControlled(this.v)
엔티티는 이제 입력 및 업데이트 이벤트를 해당 컴포넌트로 직접 전달할 수 있습니다. Velocity
업데이트에 KeyboardControlled
응답하고 입력에 응답합니다. 이것은 여전히 우리의 기준을 충족시킵니다.
여기서 컴포넌트 상호 작용은 시스템에 의해 외부에서 부과되지 않고 명시 적입니다. 행동을 설명하는 데이터 (속도의 양은 얼마입니까?)와이를 실행하는 코드 (속도는 무엇입니까?)는 자연스럽게 결합되어 있습니다. 데이터는 동작에 대한 매개 변수로 볼 수 있습니다. 그리고 일부 구성 요소는 전혀 작동하지 않습니다 . 즉, 제자리에있는Position
동작입니다 .
상호 작용은 실체 수준 ( " … Player
과 충돌 할 때 Enemy
") 또는 개별 구성 요소 수준 ( " … Life
과 실체와 충돌 할 때 Strength
")에서 처리 될 수있다.
구성 요소
실체가 존재하는 이유는 무엇입니까? 단순한 생성자 인 경우 구성 요소 집합 을 반환하는 함수로 대체 할 수 있습니다 . 나중에 유형별로 엔터티를 쿼리하려는 경우 다음과 같이 할 수있는 Tag
구성 요소를 가질 수도 있습니다 .
function Player():
t = Tag("Player")
p = Position()
v = Velocity(p)
c = KeyboardControlled(v)
return {t, p, v, c}
상호 작용 은 이제 추상 쿼리에 의해 처리되어 엔티티 유형에서 이벤트를 완전히 분리합니다. 쿼리 할 엔티티 유형 이 더 이상 없습니다Tag
. 게임 논리보다 임의의 데이터가 디버깅에 더 적합 할 것입니다.
결론
엔터티는 함수, 규칙, 행위자 또는 데이터 흐름 결합자가 아닙니다. 그것들은 구체적인 현상을 모델로 하는 명사 , 즉 객체입니다. 엔터티 구성 요소 시스템은 일반 개체를 모델링하기위한 소프트웨어 아키텍처 패턴입니다.