엔터티 또는 구성 요소의 상태 변경


9

엔티티에서 상태 관리를 처리하는 방법을 파악하는 데 문제가 있습니다.

일시 중지 및 메뉴와 같은 게임 상태 관리에는 문제가 없습니다. 엔티티 구성 요소 시스템으로 처리되지 않기 때문입니다. 엔터티 / 구성 요소의 상태와 함께.

오크 머스트 다이에서 그리기를 예로 들어, MainComponent 및 Trap 엔티티가 있으며 PositionComponent, RenderComponent, PhysicsComponent와 같은 구성 요소 만 있습니다.

각 업데이트마다 엔터티는 해당 구성 요소에 대한 업데이트를 호출합니다. 또한 다른 이벤트 유형에 대한 리스너가있는 일반 EventManager가 있습니다.

이제 트랩을 배치 할 수 있어야합니다. 먼저 트랩과 트랩 위치를 선택한 다음 트랩을 배치하십시오.

트랩을 배치 할 때 다른 방식으로 렌더링되고 따라 오는 MainCharacter 앞에 나타납니다. 배치되면 충돌에 반응하고 정상적인 방식으로 렌더링됩니다.

이것은 일반적으로 컴포넌트 기반 시스템에서 어떻게 처리됩니까?

(이 예제는 구체적이지만 엔티티 상태를 처리하는 일반적인 방법을 찾는 데 도움이 될 수 있습니다.)


1
입력 이벤트를 기반으로 엔터티의 구성 요소를 추가 및 제거 할 수 있습니까? 상태가 변경 될 때 트랩 구성 요소를 변경할 수 있습니다. 예를 들어 트랩을 배치하는 동안 FollowComponent 및 RenderEffectComponnent가 있습니다. 배치되면 두 구성 요소를 모두 제거하고 CollisionComponent를 추가합니다. (편집 : Martin Sojka가 더 명확하게 표현)
Asakeron

예, 모든 입력이 "HumanView"에서 게임 이벤트로 변환되며, 대부분의 경우 내 GameLogic 클래스에서 먼저 처리됩니다. 예를 들어 MainCharacter에 트랩을 배치하기에 충분한 돈이 있는지 확인하는 방법 그 후에 내가 알아 내려고하는 것입니다.
GriffinHeart

답변:


6

구성 요소 시스템의 흥미로운 응용 프로그램 중 하나는 엔터티 구성 요소 를 처리 할 수 ​​있도록 설계 한 경우 런타임에 엔터티의 구성 요소를 변경할 수 있다는 것 입니다. 따라서 엔터티의 상태는 어떤 구성 요소가 할당되고 어떤 값을 보유하는지의 합이됩니다.

예를 들어, 먼저 BuildControllerComponent(빌드 단계에서 플레이어 컨트롤에 반응 제어) a PositionComponent및 a를 사용하여 트랩을 만들 수 있습니다 RenderComponent. 마지막 하나는 사용 된 픽셀 쉐이더를 제어하는 ​​하나의 데이터 필드를 가지고 있으며 그 중 하나는 빌드 할 트랩에 "고스트"모양을 제공합니다. 당신이없는 알 수 없는 아직 할당 물리 구성 요소.

트랩을 배치하면 구성품이 교환됩니다. 는 BuildControllerComponent더 이상 필요하지 않은, 그래서이 제거됩니다. RenderComponent의 쉐이더는 트랩의 일반 표준보기로 대체 얻을. 마지막으로 PhysicsComponent트랩이 작동하는 데 필요한 다른 항목이 엔티티에 추가됩니다.

상속 기반 접근 방식에서는 ActiveTrapEntity클래스를 BuildTimeTrapEntity인수로 사용 하는 클래스 의 생성자를 갖는 것과 동일 합니다. 두 번째 클래스는 트랩을 빌드하는 동안 트랩을 렌더링하는 데 사용되고 첫 번째 클래스는 트랩이 배치 된 후에 트랩에 사용됩니다 .


이것은 영리합니다.
Cypher

1
이것은 엔터티의 상태 를 적용 하기 위한 좋은 전략입니다 . 각 엔터티의 상태를 추적하는 방법에 대한 문제는 다루지 않습니다. 엔티티가 현재 어떤 주에 있는지 어떻게 알 수 있습니까?
MichaelHouse

@MartinSojka 이것은 질문을 한 후에 내가 생각했던 것에 가깝습니다. 트랩을 빌드하는 데 필요한 상태 변경을 달성하기 위해 구성 요소 변경의 런타임 측면을 관리하는 BuildTrapProcess (GameLogic에서 업데이트되는)를 추가하는 것을 고려하고있었습니다. 트랩을 만들기위한 버튼을 누르면 게임 로직이 프로세스를 생성하고 시작합니다. 이 접근법에 대한 의견이 있으십니까?
GriffinHeart

@ Byte56 : 일반적으로 관련 구성 요소 및 해당 값을 쿼리 할 수 ​​있습니다. 실제로는 종종 전체 주체의 관련 부분 집합 만 알아야합니다 (예 : "이 엔티티가 BuildControllerComponent있습니까?"). 또는 "있는 경우이 엔터티의 위치는 무엇입니까 PositionComponent?" -관심이있는 구성 요소 목록을 확인하고 선택적으로 해당 값을 쿼리하여 수행하는 작업.
Martin Sojka

1
@GriffinHeart : BuildControllerComponents 관리와 관련된 시스템에서 트랩을 "빌드"하는 데 필요한 모든 것을 구현하려고 합니다. 이미 플레이어 캐릭터 (또는 카메라) 관점 변경과 키 및 마우스 프레스 이벤트를 처리해야합니다.
Martin Sojka

5

구성 요소에 대한 업데이트를 호출하는 엔터티 (시스템이 작업을 수행해야 함)라는 아이디어가 마음에 들지 않아 구성 요소가 서로를 인식하지 못하는 문제가 발생합니다.

"상태"라는 추가 구성 요소를 추가 할 수 있습니다. 렌더링 및 충돌 시스템에서 액세스합니다. 상태 구성 요소는 여러 상태를 사용할 수있는 플래그 일뿐입니다. 상황의 경우에는 국가가 될 것이라고 설명 Play하고 Build. 렌더 시스템이 상태를 Build알면 반투명 오브젝트를 그립니다. 충돌 시스템이 Build상태를 확인하면 플레이어와의 충돌을 처리하지 않습니다.

그러나 실제로 시스템이없고 모든 작업을 수행하기 위해 구성 요소에 의존하는 경우 많은 문제가 발생합니다. 구성 요소는 서로에 대해 알지 않아야하며 처리하지 않아야합니다.


당신이 말하는 것은 충돌하는 것입니다. 먼저 그들이 인식하지 않아야합니다 (동의합니다). 다른 사람들이 액세스하는 구성 요소를 가져 와야합니다. 당신은 명확히 할 수 있습니까? 이벤트 시스템에서 구성 요소를 분리합니다.
GriffinHeart

둘 다 말하는거야 나는 그들이 인식하지 못하고 구성 요소를 처리하는 방식에 따라 내 응답을 조정하려고한다고 말하고 있습니다. "엔터티가 해당 구성 요소에 대한 업데이트를 호출합니다"라고 말하면 시스템 처리 엔터티가없는 것입니다. 혼란스러운 언어를 제거하고 방금 시스템이라고 말합니다. 나는 그것이 당신이 업데이트하는 방법이라는 것을 이해했기 때문에 구성 요소를 말하고있었습니다.
MichaelHouse

StateComponent여러 시스템에서 사용할 수 있다는 아이디어가 마음에 듭니다 .
Cypher

1
다운 보트에 대한 추론을 제공하는 것이 예의입니다. 감사.
MichaelHouse

2
다른 말로, asker의 접근 방식에 대한 이의 제기는 모든 구성 요소 기반 설계가 개별 시스템 (예 : 엔터티 시스템 설계)에서 구성 요소를 업데이트해야한다는 가정에 기반합니다. 그것은 그것을하는 한 가지 방법이지만 확실히 유일한 방법은 아니며 캐시 최적화 구성 요소 업데이트 루프가 필요없는 게임에 대한 그러한 접근 방식을 설득 할 이유가 없습니다.
Sean Middleditch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.