Мы получаем вариации по этому вопросу три или четыре раза в неделю на GameDev.net (где игровой объект обычно называют «сущностью»), и до сих пор нет единого мнения о лучшем подходе.Однако было показано, что несколько различных подходов работоспособны, поэтому я бы не стал слишком сильно беспокоиться об этом.
Однако обычно проблемы касаются взаимодействия между компонентами.Редко люди беспокоятся о получении информации от компонента к объекту - если объект знает, какая информация ему нужна, то, вероятно, он точно знает, к какому типу компонента он должен получить доступ и какое свойство или метод необходимо вызвать для этого компонента, чтобы получитьданные.если вам нужно быть реактивным, а не активным, зарегистрируйте обратные вызовы или настройте шаблон наблюдателя с компонентами, чтобы сообщить сущности, когда что-то в компоненте изменилось, и прочитать значение в этой точке.
Полностью общие компоненты в значительной степени бесполезны: они должны предоставлять какой-то известный интерфейс, иначе нет смысла их существовать.В противном случае вы можете просто иметь большой ассоциативный массив нетипизированных значений и покончить с этим.В Java, Python, C # и других языках более высокого уровня, чем C ++, вы можете использовать отражение, чтобы дать вам более общий способ использования определенных подклассов без необходимости кодировать информацию о типе и интерфейсе в самих компонентах.
Что касается связи:
Некоторые люди предполагают, что сущность всегда будет содержать известный набор типов компонентов (где каждый экземпляр является одним из нескольких возможных подклассов) и поэтому может просто получить прямую ссылку на другойкомпонент и чтение / запись через его открытый интерфейс.
Некоторые люди используют публикацию / подписку, сигналы / слоты и т. д. для создания произвольных соединений между компонентами.Это кажется немного более гибким, но в конечном итоге вам все еще нужно что-то со знанием этих неявных зависимостей.(И если это известно во время компиляции, почему бы просто не использовать предыдущий подход?)
Или же вы можете поместить все общие данные в сам объект и использовать их в качестве общей области связи (незначительно связанной с система доски в AI), которую каждый из компонентов может читать и записывать.Это обычно требует некоторой устойчивости перед лицом определенных свойств, которые не существуют, когда вы ожидаете их.Это также не поддается параллелизму, хотя я сомневаюсь, что это большая проблема для небольшой встроенной системы ...?
Наконец, у некоторых людей есть системы, в которых сущность вообще не существует.Компоненты живут в своих подсистемах, и единственным понятием сущности является значение идентификатора в некоторых компонентах - если компонент Rendering (в системе Rendering) и компонент Player (в системе Players) имеют одинаковый идентификатор, то можно предположить, чтопервый обрабатывает рисунок последнего.Но нет ни одного объекта, объединяющего эти компоненты.