多人网络游戏中,每个Actor都具有一个Network Role
属性,一个Actor的Network Role
属性决定了哪台机器能够控制这个Actor。代码中的对应类型为ENetRole
。
- 如果在本机上,该Actor为
Authority
,则表明本机掌控着该Actor的状态信息,并且会将信息复制到网络多人会话中的其他机器上,权威性基本只可能出现在服务器。 - 如果在另一台机器上,同样的这个Actor的Network Role属性为
Proxy
,则表明,本机上的该Actor是一个副本,它从服务器的Authority
Actor那里接收复制的消息。
Network Role
属性通过Local Role
和Remote Role
变量来跟踪,Local Role表示该Actor在本机上的权限属性,而Remote Role表示该Actor在远程服务器或客户端上的权限属性。
Network Role
有以下四个枚举量:
- None:该Actor在网络游戏中没有扮演任何角色,并且不会进行数据复制
- Authority:该Actor具有权威性(通常只在服务器上出现),并且将其信息复制到其他机器(客户端)上它的远程代理Actor上
- Simulated Proxy:该Actor是一个模拟代理,并不被本机的输入所控制,它在模拟另一台机器(服务器)上的权威Actor。在网络游戏中,大多数Actor,比如可拾取物品、投射物或其他可交互对象等,在远程客户端上都会显示为Simulated Proxy
- Autonomous Proxy:该Actor是一个远程自主代理(类似自治区的概念,能够自治,但是中央仍然要管控),能够接收本地的一些输入,执行一些功能,但会从权威Actor那里接收校正。自主代理通常用于玩家直接控制的角色,比如游戏中的Pawn
UE默认采用的 server-authoritative
模型,意味着服务器始终对游戏状态拥有控制权,所有信息都会从服务器复制到客户端。因此基本可以这样说:服务器上的Actor的Local Role
变量肯定为Authority
,而在远程客户端上的对应Actor的Local Role
变量则具有Simulated Proxy
(比如本机客户端上的其他玩家的角色)或Autonomous Proxy
(本机上我控制的角色)。不局限于角色,一些其他随游戏的进行会改变状态的玩意儿都有这个属性。。。
举例
- 通过代码,获取当前游戏内所有角色的
Local Role
变量的内容(通过AActor::GetLocalRole()
),我的主机作为一个Listen-Server,有两个玩家加入会话,一起玩游戏,这里三个角色的Local Role变量的内容都是Authority
,因为我提供的服务器,服务器对这三个角色的控制权是权威的。
- 当我是一个客户端,连接到一个服务器,加入一个游戏会话,在我的电脑上,我控制的角色是
区域自治代理
的,我的输入可以控制它,而其他所有玩家的角色,我都没有任何控制权,他们的属性就是模拟代理
,纯粹的模拟服务器上的该角色的状态。
- 通过代码,获取当前游戏内所有角色的
Remote Role
变量的内容(通过AActor::GetRemoteRole()
),当我不是服务器的时候,我所看到的三个角色的RemoteRole变量都是Authority的,因为在非服务器机器上Remote Role
就代表在远程服务器上的该角色控制权限。
- 最特殊的是,我作为一个
listen server
时,我所控制的角色的Remote Role变量为Autonomous Proxy
,而其他客户端所控制的角色为Simulated Proxy
我能理解在服务器上其他角色是在远程即客户端上的权限都是模拟代理,但是为啥我自己的角色在远程,即客户端上的权限不是模拟代理呢?难道他们有人能控制我的角色么??? 好像确实是。。我作为监听服务器 我即是客户端又是服务器,我的角色在远程确实有一个客户端能直接控制,那个客户端就是我自己。。。所以,我的角色的Remote Role应该有两种值,即自治和模拟,在远程其他客户端是模拟,在远程我自己客户端是自治,GetRemoteRole()函数选择在监听服务器上返回
Autonomous Proxy
。
更新:在某些版本中,监听服务器上的所有角色的Remote Role全都是Simulated Proxy,我觉得确实这样会比较合理一些。。。