Все типы компонентов добавляются в сущность заранее. Если для конкретного типа компонента не указано иное.
##### VisualComponent
<br>
Названия, что были кандидатами:
ViewComponent (истасканное слово)
VisualComponent (Сливается с View. Однако выбрал его, ни в коем случае, нельзя слово
View теперь использовать в качестве названия компонента, иначе будет ужас.)
RendererComponent
RenderComponent
GraphicComponent
DisplayComponent
<br>
##### MarkerComponent
Позволяет отмечать сущность, чтобы его легко можно было найти.
Нюанс:
Маркером можно отмечать только один вид сущности?? Например, сущность бульдозера??
##### BridgeComponent
адаптер для Unity-компонента.
Устарел.
##### DataComponent
Хранит статические данные о сущности.
##### DynamicComponent (можно сократить до DynC при создании компонента с данным родителем?)
Хранит непостоянные (динамические) данные о сущности, которые могут меняться с течением времени. Например, Position и Rotation.
Какие еще названия предлагал GPT4:
- StateComponent
- VariableComponent
- ChangeableComponent
##### TempComponent
Помимо того, что он хранит непостоянные данные, так и еще сам компонент является непостоянным.
Например:
Карта состоит из ячеек. Каждая клетка на карте - это сущность. Если на клетки добавляется здание, то на сущности добавляются tempComponent, который хранит себе ссылку на здание. Нет смысла для всех пустых клеток добавлять компонент с пустым переменным, проще создавать компонент, когда здание есть и удалять компонент, когда здание удаляют.
##### OrderComponent
Приказывает системе выполнить некоторую логику над сущностью, к которой добавлен сам компонент.
Компонент должен добавляться только к той сущности, над которой планируется манипулирование системой.
Задача может быть как однокадровой, так и продолжительной.
Не может быть несколько приказов одного типа в один момент времени. Например, нельзя дать две команды на перемещение сущности.
Примеры приказов:
- Приказать системе построить маршрут.
- Приказать системе, чтобы Сущность-транспорт поехала до точки назначения.
- Приказать системе Атаковать врага.
##### RequestComponent
Компонент создается только в момент, когда необходимо создать запрос.
**Update.** Теперь данный компонент устарел.
Его судьба будет решаться по ходу разработки.
Не предназначен для передачи по сети.
Не поддерживает Wrapped типы.
Не поддерживается кодогенератором.
Вместо него можно использовать следующий подход:
Когда нужно обработать массовые запросы в рамках одного кадра, мы создаем OrderComponent и в нем будет коллекция, которая будет в рамках фрейма копить запросы.
Если в массовых запросах нужно передать более одного поля, то либо использовать кортеж, либо создавать уже в качестве запроса полноценную сущность с необходимыми данными в виде компонентов. И далее, либо передавать id сущности в orderComponent или же ловить эти сущности с помощью foreach в системе.
Позволяет отправить запрос на изменение данных в некую систему.
В отличии от OrderComponent, не добавляется к конкретной сущности и тем самым можно генерировать однотипных RequestComponent сколько угодно.
Создание нескольких запросов на редактирование одних и тех же данных возможно, к примеру, когда врага атакуют несколько юнитов. Соответственно, возможны одновременные попадания. А при попадании создаются запросы на изменение количества жизни у врага.
##### EventComponent
Компонент добавляется к сущности только в момент необходимости отправить эвент.
Любая система может генерировать эвенты, если происходят какие-то события.
Является однокадровым. Удаляет та система, которая создала эвент.
Вставляется в метод «update» системы до foreach
```csharp
ComponentManager.RemoveAllEventsIfExist<HealthLevelChangedEventC>();
```
Когда нужно сгенерировать в той же системе эвент
```csharp
_victim.AddC(EntityFactory.PoolCManager.Get<HealthLevelChangedEventC>());
```
<br>
##### SubscribeComponent (Удален)
Позволяет подписаться на изменение данных в компонентах BridgeComponent или DataComponent
Данный компонент добавляется на сущность, у которой следим за нужными данными.
<br>
Данный компонент удаляется автоматически если:
- Х секунд никто из систем не проверил «на изменение» данные.
- Компонент, за которым идет слежка, был удален.
Например:
PositionSubscribeC добавляем на транспорт-сущность. Как только транспорт-сущность начнет движение, то на эту сущность будет добавлен компонент RotationChangedEventC на один кадр