UE4局域网斗地主(二)

发表于2018-01-26
评论0 2.6k浏览
上一篇文章中让大家了解了UE4中实现局域网斗地主大体框架,那本篇就让大家了解下UE4的Repication是怎么运作的。

步骤如下:
1.客户端-服务器模式及连接过程。
2.复制机制。(组件,Actor,属性复制)
3.RPC。

首先通读官方文档网络连接与多人游戏:https://docs.unrealengine.com/latest/CHN/Gameplay/Networking/index.html

看完懵逼不要紧,看了三遍还懵逼也不要紧。重要的是实践检验真理。

下面是我实践的一个例子:

这是文档内连接过程的原文:
主要步骤如下:
客户端发送连接请求。
如果服务器接受连接,则发送当前地图。
服务器等待客户端加载此地图。
加载之后,服务器将在本地调用 AGameMode::PreLogin。
这样可以使 GameMode 有机会拒绝连接
如果接受连接,服务器将调用 AGameMode::Login
该函数的作用是创建一个 PlayerController,可用于在今后复制到新连接的客户端。成功接收后,这个 PlayerController 将替代客户端的临时 PlayerController (之前被用作连接过程中的占位符)。
此时将调用 APlayerController::BeginPlay。应当注意的是,在此 actor 上调用 RPC 函数尚存在安全风险。您应当等待 AGameMode::PostLogin 被调用完成。
如果一切顺利,AGameMode::PostLogin 将被调用。
这时,可以放心的让服务器在此 PlayerController 上开始调用 RPC 函数。

读完上面的我的理解是客户端加入游戏以后先加载关卡,然后在GameMode上实例化玩家,并且带有的playerController会自动复制并且代替客户端上的playercontroller.但在PostLogin中调用actor的RPC函数是有风险的,这点我遇到过,在gameMode中实例化了以后调用player中的RPC函数,发现无法调用,因为在PostLogin完成之前此actor的beginplay都未到达,更别说上面的RPC函数了,可以理解成尚未完全连接完成RPC函数尚且未被编译。另外一个游戏一个GameMode,只能在服务器上调用,客户端是不能调用的(客户端调的并不是服务器上的权威GameMode),这点很重要(上一篇文章有介绍)。下面是验证此连接及复制过程:

游戏中主场景的关卡蓝图:

创建的玩家actor的beginplay验证在哪生成以及名字。

一个服务器两个客户端进入场景(与主场景不是一个场景):

服务器创建房间:

第一个客户端加入房间:

第二个客户端加入房间:

以上验证后得出结论:
1.玩家加入后,先在服务器上生成一个,然后复制到除了这个加入的玩家其他的玩家客户端上,最后复制服务器上的到这个加入的玩家。
2.在这之后再进入关卡。

对了,少了一张GameMode的生成,因为图片限制大小,无法上传了,其实 与前一篇文章里的一样,在GameMode上的OnPostLogin生成一个pawn然后用possess控制。注意:spawn actor of class会进入两次,一次在服务器上,一次无法获取判断(强制生成,切actor的begin play 都截取不到。)这个测试了就知道了,说不清。

参考连接:
https://answers.unrealengine.com/questions/122429/gamemode-vs-gamestate.html   //GameMode vs GameState 在network中区别
http://cedric-neukirchen.net/Downloads/Compendium/UE4_Network_Compendium_by_Cedric_eXi_Neukirchen.pdf //network详细介绍
http://www.nafonso.com/home/unreal-framework-network   //network framework(概括介绍)
https://wiki.beyondunreal.com/Everything_you_ever_wanted_to_know_about_replication_(but_were_afraid_to_ask)#Things_to_keep_in_mind_while_reading   //Replication文档

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引