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数量)。
泰课在线
教程到此就结束了,欢迎拍砖!