Я створюю компонентну систему ігрових об'єктів . Деякі поради:
GameObject
це просто списокComponents
.- Є
GameSubsystems
. Наприклад, візуалізація, фізика тощо. КоженGameSubsystem
містить вказівники на деякі зComponents
.GameSubsystem
це дуже потужна і гнучка абстракція: вона представляє будь-який фрагмент (або аспект) ігрового світу.
Існує потреба в механізмі реєстрації Components
в GameSubsystems
(коли GameObject
створюється і складається). Існує 4 підходи :
- 1: Схема ланцюжка відповідальності . Кожному
Component
пропонується коженGameSubsystem
.GameSubsystem
приймає рішення, якіComponents
реєструвати (і як їх організувати). Наприклад, GameSubsystemRender може реєструвати передавальні компоненти.
профі. Components
нічого не знаю про те, як вони використовуються. Низька муфта. A. Ми можемо додати нове GameSubsystem
. Наприклад, додамо GameSubsystemTitles, який реєструє всі ComponentTitle і гарантує, що кожен заголовок є унікальним і забезпечує інтерфейс до запитуючих об'єктів за заголовком. Звичайно, ComponentTitle в цьому випадку не слід переписувати чи успадковувати. В. Ми можемо реорганізувати існуючі 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 (Компонент *).
профі. Components
і GameSubystems
нічого не знають один про одного.
кон. У C ++ це виглядало б як потворне і повільне типу-перемикача.
Запитання:
Який підхід краще і в основному застосовується в компонентному дизайні? Що говорить практика? Будь-які пропозиції щодо впровадження Approach 4
?
Дякую.
Components
в GameObjects
виходить за рамки мого питання. Читайте статті про компонентний підхід або задайте собі запитання на цьому веб-сайті, якщо вас це цікавить. Те, про що ви думаєте GameSubsystem
, абсолютно неправильно.