При проектировании системы компонент-сущность для моего движка я столкнулся с небольшим затруднением при хранении и извлечении компонента определенного типа.
Во-первых, позвольте мне прояснить немного терминологии, которую я собираюсь использовать в этом вопросе:
- Я называю « Компонент » структурой данных, которая хранит соответствующие данные для конкретной системы.
- Я называю « Системой » совокупность методов и структур данных, которая использует Компоненты для обновления состояния игры / интерфейса с пользователем.
- « Сущность » - это, в основном, просто идентификатор, используемый для извлечения определенных компонентов и изменения их данных в игровой логике.
Каждая система владеет (ID-сопоставленным) массивом своего типа Компонента (например, Physics-> PhysicsComponent, AI-> AIComponent, Rendering-> RenderingComponent), чтобы она могла эффективно выполнять итерации по данным.
Однако не все компоненты являются собственностью системы. Например, компонент Transform хранит положение объекта, вращение и масштаб. Это одна из самых важных частей сущности (даже Unity делает ее обязательной), поскольку она используется многими системами, например, физикой, искусственным интеллектом, рендерингом и т. Д.
Это в значительной степени проблема, с которой я сталкиваюсь. Поскольку Transform используется во многих других системах, как мне найти одну из них для каждого компонента? Одно возможное решение, которое я вижу, - заставить каждый компонент хранить свой собственный идентификатор объекта. Было бы легко получить любой компонент, подобный этому, но он не был бы настолько эффективным, и это также противоречило бы концепции Компонента как изолированного и независимого пакета данных, который не знает ни о каком другом.
Есть ли правильный способ решить эту проблему? Должен ли Transform быть даже компонентом?