哪种 UE4 类最适合在多人游戏中存储用户数据

Roi*_*ton 1 multiplayer unreal-engine4

在多人游戏环境中,哪个 UE4 类最适合存储用户数据?

要求是数据

  1. 级别之间必须保持一致
  2. 如果用户拥有的 actor 被销毁,则必须是持久的
  3. 与会话的其他用户无关。它仅与服务器和所有者相关。

由于 (1) 和 (2),将其存储在用户 actor 上不是一种选择。我想到的是

  • PlayerController,但是它在级别之间是否持续存在?
  • PlayerState复制设置COND_OwnerOnly为特定数据,但它在级别之间是否持久?

还有其他类更符合上述要求吗?

Chr*_*ong 8

我将回答每一项要求,但顺序与问题中的顺序不同。对于第三个要求,最好使用PlayerController类而不是类PlayerState,因为客户端的玩家控制器仅存在于服务器和拥有的客户端上,因此与玩家控制器相关的任何信息只会从服务器复制到拥有的客户端客户。另一方面,客户端的玩家状态存在于服务器和所有客户端上,因此与玩家状态相关的任何信息都将从服务器复制到所有客户端,这意味着所有玩家都可以访问自己和每个人的状态其他人的玩家状态。

对于第一个要求,最好使用PlayerState类而不是PlayerController类。请注意,当关卡发生变化时,玩家状态和玩家控制器都会被销毁并重新创建。但是,对于播放器状态,您可以重写CopyProperties负责将特定信息从播放器状态的旧实例复制到新实例的方法。此外,这仅在启用无缝旅行的情况下才有效。您可以在此处阅读有关无缝旅行的更多信息。您还可以使用该类GameInstance,因为当地图更改或拥有的 actor/pawn 被破坏时,游戏实例不会被破坏。但游戏实例仅与客户端相关,因此每个客户端甚至服务器都有自己的游戏实例,不会与任何人共享。

对于第二个要求,当拥有的 actor/pawn 被销毁/重生时, 或 类的实例PlayerState不会PlayerController被销毁/重生。因此,任一类都可以满足此特定要求。

总之,该类似乎是最合适的,因为就像您提到的那样,在定义要复制的属性时,您可以在重写方法并传递给函数的调用PlayerState时控制复制它们的级别。这是一个例子:GetLifetimeReplicatedPropsCOND_OwnerOnlyDOREPLIFETIME_CONDITION

void ACustomPlayerState::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);

    DOREPLIFETIME_CONDITION(ACustomPlayerState, CustomProp, COND_OwnerOnly);
}
Run Code Online (Sandbox Code Playgroud)

除此之外,您还可以重写该CopyProperties方法以在地图更改期间“保留”特定信息。以下是ShooterGame项目的示例:

void AShooterPlayerState::CopyProperties(APlayerState* PlayerState)
{   
    Super::CopyProperties(PlayerState);

    AShooterPlayerState* ShooterPlayer = Cast<AShooterPlayerState>(PlayerState);
    if (ShooterPlayer)
    {
        ShooterPlayer->TeamNumber = TeamNumber;
    }   
}
Run Code Online (Sandbox Code Playgroud)

此答案的来源以及有关虚幻引擎中多人游戏概念的更多信息: