目录
思考几个问题:
- 什么是同步?
- 网络游戏中,什么内容需要同步?
- 虚幻中的同步单位是什么?
- 是不是所有内容都需要同步?
- 静态摆放
场景中摆放的Actor,默认是同步到所有终端,但是它们没有做网络关联。
Net Load On Client选项默认是勾选的,也就是场景中的物体默认都会在所有终端显示,但是并不代表所有物体对象都需要进行网络同步,因为所有内容全部同步的成本非常高。
- 动态生成
场景中摆放的Actor需要进行网络同步时,需要在细节面板中勾选"Replicates",默认是关闭的。
生成和销毁
在服务器生成Actor,若开启"Replicates",则会同步到所有终端
在服务器销毁Actor,若开启"Replicates",则所有终端中关联对象均会被销毁
但是,开启"Replicates"就一定会同步所有行为和属性吗?
No!开启"Replicates"只代表对象在网络有同步的能力,而具体怎么同步,要同步什么内容,需要设计者去思考。
行为同步和属性同步
行为同步
调用与执行位置进行拆分。即:调用位置和执行位置不一定相同。(RPC)
- 举例:Server调用“吃苹果”,广播给所有Client去执行“吃苹果”
- 举例:Client调用“吃苹果”,让Server执行“吃苹果”
- 前提:调用和执行拆分的是成员函数,也就是说我们同步的是成员函数,依据的是对象,而这个对象若要进行关联则需要开启"Replicates"。
- 举例:丢手雷,所有终端都需要看到手雷。
属性同步
- 每个Acto维护一个全属性列表,其中包含Replicated说明符。每当复制的属性值发生变化时,Server会向所有Client发送更新。Client会将其应用到Actor的本地版本上。这些更新只会来自Server,Client永远不会向Server或其他Client发送属性更新。
- Actor属性复制可靠,意味着Actor的Client版本的属性最终反应Server上的值,而不必接受每一个单独的变化。
- 蓝图中的同步方式:
- Replicated:同步数据,但没有通知
- RedNotify:同步数据,并生成通知函数
Actor网络身份-区分Client & Server
当对象开启了网络同步,那么将会获得网络身份授权。
根据终端不同,分为本地身份(Local)和远端身份(Remote)
- LocalRole:用来裁定当前Actor在当前终端的身份
- RemoteRole:用来裁定当前Actor在远端的身份
身份授权类别
- Simulated
- Actor为远程代理,顾名思义,这个Actor完全是模拟出来的一个东西,由另一台机器上的授权Actor完全控制。网络游戏中如拾取物、发射物或交互对象等多数Actor将在远程客户端上显示为Simulated proxy
- Autonomous
- Actor为远程代理,能够本地执行部分功能。但会接受授权Actor中的矫正。说白了就是会收到Server的检查。Autonomous proxy通常为玩家直接控制的Actor所保留,如pawn。
- Authority
- 仅存在与Server的身份,权威的,“一切由我说了算”。当前Actor会将其信息复制到其他机器上的远程代理。
- None
- 无身份,未开启"Replicates"
划分终端所在用途
在执行行为同步时,我们必须直到当前对象执行行为时所在的终端类型,以便我们选择合适的同步方式,处理动作。
举例:Client有一个开枪动作,这时就需要到Server去检查玩家是否具备开枪的能力。Client开枪,但执行结果在Server,这时就需要我们知道动作产生在哪里。
Unreal框架中,有主机端的概念,即玩家操控端和主机端重叠(说白了就是房主,比如CS、魔兽争霸里的房主,也需要参与游戏),主机端也产生游戏逻辑。所以执行动作我们必须要清楚动作的所在终端。