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);