CyberGrad 2033 Архитектура: Ecs
Предыдущий пост: CyberGrad 2033
На старте энтити пробегается по своим чилдам и если они являются компонентами, добавляет в словарь.
Компоненты не содержат логики (хотя никто не запретит), толко данные и могут содержать ссылки на другие ноды
У систем есть несколько коллбэков, которые имплементируются интерфесами
IInitSystem — вызовется один раз при старте игры
IDestroySystem — вызовется один раз при завершении
IEntitiesAdded — вызывается когда появляется новый энтити, подходящий под фильтр системы (только один раз)
IEntitiesUpdate — вызывается каждый кадр и содержит всех энтитей подходящих под фильтр
IEntitiesPhysicsUpdate — то же самое но каждый апдейт физики
IComponentsRemoved — вызывается когда энтити больше не подходит под фильтр
Сервисы умеют в следующие интерфейсы:
IInit — на старте игры один раз
IUpdate — каждый кадр
Читать дальше
Сразу оговорюсь, данная реализация лишь внешне выглядит как Ecs, под капотом это скорее всего что-то совершенно другое, т.к я не в курсе как выглядят настоящие Ecs
Так же тут нет никакой претензии на производительность, главными приоритетами были удобство, простота и нативная интеграция с движком.
Основные сущности, на которых все держиться: Энтити, компоненты, системы и сервисы.
Entity
Это класс, наследник Node, в нем я реализовал методы добавления/удаления компонентов.На старте энтити пробегается по своим чилдам и если они являются компонентами, добавляет в словарь.
Components
Это тоже наследник Node, потому что я хочу иметь возможность добавлять компоненты через редакторКомпоненты не содержат логики (хотя никто не запретит), толко данные и могут содержать ссылки на другие ноды
Systems
Тут происходит вся логика с энтитями, но только с теми, которые попадают под фильтр этой системы.У систем есть несколько коллбэков, которые имплементируются интерфесами
IInitSystem — вызовется один раз при старте игры
IDestroySystem — вызовется один раз при завершении
IEntitiesAdded — вызывается когда появляется новый энтити, подходящий под фильтр системы (только один раз)
IEntitiesUpdate — вызывается каждый кадр и содержит всех энтитей подходящих под фильтр
IEntitiesPhysicsUpdate — то же самое но каждый апдейт физики
IComponentsRemoved — вызывается когда энтити больше не подходит под фильтр
Services
Немного походяд на системы, но если система работает с энтитями, то сервисы это просто утилитарные классы, которые могут делать что угодно. К примеру AudioService — который воспроизводит звуки в игре.Сервисы умеют в следующие интерфейсы:
IInit — на старте игры один раз
IUpdate — каждый кадр