Actor是UE网络同步核心。所有的数据同步都是围绕Actor展开的。服务器将保留一份Actor列表并定期更新客户端,以便客户端保留每个Actor(那些需要被同步的Actor)的近似复本。(比如:玩家角色,武器等)
Actor主要通过两种方式进行更新: 属性复制 和 RPC(远程过程调用)
如此设计的原因是,如果按照协议模式开发,客户端和服务器架构不一样,负责人不一样,导致两边的逻辑各有一份代码,一边逻辑改动需要另一边的开发人员也配合做相应的修改。同时测试起来也很麻烦。UE的基于Actor为基础的同步方式是为了方便开发,便于维护。一块逻辑可以由一个人负责客户端和服务器全部代码。开发者只要考虑新的Actor哪些需要用RPC,哪些需要用属性复制就可以了。又因为提供PIE模式,客户端和服务器逻辑可以同时运行,更能方便调试。打包时可以直接把客户端打包成APP,Server端打包成Linux服务器。
开发过程中代码上要能区分是服务器或者客户端还是模拟端。一般情况使用权威、主控或者模拟权限来确保代码在什么地方运行。对于两个客户端A和B,可以让其中一个作为监听服务器,另一个作为单纯客户端,也可以两者都是客户端,然后开发一个专有服务器。这两种情况在实际开发中都有使用,视具体情况而定。但总之,只要是Server那它就具有“权威”属性,在C++代码中可以用HasAuthority()来判断。对于一个客户端A,其权限即为“主控”,对于它来说,其他的客户端权限即为“模拟”,C++代码中可以使用IsLocallyControlled() 判断是否为本地客户端。
如若需要Actor具有同步功能,需要在该Actor蓝图中勾选Replicates属性