Як можна зберігати глобальні контекстні дані в компонентній системі сутності?


10

Моє запитання таке:

Як можна зберігати глобальні дані контексту, тобто. інформація про світові дані, поточний світовий час тощо в системі компонентів сутності?

Я думаю, що я працюю над тим, щоб створити світову імітаційну гру в стилі «Карлик-фортеця» в C ++. Я створив двигун ігрового двигуна для стильових компонентів просто для розваги, і зараз я намагаюся зрозуміти, як я буду працювати у всіх необхідних функціях. На додаток до стандартної гри в ігри (візуалізація, фізика, дані, що стосуються конкретних компонентів, тощо), я також хотів би мати деякі глобальні контекстуальні дані, до яких мали би доступ усі відповідні системи (тобто, світові дані, наприклад, на який рік це зараз , чи відбувається глобальне потепління, будь-які речі, які мали би відношення до моделювання світу). Я спочатку думав про створення "світового" компонента, але це здається безглуздим і складним, якщо багато різних систем потребують доступу до цих логічно "глобальних" даних.

Чи має сенс мати "світовий" компонент або я повинен зберігати ці дані іншим чином?

Я також думав би просто зробити ці дані глобальними, таким чином надавши доступ до будь-яких систем, які хотіли б їх використовувати; це здається порушенням принципів суб'єктних компонентів в цілому, і може бути безладним з інших причин, але я подумав, що це може справді спрацювати.

Інше, про що я думав, - це фактично вбудовувати відповідні дані світового контексту безпосередньо в самі системи. Наприклад, якби у мене були AgeSystem"постарілі" всі сутності, у яких є getsWeakerAsTimePassesкомпонент чи що-небудь ще, можливо, ця система могла б безпосередньо зберігати відповідні дані часу для світу як дані членів, які він використовував би для обчислення проходження часу і скільки вік і слабшають люди і т. д. Цей третій варіант був мені найменш улюбленим, але щось, що траплялося мені в мозковому штурмі.

Хтось може порадити?


3
Обґрунтування загальнодоступних запитів є ввічливим та корисним не тільки для ОП, але й інших користувачів.
MichaelHouse

2
Ви побудували молоток і тепер все схоже на цвях. Я даю вам дозвіл використовувати більше, ніж просто ECS для зберігання та маніпулювання даними у вашій програмі, оскільки не все є цвяхом.
Патрік Х'юз

Відповіді:


10

Будь-який спосіб, який працює - це спосіб, який працює. Це звучить чудо, але насправді ваша гра на 1000 разів важливіша, ніж ваша архітектура. Виберіть будь-який підхід, який вам подобається, і знайти його у використанні.

Ті, що я бачив у реальних іграх із доставкою (використовуючи дизайн на основі компонентів, а не спеціально ECS; я ніколи не бачив чисті ECS "у дикій природі", хоча багато компонентів мають елементи, схожі на ECS):

  • Однотонні
  • Об'єкти "контексту" передані компонентам / системам, які містять посилання на всі відповідні інші системи
  • Заводи компонентів, які передають системні ручки окремим компонентам
  • Компоненти, що зберігають посилання на системи в корені ієрархії об'єктів (лише в деяких іграх Undball Unity)
  • Сингулярні об'єкти "Двигун" передаються системам або компоненту, які містять посилання на всі інші системи
  • Системи пошуку ресурсів на основі рядків (дозволяють в C ++ робити щось на кшталт handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics"), так, дійсно)
  • Купи глобальних даних та вільних функцій у стилі С, що працюють на них
  • Пробіли / підпростори та супровідні відео

Всі вони працюють. У мене лежать деякі підходи та очевидний фаворит, але всі вони використовувались для доставки ігор AAA. Іноді декілька підходів в одному проекті (40-100 + інженерні команди, як правило, створюють випадковий дублікат коду, на жаль).


2
Мені цікаво дізнатися, який твій очевидний фаворит.
ashes999

Я надав посилання на мої слайди та відео, на якому я розмовляю на цю тему, якщо це є натяком. :)
Шон Міддлічч

Так, то ваші улюблені - це пробіли / підпростори . :)
ashes999

Чудова відповідь. Я думаю, що я щось розробив, і я фактично пішов наперед і включив концепцію "пробіли / підпростори" у свій ігровий план.
Awesomania
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.