南京音乐推荐联合社

UE4蓝图实现局域网联机

泰斗社区 2019-06-11 14:13:25


  不管您是正在双修unity和UE还是像我从unity转来UE的开发者,那么您对下面这张图的内容一定不陌生。这便是unity官方在推广其UNet模块时一同推广的官方案例。(因为是自己仿的,可能有些小的地方不太一样。)



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



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



  即最主要的两个功能:开♂房和进♂入。
  我们带着这样的目的,先去UE的官方文档转一转,看看能不能获得有用的信息。在
  https://docs.unrealengine.com/la ... ineNodes/index.html这个页面我们已经可以大致地了解到主要需要我们使用的3个蓝图节点,分别是Create Session、Find Session、Join Session。(另:
  https://docs.unrealengine.com/la ... tworking/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>



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



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



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



  右下方的“+”蓝图节点是通过右键搜索“+”,在数学里找到“integer+integer”节点并使用。
收尾  如果运行的时候出现人物是扁的bug,请查看下你之前复制的Player Start是否有缩放量,请把每个Player Start的缩放量置1.
  你可以选择打包运行也可以选择“播放”下的不同播放模式并调整一下玩家数量(个数不要超过你放置的PlayerStart数量)。



  我的教程到此就结束了,谢谢大家!


注意:关注了泰斗微信公众号,想获得《用Unity5做一款即时战略游戏》课程观看权的童鞋,可以联系晴天(QQ:986671381)或Lisa(QQ:2109365042),他们会添加你到该课程中,感谢!


感谢阅读



点击下方“阅读原文”更多精彩等你来!
↓↓↓
Copyright © 南京音乐推荐联合社@2017