Actor 的 Role 和 RemoteRole 属性

概述

在 Actor 的复制过程中,有两个属性扮演了重要角色,分别是 RoleRemoteRole

有了这两个属性,您可以知道:

  • 谁拥有 actor 的主控权

  • actor 是否被复制

  • 复制模式

首先一件要确定的事,就是谁拥有特定 actor 的主控权。要确定当前运行的引擎实例是否有主控者,需要查看 Role 属性是否为 ROLE_Authority。如果是,就表明这个运行中的引擎实例负责掌管此 actor(决定其是否被复制)。

如果 Role 是 ROLE_Authority,RemoteRole 是 ROLE_SimulatedProxyROLE_AutonomousProxy,就说明这个引擎实例负责将此 actor 复制到远程连接。

就目前而言,只有服务器能够向已连接的客户端同步 Actor (客户端永远都不能向服务器同步)。始终记住这一点, 只有 服务器才能看到 Role == ROLE_AuthorityRemoteRole == ROLE_SimulatedProxy 或者 ROLE_AutonomousProxy

Role/RemoteRole 对调

对于不同的数值观察者,它们的 Role 和 RemoteRole 值可能发生对调。例如,如果您的服务器上有这样的配置:

  • Role == ROLE_Authority

  • RemoteRole == ROLE_SimulatedProxy

客户端会将其识别为以下形式:

  • Role == ROLE_SimulatedProxy

  • RemoteRole == ROLE_Authority

这种情况是正常的,因为服务器要负责掌管 actor 并将其复制到客户端。而客户端只是接收更新,并在更新的间歇模拟 actor。

复制模式

服务器不会在每次更新时复制 actor。这会消耗太多的带宽和 CPU 资源。实际上,服务器会按照 AActor::NetUpdateFrequency 属性指定的频度来复制 actor。

因此在 actor 更新的间歇,会有一些时间数据被传递到客户端。这会导致 actor 呈现出断续、不连贯的移动。为了弥补这个缺陷,客户端将在更新的间歇中模拟 actor。

目前共有两种类型的模拟。

ROLE_SimulatedProxy

这是标准的模拟途径,通常是根据上次获得的速率对移动进行推算。当服务器为特定的 actor 发送更新时,客户端将向着新的方位调整其位置,然后利用更新的间歇,根据由服务器发送的最近的速率值来继续移动 actor。

使用上次获得的速率值进行模拟,只是普通模拟方式中的一种。您完全可以编写自己的定制代码,在服务器更新的间隔使用其他的一些信息来进行推算。

ROLE_AutonomousProxy

这种模拟通常只用于 PlayerController 所拥有的 actor。这说明此 actor 会接收来自真人控制者的输入,所以在我们进行推算时,我们会有更多一些的信息,而且能使用真人输入内容来补足缺失的信息(而不是根据上次获得的速率来进行推算)。