目录
1.客户端-服务器模型
2.网络模式
3.Replicate
4.远程过程调用(RPC)
多人联机需要在大量客户端同步大量数据,怎样传输用户之间的数据十分重要,虚幻引擎中,在客户端与服务器间同步数据和调用程序的过程被称为 复制(Replication)
参考了虚幻官方文档-网络概述:https://docs.unrealengine.com/5.0/zh-CN/networking-overview-for-unreal-engine/
在网络多人游戏中,虚幻引擎使用 客户端-服务器 模型。网络中的一台计算机作为 服务器 主持多人游戏会话,而所有其他玩家的计算机作为 客户端 连接到该服务器。然后,服务器与连接的客户端分享游戏状态信息,并提供一种客户端之间通信的方法。
服务器作为游戏主机,保留一个真实 授权 的游戏状态。换句话说,服务器是多人游戏实际发生的地方。客户端会远程控制其在服务器上各自拥有的 Pawn,发送过程调用以使其执行游戏操作。但服务器不会将视觉效果直接流送至客户端显示器。服务器会将游戏状态信息 复制 到各客户端,告知应存在的Actor、此类Actor的行为,以及不同变量应拥有的值。然后各客户端使用此信息,对服务器上正在发生的情况进行高度模拟。
作为服务器的计算机处理所有游戏信息与逻辑,然后分发给所有客户端进行渲染,例如:A,B,C通过网络联机,A想要操控屏幕上的角色捡起一把大宝剑,于是A操作了相应键盘和鼠标,这时,按键信息将传递给服务器,服务器再将信息传递给A,B,C,这样A,B,C都能看见A控制的角色拿起一把大宝剑。
独立(standalone):游戏作为服务器运行,不接受远程客户端连接
客户端(client):游戏作为客户端运行,不运行服务器逻辑
监听服务器(listener-server):游戏玩家之一的计算机充当主持多人会话的服务器
专属服务器(dedicated-server):一台专用计算机充当服务器
拥有游戏副本的用户均可启动聆听服务器并在同一计算机上运行,因此聆听服务器对于用户而言较易自发设置。支持聆听服务器的游戏通常拥有游戏UI,用于启动服务器或搜索要加入的服务器。但由于主持聆听服务器的玩家会直接在服务器上游戏,因此比其他必须使用网络连接方可游戏的玩家更具优势,于是便导致了公平和作弊问题。
同时,要作为服务器运行,还需支持如图形和音效等玩家相关系统,从而引发额外处理负载。此类因素导致聆听服务器不适用于激烈的竞技或网络负载极高的游戏,但对于小型玩家群体间进行临时合作和竞技多人游戏而言,却十分好用。
创建、销毁和移动等常见功能会自动复制,但其他部分不会默认自动复制,需要手动定义
通过UPROPERTY宏可以定义变量为复制变量,将自动复制此变量
// 在类声明中定义变量
UPROPERTY( replicated )
AActor * MyActor;
接着还需定义GetLifetimeReplicatedProps函数
// 重写父类虚函数
virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps)const override
void MyClass::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const
{
DOREPLIFETIME(AActor, MyActor );
}
别忘了将bReplicate设置为true(在构造函数和蓝图中设置)
bReplicates = true;
ExampleClass.h
// 服务器RPC MyFunction的声明。
UFUNCTION(Server, Reliable)
void MyFunction(int myInt);
ExampleClass.cpp
// 服务器RPC MyFunction的实现。
// 注意函数实现要在名字后面加_Implementation
void AExampleClass::MyFunction_Implementation(int myInt)
{
// 此函数在RPC传播后被调用
// 游戏代码在此。
}
RPC在服务器和客户端的调用效果不同,具体如下
至于UFUNCTION()中还要加一个Reliable,我也不知道为啥qwq,虚幻官方这样说
可靠性
必须将RPC指定为 可靠 或 不可靠。在蓝图中,函数和事件默认为不可靠。要将函数指定为可靠,将细节面板(Details Panel)中的 可靠(Reliable) 设置设为 true。在C++中,必须将
Reliable
或Unreliable
说明符作为Server
、Client
或NetMulticast
函数,添加到RPC的UFUNCTION
宏及其状态。不可靠RPC无法保证必会到达预定目的地,但其发送速度和频率高于可靠的RPC。其最适用于对gameplay而言不重要或经常调用的函数。例如,由于Actor移动每帧都可能变换,因此使用不可靠RPC复制该Actor移动。
可靠的RPC保证到达预定目的地,并在成功接收之前一直保留在队列中。其最适合用于对gameplay很关键或者不经常调用的函数。相关例子包括碰撞事件、武器发射的开始或结束,或生成Actor。
UE5 C++原创教系列程随缘更新中 ---