LeoECS Proto - иерархические связи между сущностями

Иногда бывает нужно организовывать связь сущностей в виде Родитель-Ребенок, когда при удалении Родителя все его Дети автоматически удаляются, либо еще как-то реагируют на это событие. Так же необходимо быстро узнавать Родителя у сущности и наоборот - список всех Детей. Теперь в LeoECS Proto для решения этой задачи есть готовый модуль.
Обычно реализация заключается в навешивании компонента Родитель на главную сущность и хранение в нем списка зависимых сущностей. Для связи в обратную сторону на каждую зависимую сущность вешается компонент Ребенок для хранения ссылки на сущность Родителя. Вся логика по валидации этих связей реализуется либо в виде сервиса, либо в виде системы.
Модуль Leopotam.EcsProto.Parenting реализует связывание сущностей тем же способом, но не требуя от пользователя явного управления компонентами. Скрытые компоненты Родитель и Ребенок добавляются и управляются автоматически через апи, предоставляемое в виде методов аспекта модуля, достаточно выполнить инъекцию этого аспекта в систему (или получить его из мира любым способом):
1 | using Leopotam.EcsProto.Parenting; |
Апи предоставляет следующий функционал:
- Создание связи между двумя сущностями:
1
_parenting.SetParent (childEntity, parentEntity);
- Разрывание установленной связи между сущностями:
1
_parenting.ClearParent (childEntity);
- Настройка поведения при удалении родительской сущности. По умолчанию все дочерние сущности автоматически удаляются при удалении родительской - это можно поменять, чтобы дочерние сущности сохранялись, а связи с удаленным
Родителемоставались, но не считались валидными:1
_parenting.KeepChildrenOnDead(parentEntity, true);
- Проверка наличия связи:
1
bool isChild = _parenting.IsParented (childEntity);
- Получение ссылки на активного родителя:
1
(ProtoEntity entity, bool ok) = _parenting.Parent (childEntity);
- Получение списка активных дочерних сущностей:
1
2Slice<ProtoEntity> result = new ();
_parenting.Children (parentEntity, result);