Как можно хранить данные глобального контекста в системе компонентов объекта?

10

У меня вопрос такой:

Как хранить глобальные контекстные данные, т.е. информация о мировых данных, текущее мировое время и т. д. в системе компонентов объекта?

Я думаю о работе над созданием игры-симулятора с открытым концом в стиле Dwarf Fortress на C ++. Я создал игровой движок в стиле компонентов сущностей просто для удовольствия, и в настоящее время я пытаюсь понять, как я собираюсь работать со всеми функциями, которые я хочу. В дополнение к стандартному игровому процессу (рендеринг, физика, данные о компонентах и ​​т. Д.) Мне также хотелось бы иметь некоторые глобальные контекстные данные, к которым будут иметь доступ все соответствующие системы (т. Е. Мировые данные, например, какой это год в настоящее время происходит ли глобальное потепление, любая вещь, которая будет иметь отношение к моделированию мира). Первоначально я думал о создании «мирового» компонента, но это кажется бессмысленным и трудным, если множество различных систем нуждаются в доступе к этим логически «глобальным» данным.

Имеет ли смысл иметь «мировой» компонент или я должен хранить эти данные другим способом?

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

Еще одна вещь, о которой я подумал, - это встроить соответствующие данные мирового контекста непосредственно в сами системы. Например, если бы у меня были AgeSystem«состарившиеся» все сущности, у которых есть getsWeakerAsTimePassesкомпонент или еще много чего, тогда, возможно, эта система могла бы хранить соответствующие данные времени для мира непосредственно в виде данных членов, которые она использовала бы для расчета времени и сколько возраст и ослабление людей и т. д. Этот третий вариант был моим наименее любимым, но кое-что, что произошло со мной в мозговом штурме.

Кто-нибудь может посоветовать?

Awesomania
источник
3
Обоснование понижения голосов вежливо и полезно не только ОП, но и другим пользователям.
MichaelHouse
2
Вы построили молоток, и теперь все выглядит как гвоздь. Я даю вам разрешение использовать не только ECS для хранения и манипулирования данными в вашей программе, потому что не все является гвоздем.
Патрик Хьюз

Ответы:

10

Любой способ, который работает, - это способ, который работает. Это звучит глупо, но на самом деле ваша игра в 1000 раз важнее вашей архитектуры. Выберите любой подход, который вам нравится, и найдите простой в использовании.

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

  • Одиночки
  • «Контекстные» объекты передаются в компоненты / системы, которые содержат ссылки на все соответствующие другие системы
  • Фабрики компонентов, которые передают системные дескрипторы отдельным компонентам
  • Компоненты, которые хранят ссылки на системы в корне иерархии объектов (только в некоторых странных играх Unity)
  • Отдельные объекты «Engine», передаваемые в системы или компоненты, которые содержат ссылки на все другие системы
  • Системы поиска ресурсов на основе строк (что позволяет вам в C ++ делать что-то вроде handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics"), да, действительно)
  • Куча глобальных данных и свободные функции в стиле C, которые работают с ними
  • Пробелы / подпространства и сопутствующее видео

Они все работают. У меня есть претензии к некоторым подходам и очевидному фавориту, но все они использовались для доставки игр ААА. Иногда несколько подходов в одном проекте (увы, более 40-100 инженерных команд, как правило, создают случайный дублирующий код).

Шон Миддледич
источник
2
Мне любопытно узнать, какой твой очевидный фаворит.
ashes999
Ссылки, которые я предоставил, являются моими слайдами и видео с моим выступлением на эту тему, если есть подсказка. :)
Шон Миддледич
Ах, тогда ваш любимый - это пробелы / подпространства . :)
ashes999
Отличный ответ. Я думаю, что у меня что-то получилось, и я действительно пошел дальше и включил концепцию «пространства / подпространства» в свой план игры.
Авесомания