UE4服务器登录流程_ue5实现注册登录-程序员宅基地

技术标签: 虚幻引擎  

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

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. WorldContext.PendingNetGame = NewObject<UPendingNetGame>();  
  2. WorldContext.PendingNetGame->Initialize(URL);  
  3. WorldContext.PendingNetGame->InitNetDriver();  

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

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. DEFINE_CONTROL_CHANNEL_MESSAGE_TWOPARAM(Hello, 0, uint8, uint32); // initial client connection message  

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

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

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. void UPendingNetGame::NotifyControlMessage(UNetConnection* Connection, uint8 MessageType, class FInBunch& Bunch)  
  2. void UWorld::NotifyControlMessage(UNetConnection* Connection, uint8 MessageType, class FInBunch& Bunch)  
服务器处理协议的地方是下面这个函数:

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. void UWorld::NotifyControlMessage(UNetConnection* Connection, uint8 MessageType, class FInBunch& Bunch)  

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

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. DEFINE_CONTROL_CHANNEL_MESSAGE_ONEPARAM(Challenge, 3, FString); // server sends client challenge string to verify integrity  
参数1:服务器当前时间

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

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. 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消息定义如下: 

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. 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消息,定义如下:

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. DEFINE_CONTROL_CHANNEL_MESSAGE_ONEPARAM(Netspeed, 4, int32); // client sends requested transfer rate  
参数1:当前网络传输速度

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

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

客户端何时加载地图?

在下面这个函数中:

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. void UEngine::TickWorldTravel(FWorldContext& Context, float DeltaSeconds)  
有如下这个判断:

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. 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消息时,代码如下:

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. Connection->PlayerController = SpawnPlayActor( Connection, ROLE_AutonomousProxy, InURL, Connection->PlayerId, ErrorMsg );  

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

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. APlayerController* NewPlayerController = SpawnPlayerController(RemoteRole, FVector::ZeroVector, FRotator::ZeroRotator);  

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

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. void APlayerController::PostInitializeComponents()  
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/schrodinger1900/article/details/52722898

智能推荐

BP-1-3 Introduction of C++_in c++, a legal identifier may contain these kinds-程序员宅基地

文章浏览阅读115次。Chapter 01 Introduction of Programming3. Introduction of C++A C++ program must have a function named main defined in only one source document.3.1 Lexer in C++symbol setlettersnumbersspecial characterswordIdentifier is composed of letter_in c++, a legal identifier may contain these kinds of characters:

Http重定向https MPM模块 HTTPd常见配置 sendfile 20190227-程序员宅基地

文章浏览阅读3.4k次。Web访问响应模型(Web I/O)单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求复用I/O结构:启动一个进程,同时响应N个连接请求实现方法:多线程模型和事件驱动多线程模型:一个进程生成N个线程,每线程响应一个连接请求事件驱动:一个进程处理N个请求复用的多进程I/O模型:启动M个进程,每个进程响应N个连..._httpd启动需要什么pam模块

vue解决 vue-style-loader ,css-loader错误_!!vue-style-loader!css-loader-程序员宅基地

文章浏览阅读4.2k次。最近在学习vue框架,使用webpack打包vue项目,在执行npm run start的时候 出现如下错误:This dependency was not found:* !!vue-style-loader!css-loader?{"minimize":false,"sourceMap":false}!../../node_modules/vue-loader/lib/style-co..._!!vue-style-loader!css-loader

工业相机的接口选择及比较_相机接口中,传输距离最远的是-程序员宅基地

文章浏览阅读2k次。​在了解工业相机接口之前,让我们大概先了解一下什么是工业相机,一般对工业相机的定义大概是机器视觉系统中的一个关键组件,其最本质的功能就是将光信号转变成有序的电信号。选择合适的相机也是机器视觉系统设计中的重要环节,相机的选择不仅直接决定所采集到的图像分辨率、图像质量等,同时也与整个系统的运行模式直接相关。因为没有一个标准的命名,所以工业相机还被称作工业摄像头、工业摄像机、工业照相机等等。从其芯类型中..._相机接口中,传输距离最远的是

关于在ubuntu常用的一些代码_ubuntu的二级文件系统登录界面代码-程序员宅基地

文章浏览阅读483次。注:最近自己搞了一台谷歌云服务器,自己要试着搭建内网穿透,用到了一些ubuntu的操作语言,先记录下,以后再补充1.切换到最高权限用户 sudo su2.切换目录 - cd #切换到根目录 - cd /root #切换到根目录下的root文件夹 - cd .. #返回到当前目录的上级目录3.查看当前目录下的所有文件 - ls -a #查看所有文件 - ls -a..._ubuntu的二级文件系统登录界面代码

文件修改的基本步骤_改文件-程序员宅基地

文章浏览阅读588次,点赞4次,收藏4次。文件修改的基本步骤Python_改文件

随便推点

Asp.net Mvc 使用EF6 code first 方式连接MySQL总结-程序员宅基地

文章浏览阅读121次。最近由于服务器变更为Linux系统.MsSql for Linux什么时候出来到生产环境使用还是要很长时间的.于是考虑使用Mysql数据库,ORM使用EF.于是先踩下坑顺便记录一下,有需要的tx可以参考下.当你考虑使用EF连接Mysql的时候肯定是已经在网上搜了一堆教程.网上教程基本都是使用控制台做演示.跟着一步步来姿势没错的话可能会正常运行,但项目中使用分层后,把数据层剥离出去,再使用..._mvc6使用ef code

android中popupwindow弹出后,屏幕背景变成半透明_andorid popupwindow弹出后背景-程序员宅基地

文章浏览阅读1k次。android中popupwindow弹出后,屏幕背景变成半透明这个效果很普通。实现的方法也很多。我使用的可能是最简单的一种,就是设置一下getWindows的透明度。不多说上代码/** * 设置添加屏幕的背景透明度 * @param bgAlpha */ public void backgroundAlpha(float bgAlpha) { WindowManager._andorid popupwindow弹出后背景

Backup And Recovery User's Guide-为完全数据库恢复做准备-确定数据库的DBID-程序员宅基地

文章浏览阅读72次。确定数据库的DBID 当需要恢复服务器参数文件或控制文件时,必须知道DBID。应该将DBID和其它数据库基本信息记录在一起。 如果没有数据库的DBID的记录,则可以在不打开数据库的情况下在下面的..._在应用备份恢复时,必须知道目标数据库的dbid

solr <一>用 Java客户端 建索引+分页查询_java 利用solr搜索引擎客户端如何创建索引-程序员宅基地

文章浏览阅读1.8k次。在 solr 3.5 配置及应用(一) 讲过一了 solr 3.5的详细配置,本节我们讲利用solr 的客户端调用solr的应用了!一、利用SolrJ操作solr API 使用SolrJ操作Solr会比利用httpClient来操作Solr要简单。SolrJ是封装了httpClient方法,来操作solr的API的。SolrJ底层还是通过使用httpClient中的方法来完_java 利用solr搜索引擎客户端如何创建索引

sent2vec-程序员宅基地

文章浏览阅读1k次。环境配置EmbedRank在标准数据集上实现了比基于图形的最先进系统更高的F分数,适用于实时处理大量Web数据。利用EmbedRank,我们还为新短语引入了基于嵌入的最大边际相关性(MMR),从而显式地增加了所选关键词的覆盖率和多样性。一项包括200多张选票的用户研究表明,虽然减少短语的语义重叠不会导致F分的增加,但我们的高度多样性选择是人类更喜欢的。保证了关键词的两个最具挑战性的性质:由候选短语与整个文档的嵌入距离获得的信息性;由候选短语之间的距离表示的多样性。文章目录环境配置相关信息装置本_sent2vec

Pycharm使用技巧(转载)-程序员宅基地

文章浏览阅读305次。Pycharm使用技巧(转载)转载自:http://www.cnblogs.com/cloudtj/articles/5980666.htmlpycharm使用技巧https://python.freelycode.com/contribution/detail/29https://python.freelycode.com/contribution/detail..._pycharm映射的web路径是指什么