UE4之简单的多人游戏

  • Post author:
  • Post category:其他


UE4多人游戏主要用到CreateSession,FindSession和JoinSession,功能分别是创建会话,查找会话以及加入会话。以下第三人称模板为例实现一个两人游戏。

1、创建第三人称模板工程,删除ThirdPersonExampleMap关卡中原有的ThirdPersonCharacter角色,拖入两个PlayerStart,调整好位置,如果想更好的控制角色位置可以修改它的PlayerStartTag标签,这里分别修改为Player1和Player2,如图:


2、创建一个UMG蓝图,命名为MainWidget,拖入如下控件,并调整好位置,服务器列表用一个字符串下拉框显示,显示查找到的所有服务器名。

3、创建游戏:创建游戏按钮Onclicked事件如下图:

CreateSession的PublicConnections设置最大连接数,这个数目包括创建游戏的服务器,这里设置为2,UseLAN使用局域网,游戏创建成功后使用OpenLevel打开游戏关卡也就是ThirdPersonExampleMap,由于我们要创建的是监听服务器(相对专用服务器而言),所以Options要加上”listen”。

4、查找游戏:在一个客户端执行了创建游戏后变为了监听服务器,在另一个客户端上就可以查找到该服务器,查找游戏的OnClicked蓝图代码如下:

FindSession的MaxResults是要查找的服务器最大数目,UseLAN使用局域网。该函数返回BlueprintSessionResult类型的数组,我们用SessionServers将查找结果保存,并添加到服务器列表的下拉框中,默认选中第一个。

5、加入游戏:从下拉列表中选择一个服务器,点击加入游戏,就可以加入到该服务器创建的游戏中,OnClicked事件蓝图代码如下:

下拉列表保存的是服务器名称,通过名称去SessionServers找到服务器,调用JoinSession,调用成功即可加入到游戏。

6、最后创建一个空白关卡,创建和显示UMG,由于这个关卡只有界面操作,因此将鼠标显示出来,方便点击。

7、要开启联网功能,还需要在Config/DefaultEngine.ini文件添加如下配置项,修改完之后要重启UE4才能生效。

[OnlineSubsystem]
DefaultPlatformService=Null

这里要根据具体环境具体配置,见官方文档说明:

Once you open it up, you will need to specify the OnlineSubsystem to use as well as the DefaultPlatformService that corresponds to your subsystem.

For example, you can play over a LAN by adding the OnlineSubsystemNull:

[OnlineSubsystem]
DefaultPlatformService=Null
Or you can play over Steam for example, using the OnlineSubsystemSteam:

[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

[OnlineSubsystem]
DefaultPlatformService=Steam

[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
bVACEnabled=0

[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"

8、操作结果:

如果是在编辑器中测试多人游戏,只需将游戏玩家数设置为需要的值即可,如下图:

以上已经实现了一个简单的多人游戏,下面介绍如何更好的控制角色类和角色位置。

游戏模式基类AGameModeBase中有三个虚函数PreLogin,Login和PostLogin,如果需要更复杂的控制功能(如拒绝连接)可以在C++代码中重载这三个函数,以下是官方文档说明:



以PreLogin为例,PreLogin原型为:

virtual void PreLogin(const FString& Options, const FString& Address, const FUniqueNetIdRepl& UniqueId, FString& ErrorMessage);

只要在函数中将ErrorMessage设置为非空字符串就可以拒绝连接并将ErrorMessage作为连接错误信息。

PostLogin中调用了一个可由蓝图实现的函数,在蓝图中显示为OnPostLogin:

UFUNCTION(BlueprintImplementableEvent, Category=Game, meta = (DisplayName = "OnPostLogin", ScriptName = "OnPostLogin"))
void K2_PostLogin(APlayerController* NewPlayer);

新建一个游戏模式类,继承自ThirdPersonGameMode,在工程设置中将游戏模式替换为新的游戏模式,打开该蓝图,右键搜索OnPostLogin,在该函数中我们可以创建自己的角色,并决定生成的位置(使用到第1步中定义的PlayerStartTag),这里通过判断PlayerStartTag将两个玩家的位置固定,如果没有这个判断角色出现的位置不好控制。





更多功能可以参考官方示例“多人枪战游戏”



版权声明:本文为yb0022原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。