Actor-> SetReplicates (false) неправильно отключает репликацию (или то, что я понимаю из нее) 04-10-2020, 01:51 AM Контекст: я работаю над многопользовательской игрой с выделенным сервером.
У меня есть класс Entity, который наследуется от Pawn, порожденного сервером. Он настроен для репликации на конструкторе с
AEntity::AEntity()
{
bReplicates = true;
SetReplicatingMovement(true);
bAlwaysRelevant = true;
}
Репликация работает хорошо. Теперь, когда я собираюсь уничтожить созданную сущность, я хочу прекратить репликацию ДО ее уничтожения. Это позволяет клиентам выполнять собственную очистку с действительным указателем на сущность в течение всего процесса. В противном случае сущность будет уничтожена на полпути после очистки клиента. Вот как я пытался добиться этого:
bool AEntityManager::RemoveEntity(AEntity* Entity)
{
[...]
// We stop replication before destroying so that Clients don't operate on a Dead Actor for cleanup. ClientEntityManager destroys it when appropriate
Entity->SetReplicates(false);
FTimerHandle DestroyEntityTimerHandle;
FTimerDelegate DestroyEntityTimerDelegate = FTimerDelegate::CreateUObject(this, &AEntityManager::DestroyEntity, Entity);
GetWorldTimerManager().SetTimer(DestroyEntityTimerHandle, DestroyEntityTimerDelegate, 1.f, false);
[...]
}
void AEntityManager::DestroyEntity(AEntity* Entity)
{
bool bEntityIsPendingKill = Entity->Destroy();
}
EntityManager является экземпляром только для сервера, поэтому RemoveEntity работает только на сервере. Тогда у Клиентов в настоящее время нет вызова DestroyActor (Entity) в них, поэтому версия Entity Клиента должна пережить Уничтожение, вызванное сервером. Этого НЕ происходит .
Как мне достичь чего-то подобного? Я неправильно понимаю репликацию или как работает SetReplicates? Или когда мы уничтожаем реплицируемый объект, невозможно предотвратить уничтожение версий клиента?