Почему GIsServer верен для клиентов и почему GIsClient верен для выделенного сервера? - PullRequest
0 голосов
/ 12 января 2019

В UnrealEngine при использовании PlayInEditor (PIE) я получаю следующие результаты при вызове bool UWorld::IsServer() / bool UWorld::IsClient() и проверке bool GIsServer / bool GIsClient:

┌──────────────────┬────────────────────────┬───────────┬──────────────────────────────────────────┐
│     Machine      │ GetWorld()->IsServer() │ GIsServer │ GetWorld()->IsClient() returns GIsClient │
├──────────────────┼────────────────────────┼───────────┼──────────────────────────────────────────┤
│ Dedicated server │ true                   │ true      │ true                                     │
│ Listen server    │ true                   │ true      │ true                                     │
│ Client           │ false                  │ true      │ true                                     │
└──────────────────┴────────────────────────┴───────────┴──────────────────────────────────────────┘

Это приводит меня к следующим вопросам:

  1. Почему GIsServer на клиентах true?
  2. Почему GIsClient на выделенном сервере true?

Воспроизводить

Используйте минимальный проект UE или добавьте этот код в APlayerController::BeginPlay()

if (GEngine)
{
    constexpr auto displayTime = 84.f;
    FString role;
    switch (Role)
    {
        case ROLE_Authority: role = "Authority"; break;
        case ROLE_AutonomousProxy: role = "Owner"; break;
        case ROLE_SimulatedProxy: role = "Proxy"; break;
    }
    GEngine->AddOnScreenDebugMessage(-1, displayTime, FColor::Emerald,
        FString::Printf(TEXT("%s: role %s"), *this->GetName(), *role)
    );
    GEngine->AddOnScreenDebugMessage(-1, displayTime, FColor::Cyan,
        FString::Printf(TEXT("%s: GetWorld()->IsServer() = %i vs. GIsServer = %i"),
            *this->GetName(), GetWorld()->IsServer(), GIsServer
        )
    );
    GEngine->AddOnScreenDebugMessage(-1, displayTime, FColor::Orange,
        FString::Printf(TEXT("%s: GetWorld()->IsClient() = %i vs. GIsClient = %i"),
            *this->GetName(), GetWorld()->IsClient(), GIsClient
        )
    );
}

Наблюдение

ПИРОГ: один игрок и выделенный сервер

Log for one player and dedicated server

Журнал OnScreen находится снизу вверх. Власть == выделенный сервер. Владелец == клиент.

  • строк [4,6] выделенный сервер
  • строки [1,3] являются клиентскими

ПИРОГ: два игрока и сервер прослушивания

Log for two players and listen server

Журнал OnScreen находится снизу вверх. Authority == прослушивать сервер. Владелец == клиент.

  • строк [4,9] - сервер прослушивания (с клиентским ПК и собственным ПК)
  • строк [1,3] являются клиентскими

Упакованная (разрабатываемая) сборка: один экземпляр

single packaged instance

Ожидали бы GIsServer = true.

Запуск редактора UE: сервер -> клиент

Когда его так называют

ue4editor.exe IsServer_IsClient.uproject -server -log
ue4editor.exe IsServer_IsClient.uproject -game 127.0.0.1

клиент показывает

imageclient">

Это как и ожидалось.

...