简介
在Actor的复制过程中,需要关心两个属性,Role与RemoteRole。
通过这两个属性,可以明确地知道:
- 谁拥有Actor的主控权
- Actor是否被复制
- 复制模式
首先一件要确定的事,就是谁拥有特定 actor 的主控权。要确定当前运行的引擎实例是否有主控者,需要查看 Role 属性是否为
ROLE_Authority
。如果是,就表明这个运行中的 虚幻引擎 实例负责掌管此 actor(决定其是否被复制)。如果 Role 是
ROLE_Authority
,RemoteRole 是ROLE_SimulatedProxy
或ROLE_AutonomousProxy
,就说明这个引擎实例负责将此 actor 复制到远程连接。
简单来说:
对于单机模式,Actor的Role与RemoteRole很显然都是ROLE_Authority。
对于网络模型下,Role代表本地对于Actor的角色,RemoteRole代表对端对于Actor的角色。
下面将重点描述多人游戏时的相关机制。
属性类型
ROLE_Authority
代表最高权限,通常是服务器持有的状态。
如果客户端本地生成的一个不同步的Actor,其Role有可能也为ROLE_Authority,因为此时这个客户端对这个Actor具有绝对的权限。
ROLE_SimulatedProxy
被动模拟角色,由服务器控制,客户端仅接受同步数据。
比如对于客户端A视角下的另一个角色,它的Role就有可能是ROLE_SimulatedProxy。
ROLE_AutonomousProxy
主控端角色,通常代表由客户端直接控制,服务器接收控制的输入来同步其状态。
比如对于客户端A视角下的自身角色,它的Role就有可能是ROLE_AutonomousProxy,接收输入之后发给服务器更新其状态。
RemoteRole与Role的区别
RemoteRole与Role对应,代表对端对Actor的角色定义,是Role的另一个视角。
当Actor在服务器为ROLE_Authority,他在服务器上的RemoteRole为ROLE_SimulatedProxy,对应的客户端的Role为ROLE_SimulatedProxy,RemoteRole为ROLE_Authority。
对于不同的数值观察者,它们的 Role 和 RemoteRole 值可能发生对调。
注意这个可能的描述
比如客户端Role为ROLE_AutonomousProxy,RemoteRole为ROLE_Authority的角色(自己操作的那个),他在服务器上的Role为ROLE_Authority,但是RemoteRole可能为ROLE_SimulatedProxy。
角色组合
常见Role与RemoteRole的组合
本地Role | 远程RemoteRole | 场景说明 |
---|---|---|
ROLE_Authority | ROLE_SimulatedProxy | 服务器视角,控制Actor,客户端仅接收同步数据(如NPC)。 |
ROLE_SimulatedProxy | ROLE_Authority | 客户端视角,客户端接收服务器同步的Actor(如静态场景物体)。 |
ROLE_AutonomousProxy | ROLE_SimulatedProxy | 客户端视角,客户端控制Actor,服务器同步其状态(如玩家角色)。 |
区分SimulatedProxy与AutonomousProxy
参考官方文档的描述,由于Actor的同步具有间隔,为了弥补这个缺陷,客户端在模拟时采取两种策略:
ROLE_SimulatedProxy通常直接根据服务器同步的信息进行模拟。
ROLE_AutonomousProxy通常会考虑客户端自身的输入,通过这部分输入来补足信息,而非只通过服务器的信息推算。