复制过程示例

为了让示例更加形象具体,我们在这里假设您是网络游戏中的一个客户端。您会看到两名对手朝着您这里跑来,对您射击,而且会听到他们的射击声。既然所有的游戏状态 都是在服务器而非您的计算机上维护,您为何能看到和听到这些事物呢?

您可以看到对手,是因为服务器已经识别出对手与您相关(也就是说,他们是可见的),而此时服务器会将这些 Actor 复制给您。这样,您(客户端) 就会有这两个正在追击您的玩家 Actor 的本地复本。您可以看到对手朝您跑来,是因为服务器正在将他们的方位和速率属性 复制给您。在服务器提供方位更新的间隔,您的客户端会在本地模拟对手的移动。您可以听到他们的射击声,是因为服务器正在将 ClientHearSound 函数复制给您。当服务器确认 PlayerPawn 听到声音时,就会为 PlayerPawn 调用 ClientHearSound 函数。

讲解至此,虚幻引擎多人游戏背后的底层机制应该是清晰明确了 。服务器不断更新游戏状态并作出所有的重大游戏决策;服务器会 复制一部分 Actor 给客户端;服务器会复制一些变量给客户端。同时,服务器还要向客户端复制一些函数调用。

另外可以明确的是,并非所有的 Actor 都需要复制。例如,如果一个 Actor 已经通过了半个关卡并离开您的视野,您就无需浪费带宽来发送与此有关的 更新。同样,变量也无需全部更新。例如,服务器做出 AI 决定时所用的变量可以不必发送到客户端;客户端只需了解 它们的显示变量、动画变量和物理变量。同时,服务器上执行的大多数函数都不应被复制。只有那些能让客户端看到或听到事物的 函数调用才需要被复制。总之,服务器中包含了大量数据,而只有一小部分数据会涉及客户端,影响到玩家的所见、所闻或 所感。

因此从逻辑上讲,我们不禁要问:“虚幻引擎如何知道要复制哪些 Actor、变量和函数调用?”

答案就是,无论谁来给类编写代码或设置蓝图,都要负责确定所需复制的变量和函数。