게임 서브 시스템에 게임 오브젝트 구성 요소를 등록 하시겠습니까? (컴포넌트 기반 게임 오브젝트 디자인)


11

컴포넌트 기반 게임 오브젝트 시스템을 만들고 있습니다 . 몇 가지 팁 :

  1. GameObject단순히의 목록입니다 Components.
  2. 있습니다 GameSubsystems. 예를 들어, 렌더링, 물리 등 각각 GameSubsystem에 대한 포인터가 포함되어 있습니다 Components. GameSubsystem매우 강력하고 유연한 추상화입니다. 게임 세계의 모든 조각 (또는 측면)을 나타냅니다.

등록하는 메카니즘의 필요가 Components있는 GameSubsystems(언제 GameObject만들어 구성된다). 있다 4 접근 방법 :


  • 1 : 책임 사슬 패턴. 모든 Component것이 모든 사람 에게 제공됩니다 GameSubsystem. 등록 할 항목 (및 구성 방법)을 GameSubsystem결정 Components합니다. 예를 들어 GameSubsystemRender는 렌더러 블 컴포넌트를 등록 할 수 있습니다.

찬성. Components그것들이 어떻게 사용되는지 전혀 모른다. 낮은 커플 링. A. 새로운을 추가 할 수 있습니다 GameSubsystem. 예를 들어 모든 ComponentTitle을 등록하고 모든 타이틀이 고유하고 타이틀별로 객체를 퀘스트하는 인터페이스를 제공하는 GameSubsystemTitles를 추가해 보겠습니다. 물론이 경우 ComponentTitle을 다시 쓰거나 상속해서는 안됩니다. B. 기존을 재구성 할 수 있습니다 GameSubsystems. 예를 들어 GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter를 GameSubsystemSpatial에 병합 할 수 있습니다 (모든 오디오, 이미 터를 배치 Components하고 동일한 계층 구조로 렌더링 하고 부모 기준 변환을 사용하기 위해).

범죄자. 모든 점검. 매우 비효율적입니다.

범죄자. Subsystems에 대해 알고 Components있습니다.


  • 2 : 각각 특정 유형을 Subsystem검색합니다 Components.

찬성. 보다 더 나은 성능 Approach 1.

범죄자. Subsystems아직도 알고 Components있습니다.


  • 3 :에 Component등록합니다 GameSubsystem(s). 컴파일 타임에 GameSubsystemRenderer가 있다는 것을 알고 있으므로 ComponentImageRender는 GameSubsystemRenderer :: register (ComponentRenderBase *)와 같은 것을 호출합니다.

찬성. 공연. 에서처럼 불필요한 점검이 없습니다.Approach 1 .

범죄자. Components와 (과) 잘못 연결되어 GameSubsystems있습니다.


  • 4 : 중재자 패턴. GameState(를 포함하는 GameSubsystems)는 registerComponent (Component *)를 구현할 수 있습니다.

찬성. ComponentsGameSubystems 서로에 대해 아무것도 몰라.

범죄자. C ++에서는 추악하고 느린 typeid-switch처럼 보입니다.


질문 : 컴포넌트 기반 설계에서 어떤 방법이 더 좋고 주로 사용됩니까? 어떤 연습이 말합니다? 구현에 대한 제안Approach 4 무엇입니까?

감사합니다.


나는 너무 공학적 냄새가 난다. 컴포넌트는 GameObject에 자신을 등록합니다. GameSubsystem이 내가 생각하는 것이라면, GameObject에 한 번에 추가 할 수있는 컴포넌트 목록 일뿐입니다. 게임 오브젝트와 컴포넌트가 어떻게 결합되는지 "마법"이있는 것처럼 들립니다 (서로를 찾는 이유는 무엇입니까?). 또한 기본적으로 엔진의 모든 구성 요소를 사용하려고한다고 생각합니다. 가치가있는 것은 옵션 3 또는 4 만 고려할 것입니다.
LearnCocos2D

@GamingHorror, 등록 Components하는 GameObjects것은 내 질문의 범위를 벗어납니다. 구성 요소 기반 접근 방식에 대한 기사를 읽거나 관심이있는 경우이 사이트에 대한 질문을하십시오. 당신이 생각하는 GameSubsystem것은 완전히 잘못입니다.
topright

엔진 구성 요소가 아닌 게임 로직 용 구성 요소를 개발하는 데 편향되어 있으며 설명이 그 방향을 가리키는 것으로 보입니다. 구성 요소 시스템을 매우 잘 이해하고 있습니다. 나는 사용하는 용어, 특히 GameSubsystem에 익숙하지 않기 때문에 코스에서 벗어났다고 생각합니다. 내가 읽은 바에 따르면 구성 요소로 모든 것을 (예 : 전체 엔진) 빌드하려고하는 것처럼 들렸습니다 .
LearnCocos2D

예, "컴포넌트 기반 게임 오브젝트"와 "컴포넌트 지향 프로그래밍"은 다른 용어이므로 혼동 될 수 있습니다. 편견을 가지지 말고 "안정화"하는 것이 좋습니다. scottbilas.com/files/2002/gdc_san_jose/game_objects_slides.ppt
topright

답변:


3

도어 번호 3 ... 컴포넌트가 GameSubsystem에 등록됩니다

컴포넌트는 GameObject 자체에서 커플 링을 추상화 된 상태로 유지합니다. 어쨌든, 실제로 어딘가에서 서브 시스템과 상호 작용해야하는 곳이 바로 이것이 구성 요소와 그 목적입니다.

이 경우 커플 링이 실제로 나쁜 것은 아닙니다.

기본적으로 성능이 필요 합니다시스템에 복잡성이있을 것으로 예상되는 경우이 옵션 . 다른 옵션의 검색 스타일 접근 방식 만 사용할 수는 없습니다.

마지막으로 한 서브 시스템이 다른 서브 시스템에 반응해야하는 경우 (렌더러, 물리, 오디오 모두 무언가가 발생할 때 작업을 수행해야하는 경우) 구성 요소는 게임 오브젝트를 통해 서로를 용이하게하고이 특정 유형의 교차 시스템 커플 링을 통해 구성 요소.


1
잘 됐네요 그러나 구성 요소가 GameSubsystems에 대해 어떻게 알 수 있습니까? 모든 서브 시스템이 싱글 톤입니까? 그것은 추악하지 않습니까? ... 의존성 주입과 같은 다른 솔루션에 대해 생각하고 있습니다 ...하지만 언제 누가 누가 서브 시스템 인스턴스를 각 구성 요소로 전달합니까?
Dani

@Dani Components는 서브 시스템 인스턴스에 직접 액세스 할 필요가 없으며 등록을 요청하는 메시지 만 보내면됩니다. 서브 시스템이 무엇인지 알 필요는 없습니다 (그러나 가능성이 가장 높음). 싱글 톤일까요? 대부분의 경우 각 서브 시스템마다 단일 서브 시스템 인스턴스 만 필요한 경우에도 이는 필수 사항이 아닙니다.
Pablo Ariel

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