UE4蓝图实现局域网联机
前期准备
无论你是同时学习Unity和UE,还是像我一样从Unity转来UE的开发者,对下面这张图的内容应该并不陌生。这是Unity官方在推广其UNet模块时一同推出的官方案例。(注:本文示例为自行仿制,可能存在一些细微差异。)
既然Unity有方便的UNet组件,那么在UE的蓝图中,是否也有对应的蓝图节点可以实现相同的功能呢?这或许是广大从Unity转来UE的开发者心中共同的疑问。
首先,我们需要明确要实现的主要功能,即“开房”和“进入”这两个核心功能。带着这个目的,我们可以去UE的官方文档中寻找有用的信息。
在UE蓝图在线节点文档中,我们可以大致了解到主要需要使用的3个蓝图节点,分别是Create Session(创建会话)、Find Session(查找会话)、Join Session(加入会话)。另外,内容示例:网络特性内容示例中也有大量相关的进阶内容可供学习,且目前已全部翻译成中文。
官方文档将其称为“会话”,但对于国内玩家而言,“开房”“建主机”等说法可能更为熟悉。实际上,它们指的是同一概念。
开始制作
资料收集完成后,我们可以着手建立项目。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(加入会话)进入房间。需要注意的是,不能直接将Find Session的Result连入Join Session的Search Result,因为会产生多对一的情况,应通过刚才Get到的“房间号”传入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”节点并使用。
收尾
如果在运行过程中出现人物变扁的问题,请检查之前复制的Player Start是否有缩放量,将每个Player Start的缩放量置为1即可。
你可以选择打包运行项目,也可以选择“播放”下的不同播放模式,并调整玩家数量(玩家数量不要超过你放置的PlayerStart数量)。
本教程到此结束,欢迎大家提出宝贵意见!