WorldType

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

  • Представлен в виде пользовательской структуры без данных с маркер интерфейсом IWorldType

Пример:

public struct MainWorldType : IWorldType { }
public struct MiniGameWorldType : IWorldType { }

World

Точка входа в библиотеку, отвечающая за доступ, создание, инициализацию, работу и уничтожение данных мира

  • Представлен в виде статического класса Ecs<T> параметризованного IWorldType

Так как тип- идентификатор IWorldType определяет доступ к конкретному миру
Есть три способа работы с библиотекой:


Первый способ - как есть через полное обращение (очень неудобно):

public struct WT : IWorldType { }

Ecs<WT>.Create(WorldConfig.Default());
Ecs<WT>.World.EntitiesCount();

var entity = Ecs<WT>.Entity.New<Position>();

Второй способ - чуть более удобный, использовать статические импорты или статические алиасы (придется писать в каждом файле)

using static FFS.Libraries.StaticEcs.World<WT>;

public struct WT : IWorldType { }

Create(WorldConfig.Default());
EntitiesCount();

var entity = Entity.New<Position>();

Трейтий способ - самый удобный, использовать типы-алиасы в корневом неймспейсе (не требуется писать в каждом файле)

Везде в примерах будет использован именно этот способ

public struct WT : IWorldType { }

public abstract class World : World<WT> { }

World.Create(WorldConfig.Default());
World.EntitiesCount();

var entity = World.Entity.New<Position>();

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

// Определяем ID мира
public struct WT : IWorldType { }

// Регестрируем типы - алиасы
public abstract class World : World<WT> { }

// Создание мира с дефолтной конфигурацие
World.Create(WorldConfig.Default());
// Или кастомной
World.Create(new() {
            BaseEntitiesCount = 256,        // Базовый размер массива сущностей при создания мира
            BaseDeletedEntitiesCount = 256, // Базовый размер массива удаленных сущностей при создания мира
            BaseComponentTypesCount = 64    // Базовый размер всех разновидностей типов компонентов (количество пулов под каждый тип)
            BaseMaskTypesCount = 64,        // Базовый размер всех разновидностей типов масок (количество пулов под каждый тип)
            BaseTagTypesCount = 64,         // Базовый размер всех разновидностей типов тегов (количество пулов под каждый тип)
            BaseComponentPoolCount = 128,   // Базовый размер массива данных компонентов определнного типа (может быть переопределнно для конкретного типа при явной регистрации)
            BaseTagPoolCount = 128,         // Базовый размер массива тегов определнного типа (может быть переопределнно для конкретного типа при явной регистрации)
        });

World.Entity.    // Доступ к сущности для MainWorldType (ID мира)
World.Context.   // Доступ к контексту для MainWorldType (ID мира)
World.Components.// Доступ к компонентам для MainWorldType (ID мира)
World.Tags.      // Доступ к тегам для MainWorldType (ID мира)
World.Masks.     // Доступ к маскам для MainWorldType (ID мира)

// Инициализация мира
World.Initialize();

// Уничтожение и очистка данных мира
World.Destroy();

// При регистрации компонента возможно указать базовой размер массива даных компонентов этого типа
MyWorld.RegisterComponentType<Position>(256);

// аналогично RegisterComponentType, но для тегов
var unitTagId = MyWorld.RegisterTagType<Unit>(256);

// аналогично RegisterComponentType, но для масок
var visibleMaskId = MyWorld.RegisterMaskType<Visible>();

// true если мир инициализирован
bool initialized = MyWorld.IsInitialized();

// количество активных сущностей в мире
int entitiesCount = MyWorld.EntitiesCount();

// текущая емкость массива для сущностей
int entitiesCapacity = MyWorld.EntitiesCapacity();