Actor 的 Role 和 RemoteRole 属性

关于复制 Actor 对象的全面介绍。

Windows
MacOS
Linux

在 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 会接收来自真人控制者的输入,所以在我们进行推算时,我们会有更多一些的信息,而且能使用真人输入内容来补足缺失的信息(而不是根据上次获得的速率来进行推算)。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback