UE4: Actor-> SetReplicates (false) неправильно останавливает репликацию (или то, что я понимаю из этого) - PullRequest
0 голосов
/ 10 апреля 2020

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? Или когда мы уничтожаем реплицируемый объект, невозможно предотвратить уничтожение версий клиента?

...