В 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 │
└──────────────────┴────────────────────────┴───────────┴──────────────────────────────────────────┘
Это приводит меня к следующим вопросам:
- Почему
GIsServer
на клиентах true
?
- Почему
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
)
);
}
Наблюдение
ПИРОГ: один игрок и выделенный сервер
Журнал OnScreen находится снизу вверх. Власть == выделенный сервер. Владелец == клиент.
- строк [4,6] выделенный сервер
- строки [1,3] являются клиентскими
ПИРОГ: два игрока и сервер прослушивания
Журнал OnScreen находится снизу вверх. Authority == прослушивать сервер. Владелец == клиент.
- строк [4,9] - сервер прослушивания (с клиентским ПК и собственным ПК)
- строк [1,3] являются клиентскими
Упакованная (разрабатываемая) сборка: один экземпляр
Ожидали бы GIsServer = true
.
Запуск редактора UE: сервер -> клиент
Когда его так называют
ue4editor.exe IsServer_IsClient.uproject -server -log
ue4editor.exe IsServer_IsClient.uproject -game 127.0.0.1
клиент показывает
client">
Это как и ожидалось.