EntityGID

Глобальный идентификатор сущности - является стабильным идентификатором сущности
Используется для отправки событий, связей между сущностями, сериализации, передачи по сети, и тд.
Назначается автоматически или вручную при создании сущности.

  • Представлена в виде структуры размером 8 байт

Создание:

// Возможно получить у активной сущности
EntityGID gid = entity.Gid();

// Или через конструктор
EntityGID gid2 = new EntityGID(id: 0, version: 1, clusterId: 0);
EntityGID gid3 = new EntityGID(rawValue: 16777216UL);

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

EntityGID gid = entity.Gid();

uint id = gid.Id;                                             // Идентификатор сущности
ushort version = gid.Version;                                 // Версия сущности
ushort clusterId = gid.ClusterId;                             // Кластер сущности
uint chunk = gid.Chunk;                                       // Чанк сущности
uint rawValue = gid.Raw;                                      // Сырое значение (id + version + clusterId)

bool actual = gid.IsActual<WT>();                             // Проверить актуальна ли сущность (сущность может быть не загружена)
bool loaded = gid.IsLoaded<WT>();                             // Проверить загружена ли сущность
bool loadedAndActual = gid.IsLoadedAndActual<WT>();           // Проверить загружена и актуальна ли сущность
bool status = gid.TryUnpack<WT>(out var unpackedEntity);      // Попытаться получить активную сущность
var unpacked = gid.Unpack<WT>();                              // Получить активную сущность небезопасно (будет ошибка в DEBUG если сущность не загружена или неактуальна)

W.Entity.New(someGid);                                        // Сущность может быть создана с кастомным идентификатором

EntityGID gid2 = entity.Gid();
bool equals = gid.Equals(gid2);                               // Проверить идентичность идентификаторов

Способы применения:

События:
public struct DamageEvent : IEvent { 
    public EntityGID Target;
    public float Damage;
}

// В системе:
foreach (var damageEvent in damageEventReceiver) {
    var val = weatherEvent.Value;
    if (val.Target.TryUnpack<WT>(out var entity)) {
        entity.Ref<Health>.Value -= val.Damage;
        //...
    }
}
Сетевое взаимодействие сервер-клиент:

Можно использовать GID как идентификатор связи сущности на клиенте и сервере,
например если сервер контролирует создание сущностей и передает на клиент GID,
то клиент может использовать данный идентификатор при создании сущности
Таким образом дальнейшее взаимодействие или команды с сервера могут содержать GID, и клиент сможет легко получить сущность через Unpack

public struct SomeCreateEntityClientCommand { 
    public EntityGID Id;
    public string prefab;
}
// Cервер
//.. 
var serverEntityPlayer;
client.SendMessage(new SomeCreateEntityClientCommand(serverEntityPlayer.Gid(), "player"))

// Клиент:
var someCreateEntityClientCommand = server.ReceiveMessage();
var gidFromServer = someCreateEntityClientCommand.Id;
var entity = ClientWorld.Entity.New(gidFromServer);

EntityGIDCompact

Аналогично EntityGID но размер в два раза меньше, и может использоваться в мирах до 16 000 сущностей и до 4 кластеров (будет ошибка в DEBUG если выйти за границы)

  • Представлена в виде структуры размером 4 байт

Создание:

// Возможно получить у активной сущности
EntityGIDCompact gid = entity.GidCompact();

// Или через конструктор
EntityGIDCompact gid2 = new EntityGIDCompact(id: 0, version: 1, clusterId: 0);
EntityGIDCompact gid3 = new EntityGIDCompact(rawValue: 16777216U);