ue4 服务器登陆流程

ue4中,客户端登陆流程如下,调用UEngine::Browse方法,在这个方法中,判断如果是客户端,则创建UPendingNetGame实例,代码如下:

		WorldContext.PendingNetGame = NewObject<UPendingNetGame>();
		WorldContext.PendingNetGame->Initialize(URL);
		WorldContext.PendingNetGame->InitNetDriver();

而在InitNetDriver函数中,会向服务器发送 NMT_Hello 协议,我们转到NMT_Hello 的定义,如下:

DEFINE_CONTROL_CHANNEL_MESSAGE_TWOPARAM(Hello, 0, uint8, uint32); // initial client connection message

参数1:大端还是小端
参数2:客户端版本号

客户端处理协议的地方是如下两个函数:

void UPendingNetGame::NotifyControlMessage(UNetConnection* Connection, uint8 MessageType, class FInBunch& Bunch)
void UWorld::NotifyControlMessage(UNetConnection* Connection, uint8 MessageType, class FInBunch& Bunch)
服务器处理协议的地方是下面这个函数:

void UWorld::NotifyControlMessage(UNetConnection* Connection, uint8 MessageType, class FInBunch& Bunch)

在服务器的协议处理函数,我们可以看到NMT_Hello协议的处理过程,先调用Receive接收消息,然后判断版本号是否一致,不一致发送NMT_Upgrade消息,一致则发送NMT_Challenge消息

DEFINE_CONTROL_CHANNEL_MESSAGE_ONEPARAM(Challenge, 3, FString); // server sends client challenge string to verify integrity
参数1:服务器当前时间

客户端收到NMT_Challenge消息后,向服务器发送NMT_Login消息,NMT_Login消息携带三个参数,如下:

DEFINE_CONTROL_CHANNEL_MESSAGE_THREEPARAM(Login, 5, FString, FString, FUniqueNetIdRepl); // client requests to be admitted to the game
参数1:客户端响应
参数2:客户端URL
参数3:客户端唯一ID

服务器收到NMT_Login消息,验证是否可以登录,失败返回NMT_Failure消息,成功则向服务器发送NMT_Welcome消息

NMT_Welcome消息定义如下: 

DEFINE_CONTROL_CHANNEL_MESSAGE_THREEPARAM(Welcome, 1, FString, FString, FString); // server tells client they're ok'ed to load the server's level
参数1:服务器使用地图名

参数2:服务器使用GameMode名称

参数3:重定向URL

客户端收到NMT_Welcome消息,向服务器发送NMT_Netspeed消息,定义如下:

DEFINE_CONTROL_CHANNEL_MESSAGE_ONEPARAM(Netspeed, 4, int32); // client sends requested transfer rate
参数1:当前网络传输速度

服务器收到NMT_Netspeed消息,只是简单记录一下客户端的NetSpeed即可

这里有个问题先要说明一下,

客户端何时加载地图?

在下面这个函数中:

void UEngine::TickWorldTravel(FWorldContext& Context, float DeltaSeconds)
有如下这个判断:

else if( Context.PendingNetGame && Context.PendingNetGame->bSuccessfullyConnected && !Context.PendingNetGame->bSentJoinRequest )

当bSuccessfullyConnected为true而bSentJoinRequest为false时,客户端会LoadMap,而bSuccessfullyConnected是在客户端处理完NMT_Welcome消息后设置为true的,也就是说客户端在处理完NMT_Welcome消息,下一次执行TickWorldTravel函数的时候,就会加载地图,而bSentJoinRequest变量,是为了防止地图被加载多次而设置的。

当客户端调用完LoadMap,会向服务器发送NMT_Join消息,

在服务器处理NMT_Join消息时,代码如下:

Connection->PlayerController = SpawnPlayActor( Connection, ROLE_AutonomousProxy, InURL, Connection->PlayerId, ErrorMsg );

然后SpawnPlayActor中会调用GameMode的Login,而在Login内部,会调用如下代码,创建PlayerController

APlayerController* NewPlayerController = SpawnPlayerController(RemoteRole, FVector::ZeroVector, FRotator::ZeroRotator);

在PlayerController的初始化函数中,如果是服务器,则创建PlayerState,用于服务器和客户端Player信息的同步,具体函数如下:

void APlayerController::PostInitializeComponents()



  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UE4专属DS服务器是指使用Unreal Engine 4引擎创建的专属服务器。专属服务器成本更高,需要独立于所有参与玩家的计算机,并需要完成自身网络连接。与普通游戏服务器相比,专属服务器可以提供更高的安全性、公平性和可靠性。专属服务器不会渲染图形或执行仅与本地玩家相关的逻辑,因此可以更高效地处理游戏玩法和网络通信。这使得专属服务器适用于需要大量玩家或需要高效执行、可信服务器的游戏,如MMO、竞技MOBA或快节奏网络射击游戏。 要创建UE4专属DS服务器,首先需要下载UE4的源码并进行编译。具体的下载和编译过程可以参考相关教学文章或视频。 创建专属DS服务器需要以下步骤: 1. 打开编译好的源码工程,双击打开UE4Editor.exe。 2. 创建一个第三人称的C++项目,确保选择的是C++项目,否则无法打包服务器。 3. 找到源码的位置,并将UE4Server.Target.cs文件复制到你创建的项目的Source文件夹中。 4. 使用记事本打开UE4Server.Target.cs文件,进行修改后保存。 5. 右击项目,选择Generate Visual Studio project files,生成项目文件。 6. 打开Visual Studio,选择Development Server配置,进行编译。 7. 编译通过后,在打包设置中选择编译目标,包括客户端和服务器。 8. 打包完成后,会生成服务器和客户端文件夹。 9. 在服务器文件夹中创建一个exe的快捷方式,并在属性中添加-log参数,以启用日志记录。 10. 打开客户端,通过命令控制符和Tab键进入服务器。 通过以上步骤,你可以成功创建和运行UE4专属DS服务器。请确保按照教学文章或视频中的具体指导进行操作,以确保成功创建服务器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值