UE4蓝图实现局域网联机

发表于2016-11-29
评论13 7.8k浏览
UE4局域网联机示例
  前期准备
  不管您是正在双修unity和UE还是像我从unity转来UE的开发者,那么您对下面这张图的内容一定不陌生。这便是unity官方在推广其UNet模块时一同推广的官方案例。(因为是自己仿的,可能有些小的地方不太一样。)


  那么问题来了,unity有如此方便的UNet组件:


  那么UE的蓝图里,是否也有相对应的蓝图节点可以实现相同的功能呢?(我觉得这个问题是广大unity转UE的开发者内心中最多的独白,那个“似曾相识的它“,在哪里。)
  首先,我们要分析下我们要实现的主要功能是什么。


  即最主要的两个功能:开♂房和进♂入。
  我们带着这样的目的,先去UE的官方文档转一转,看看能不能获得有用的信息。在
https://docs.unrealengine.com/latest/CHN/Engine/Blueprints/UserGuide/OnlineNodes/index.html这个页面我们已经可以大致地了解到主要需要我们使用的3个蓝图节点,分别是Create Session、Find Session、Join Session。(另:
https://docs.unrealengine.com/latest/CHN/Resources/ContentExamples/Networking/index.html在“内容示例:网络特性内容示例”中也有大量相关的进阶内容可供学习,目前也已经都翻译成中文了。)


  官方文档的翻译叫做”会话“,但作为一般的中国玩家还是比较习惯”开房“,”建主机“这种叫法吧?其实无所谓的,都是一个东西。

开始制作
  到这里,资料收集的差不多了。可以着手开始建立项目了。Unity那个示例用的人物模型是拿几个基本体拼的,移动控制也是很简单的几个按键事件,UE就不用这么麻烦了,我们可以直接使用第三人称模板来开始我们的项目。


  建好后我们先到项目根目录,在Config文件夹中的DefaultEngine.ini文件的末尾加上两行:
  [OnlineSubsystem] 
  DefaultPlatformService=Null
  (ini文件即配置文件,你可以在这里设置一些基本的属性,类似于给定出厂设置。)
  然后我们再重新打开一下刚才新建的第三人称模板的项目,在内容浏览器中找到Maps文件夹,打开,在其中新建一个关卡。这个关卡我们之后用作展示创建房间和加入房间的UI界面。


  打开ThirdPersonBP,在里面新建“控件蓝图”(即绘制UI界面)


  双击打开新建的控件蓝图,进入UI编辑器,在左侧拖拽Button和Text控件到视口中,来制作按钮。Text控件拖拽到Button控件里即可指定他们之间的父子关系。


  编辑文字修改大小,达到下图效果。


  之后选中第一个Button,在右侧下拉菜单中找到OnClicked事件,点击绿色的加号,进入事件蓝图编辑器,来编辑按钮点击后触发的事件(开房)。


  其中Get Player Controller是指获得玩家当前输入设备,Player Index为0的意思是“当前”玩家。在Create Session(开房)成功后,打开第三人称模板自带的关卡Open Level(Level Name:你在内容浏览器中看到的关卡名,此处是ThirdPersonExampleMap),如果开房失败,那么我们在屏幕上输出一句话Create session fail.(开房失败)。
  到这里,开房步骤已经完成,下面我们要搜索局域网中的房间并加入,为了示例便于理解,我们先默认局域网中只有一个可以被搜索到的房间且没有被加密。
  同样的,我们通过单机UI编辑器右上角,退回“设计师”界面。


  重复之前的步骤,为“LAN Client”按钮添加单击事件。如图:


  从单击按钮开始(Onclicked),先寻找房间(Find Session),搜索到局域网房间列表(Result)。通过Get(Index值为0)来获取列表中的第一个房间(之前已经假设全局域网只有一个能被搜索到的房间,所以它肯定排在第一个,即Index值为0)。
  成功找到房间后(On Success)即可进入房间(Join Session),进入哪个房间需要通过刚才Get到的一个“房间号”来传入Search Result。不能直接将Find Session的Result直接连入Join Session的Search Result,因为会产生多对一的情况。
  其它的获取玩家输入设备和搜索成功、失败的节点和之前创建房间时的类似,不再细说。
  至此,网络通信部分已经全部完成。

完善Demo
  为了能让Demo运行起来,我们还需要做一些基础工作。一些有基础的同学就可以略过此处了。首先我们打开之前新建的空场景,要让它显示UI控件,需要一些简单的蓝图节点来支持。
  点击蓝图->打开关卡蓝图,进入关卡蓝图编辑界面


  完成如图的蓝图节点:


  有几个新手会碰到坑的地方:
   一开始Event BeginPlay是灰色的,不用管它,直接新建一个UI控件(右键输入Create Widget)后连接节点即可(对UE的中文翻译真是又恨又爱)。之后别忘了把Class设置成你在内容浏览器里创建的那一个控件蓝图。


  最后一个“设置”节点是对一个布尔值赋值,搜索这个节点时候要把“情景关联”的勾给去了(其实一般都是去掉的。。),搜索时输入的是布尔值的名字,此处是:Show Mouse Cursor。


  之后我们打开第三人称模板自带的那张ThirdPersonExampleMap关卡。在世界大纲视图中搜索PlayerStart,将找到的NetworkPlayerStart多复制几个,作为等会连入游戏房间的玩家的出生点。

 

  然后在顶部菜单栏点击设置->世界设置。然后到右侧列表(可能各人的UI布局不同,就是找到你世界设置的详细面板),修改Game Mode Override 为ThirdPersonGameMode,再将下面“选中的游戏模式里”的DefaultPawn Class由“Pawn”设置为“None”。


  之后点击GameModeOverride后面的放大镜,在内容浏览器中找到ThirdPersonGameMode。
  右键点击它并选择“编辑”打开蓝图编辑器。将鼠标放到左侧列表的“函数“上,点击覆盖(Override),选择OnPostLogin

  之后如图连接节点,实现功能为:有新的玩家加入房间,则为他在下一个PlayerStart位置生成一个ThirdPersonCharactor(第三人称模板自带的人物),并将自定义的整形变量playerIndex自加1,等待下个玩家的加入。


  其中要注意的是:
  Get All Actor OfClass中Actor Class 是Player Start。
  其中Spawn Actor ThirdPerson Character是右键在搜索框中搜索spawn actor找到“游戏”下的“从类生成Actor”节点,再将目标Class改为ThirdPersonCharacter
  Player Index为自定义的整形变量,定义方法为:在左侧栏“变量”处点击“+变量”新建一个变量,命名为“playerIndex”,再在右侧“细节”面板将其设置为整形,默认值保持0不变。使用时从变量列表将其拖拽到视口选择“获得”即可。


  右下方的“+”蓝图节点是通过右键搜索“+”,在数学里找到“integer+integer”节点并使用。

收尾
  如果运行的时候出现人物是扁的bug,请查看下你之前复制的Player Start是否有缩放量,请把每个Player Start的缩放量置1.
  你可以选择打包运行也可以选择“播放”下的不同播放模式并调整一下玩家数量(个数不要超过你放置的PlayerStart数量)。


  我的教程到此就结束了,谢谢大家!
  转载请注明文章来源网址
===============================================================================================
  有同学反映图片被压缩了看不清,我把word文档也当附件上传了。

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

12个评论

  • ssll 2016-11-30 1楼
    六十几的浏览量竟然有八十几个赞,刷的吧
  • ++ 2016-12-01 2楼
    不太懂啊
  • 蛋丁的人参 2016-12-09 3楼
    意思是如果我有两台电脑在同一个局域网中,就可以连到一起?
  • 叶空DE星/ty 2017-01-06 4楼
    感谢,说得挺仔细的,看懂了!我是从U3D转UE4的,以后还多多请求~!
  • Tracy-杰 2017-01-08 5楼
    谢谢楼主
  • 番茄你个马铃薯 2017-04-14 6楼
    楼主,想请教个问题。文章中说的开房方式,开房的玩家既当服务端又当客户端,如果放在互联网上的话,开房玩家完全可以作弊,如果是想在互联网上开房 需要如何操作呢?就是房间如何作为专用服务器?
  • Go+hi+san 2017-04-18 7楼
    请问我要想给每个登录的角色赋一个昵称怎么办呢
  • 敬-SKY 2017-06-14 8楼
    楼主 问一下 我这个照着做了之后 提示 Warning TravelFailure: LoadMapFailure, Reason for Failure: 'Failed to load package '/Game/ThirdPersonBP/Maps/UEDPIE_0_ThirdPersonExampleMap''. Shutting down PIE.   这个  这是什么原因   可以创建 不能加入
  • L'Arc~en~Ciel 2017-06-14 9楼
    我想请教一下,人物动画怎么     进行同步  ?
  • Pang.k 2018-08-05 10楼
    同上 怎么进行动作同步
  • 高度不可替代性 2019-12-02 11楼
    谢谢楼主的教程!请问附件在哪里能看到,没找到
  • 油条伴咖啡 2021-02-22 12楼
    为啥我弄完之后,只有在本机开两个客户端才能实现联机。如果是不同的两台连在同一个路由上的两台机器,他们两个客户端就是各干各的,没什么关联呢~~囧