为什么GIsServer在客户端上为true,为什么GIsClient在专用服务器上为true?

时间:2019-01-12 13:34:17

标签: multiplayer unreal-engine4

在UnrealEngine中,使用 PlayInEditor(PIE)时,调用<% if(typeof projectedWallet !== 'undefined') { %> <p><%= projectedWallet %></p> <% } %> / bool UWorld::IsServer()并检查bool UWorld::IsClient() / {{1}时,得到以下结果}:

bool GIsServer

这使我想到以下问题:

  1. 为什么bool GIsClient在客户上是┌──────────────────┬────────────────────────┬───────────┬──────────────────────────────────────────┐ │ Machine │ GetWorld()->IsServer() │ GIsServer │ GetWorld()->IsClient() returns GIsClient │ ├──────────────────┼────────────────────────┼───────────┼──────────────────────────────────────────┤ │ Dedicated server │ true │ true │ true │ │ Listen server │ true │ true │ true │ │ Client │ false │ true │ true │ └──────────────────┴────────────────────────┴───────────┴──────────────────────────────────────────┘
  2. 为什么GIsServer在专用服务器上是true

复制

使用minimal UE project或将此代码添加到GIsClient

true

观察

PIE:一台播放器和专用服务器

Log for one player and dedicated server

屏幕日志从下至上。授权==专用服务器。所有者==客户。

  • 第[4,6]行是专用服务器
  • 第[1,3]行是客户

PIE:两个播放器和监听服务器

Log for two players and listen server

屏幕日志从下至上。权限==监听服务器。所有者==客户。

  • 第[4,9]行是侦听服务器(具有客户端计算机和自己的计算机)
  • 第[1,3]行是客户

打包(开发)版本:单个实例

single packaged instance

会期望APlayerController::BeginPlay()

UE编辑器启动:服务器->客户端

那样叫

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
        )
    );
}

客户显示

client in server->client

这是预期的。

0 个答案:

没有答案