EntityGID
Глобальный идентификатор сущности - является стабильным идентификатором сущности
Используется для отправки событий, связей между сущностями, сериализации, передачи по сети, и тд.
Назначается автоматически или вручную при создании сущности.
- Представлена в виде структуры размером 4 байт
Создание:
// Возможно получить у активной сущности
EntityGID gid = entity.Gid();
Основные операции:
EntityGID gid = entity.Gid();
uint id = gid.Id(); // Идентификатор
byte version = gid.Version(); // Версия
bool registered = gid.IsRegistered<WT>(); // Проверить зарегистрирован ли данный идентификатор в хранилище (сущность может быть не загружена)
bool loaded = gid.IsLoaded<WT>(); // Проверить загружена ли сущность с таким идентификатором
bool status = gid.TryUnpack<WT>(out var unpackedEntity); // Попытаться получить активную сущность
var unpacked = gid.Unpack<WT>(); // Получить активную сущность небезопасно
World.Entity.New(someGid); // Сущность может быть создана с кастомным идентификатором
EntityGID gid2 = entity.Pack();
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);