Tag

Тег - аналогичен компоненту, но не содержит никаких данных, служит для маркировки сущности

  • Оптимизированное хранилище, не хранит массивы данных, не замедляет поиск по компонентам, позволяет создавать множество тегов
  • Представлен в виде пользовательской структуры без данных с маркер интерфейсом ITag

Пример:

public struct Unit : ITag { }

Требуется регистрация в мире между созданием и инициализацией

World.Create(WorldConfig.Default());
//...
World.RegisterTagType<Unit>();
//...
World.Initialize();

Создание:

// Добавление тега на сущность (методы перегрузки от 1-5 тегов) (Вернет true если тег отсутствовал и был добавлен)
bool added = entity.SetTag<Unit>();
entity.SetTag<Unit, Player>();

Основные операции:

// Получить количество тегов на сущности
int tagsCount = entity.TagsCount();

// Проверить наличие ВСЕХ тегов (методы перегрузки от 1-3 тегов)
entity.HasAllOfTags<Unit>();
entity.HasAllOfTags<Unit, Player>();

// Проверить наличие хотя бы одного тега (методы перегрузки от 2-3 тегов)
entity.HasAnyOfTags<Unit, Player>();

// Удалить тег у сущности (Вернет true если тег присутствовал и был удален)
// Можно безопасно использовать даже если тега не было
bool deleted = entity.DeleteTag<Unit>();
entity.DeleteTag<Unit, Player>();

// Если тега нет на сущности то он добавляется, если есть то удаляется (методы перегрузки от 1-3 тегов)
// (Вернет текущее состояние, true если тег был добавлен, false если тег был удален)
bool state = entity.ToggleTag<Unit>();
entity.ToggleTag<Unit, Player>();

// В зависимости от переданого значения или устанавливается тег (true) или удаляется (false) (методы перегрузки от 1-3 тегов)
entity.ApplyTag<Unit>(true);
entity.ApplyTag<Unit, Player>(false, true);