У меня вопрос такой:
Как хранить глобальные контекстные данные, т.е. информация о мировых данных, текущее мировое время и т. д. в системе компонентов объекта?
Я думаю о работе над созданием игры-симулятора с открытым концом в стиле Dwarf Fortress на C ++. Я создал игровой движок в стиле компонентов сущностей просто для удовольствия, и в настоящее время я пытаюсь понять, как я собираюсь работать со всеми функциями, которые я хочу. В дополнение к стандартному игровому процессу (рендеринг, физика, данные о компонентах и т. Д.) Мне также хотелось бы иметь некоторые глобальные контекстные данные, к которым будут иметь доступ все соответствующие системы (т. Е. Мировые данные, например, какой это год в настоящее время происходит ли глобальное потепление, любая вещь, которая будет иметь отношение к моделированию мира). Первоначально я думал о создании «мирового» компонента, но это кажется бессмысленным и трудным, если множество различных систем нуждаются в доступе к этим логически «глобальным» данным.
Имеет ли смысл иметь «мировой» компонент или я должен хранить эти данные другим способом?
Я также подумал о том, чтобы просто сделать эти данные глобальными, предоставив им доступ к любым системам, которые захотят их использовать; это кажется нарушением принципов сущности-компонента в целом и может быть грязным по другим причинам, но я подумал, что это может действительно сработать.
Еще одна вещь, о которой я подумал, - это встроить соответствующие данные мирового контекста непосредственно в сами системы. Например, если бы у меня были AgeSystem
«состарившиеся» все сущности, у которых есть getsWeakerAsTimePasses
компонент или еще много чего, тогда, возможно, эта система могла бы хранить соответствующие данные времени для мира непосредственно в виде данных членов, которые она использовала бы для расчета времени и сколько возраст и ослабление людей и т. д. Этот третий вариант был моим наименее любимым, но кое-что, что произошло со мной в мозговом штурме.
Кто-нибудь может посоветовать?
источник
Ответы:
Любой способ, который работает, - это способ, который работает. Это звучит глупо, но на самом деле ваша игра в 1000 раз важнее вашей архитектуры. Выберите любой подход, который вам нравится, и найдите простой в использовании.
Те, которые я видел в реальных играх доставки (использующих дизайн на основе компонентов, а не специально ECS; я никогда не видел чистого ECS «в дикой природе», хотя многие конструкции компонентов имеют элементы, подобные ECS), включают:
handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics")
, да, действительно)Они все работают. У меня есть претензии к некоторым подходам и очевидному фавориту, но все они использовались для доставки игр ААА. Иногда несколько подходов в одном проекте (увы, более 40-100 инженерных команд, как правило, создают случайный дублирующий код).
источник