Azure PlayFab 上的 Unity 第 4 部分:设置多人服务器(第 2 部分)





5.00/5 (1投票)
在本篇文章中,我们将集成 PlayFab GSDK 以便进行云托管,然后通过仪表板将其上传并部署到 PlayFab。
在本文中,我们将学习如何设置一个 Unity 游戏项目作为后端服务器,以便与 PlayFab Multiplayer Services 一起使用。它将在云上托管,并根据玩家需求进行扩展。
在这里,我们将 PlayFab Game Server SDK (GSDK) 添加到我们的 Unity 游戏项目中,添加脚本代码来启动和处理服务器事件(例如服务器激活),然后将项目构建为一个无 GUI 的仅服务器可执行文件。
在本文中,我们将采用我们 上一篇文章 中的 Unity 游戏项目代码,并将其与 PlayFab 集成,以便部署到其云服务器上。
要求
要学习本教程,您需要一个 PlayFab 账户和以下软件
- Unity 游戏引擎
- Microsoft Visual Studio
- 来自上一篇文章的 Unity游戏项目
任务简报
之前,我们将游戏变成了多人游戏体验,但服务器进程在我们自己的计算机上本地运行。这次,我们将添加 GSDK 并更新项目以在 PlayFab 的云上运行,以便我们可以根据需要扩展到数百万玩家。
将 PlayFab GSDK 添加到 Unity
Unity GSDK 是 PlayFab 的 Game Server SDK,它使我们能够将 Unity 游戏项目变成多人游戏服务器。它运行在 PlayFab 的可扩展云实例上,每个玩家的游戏实例都可以连接到这些实例。
首先,我们 下载 GSDK 存储库。然后,我们解压文件并在文件资源管理器中打开 UnityGsdk/Assets/PlayFabSdk 文件夹。
要将 GSDK 导入游戏,我们将 MultiplayerAgent 文件夹拖放到 Unity 项目的 Assets/PlayFabSDK 文件夹中,以添加代理代码脚本。
我们还必须通过将其添加到设置中来在构建中启用 PlayFab 服务器功能。
因此,我们打开 **文件** > **构建设置**,然后在窗口左下角单击 **玩家设置**,然后添加 **ENABLE_PLAYFABSERVER_API** 作为新的 **脚本定义符号**,然后单击 **应用**。
更新服务器脚本
现在我们可以关闭弹出窗口,并使用 PlayFab 事件更新我们的服务器脚本,以便 PlayFab 的虚拟机 (VM) 可以管理它。
首先,我们在 Assets/FPS/Scenes 中找到并打开 **IntroMenu** 场景,该场景包含服务器脚本,然后启用脚本,但这次我们将 **RunLocal** 标志关闭。
从文件菜单中,我们选择 **Assets** > **打开 C# 项目**,以打开具有完整依赖项引用的项目代码,然后双击 **Server script** 以打开文件。我们将根据 PlayFab 多人游戏服务器代理示例代码 为 PlayFab 服务器事件添加多个事件处理程序。
我们将 PlayFab 命名空间添加到顶部的 using
语句中。
using PlayFab;
然后我们将以下 PlayFab 事件处理程序粘贴到脚本中。
IEnumerator ReadyForPlayers()
{
yield return new WaitForSeconds( .5f );
PlayFabMultiplayerAgentAPI.ReadyForPlayers();
}
private void OnServerActive()
{
StartServer();
}
private void OnAgentError( string error )
{
Debug.Log( error );
}
private void OnShutdown()
{
Debug.Log( "Server is shutting down" );
networkDriver.Dispose();
connections.Dispose();
StartCoroutine( Shutdown() );
}
IEnumerator Shutdown()
{
yield return new WaitForSeconds( 5f );
Application.Quit();
}
private void OnMaintenance( DateTime? NextScheduledMaintenanceUtc )
{
Debug.LogFormat( "Maintenance scheduled for: {0}", NextScheduledMaintenanceUtc.Value.ToLongDateString() );
}
然后我们创建一个方法来设置所有 PlayFab 事件。
void StartPlayFabAPI()
{
PlayFabMultiplayerAgentAPI.Start();
PlayFabMultiplayerAgentAPI.OnMaintenanceCallback += OnMaintenance;
PlayFabMultiplayerAgentAPI.OnShutDownCallback += OnShutdown;
PlayFabMultiplayerAgentAPI.OnServerActiveCallback += OnServerActive;
PlayFabMultiplayerAgentAPI.OnAgentErrorCallback += OnAgentError;
StartCoroutine( ReadyForPlayers() );
}
现在,在 StartServer
方法中,我们需要进行一些修改。我们需要使用 PlayFab 分配给进程的端口号。因此,在我们设置端口为 7777 的地方,我们将其更改为以下代码:
endpoint.Port = 7777;
var connectionInfo = PlayFabMultiplayerAgentAPI.GetGameServerConnectionInfo();
if( connectionInfo != null )
{
// Set the server to the first available port
foreach( var port in connectionInfo.GamePortsConfiguration )
{
endpoint.Port = (ushort)port.ServerListeningPort;
break;
}
}
在 Start
方法中,当 RunLocal
被禁用时,我们有一个 TODO 注释,所以我们需要调用 StartPlayFabAPI
。
void Start()
{
if( RunLocal )
{
StartServer(); // Run the server locally
}
else
{
StartPlayFabAPI();
}
}
最后,当 PlayFab 服务器中的游戏会话结束时,进程必须关闭自身,以向 PlayFab 发出服务器可以关闭和回收的信号。我们通过在 Update
方法中检测所有玩家何时断开连接来做到这一点。我们将方法中的断开连接事件代码片段修改为如下内容:
else if( cmd == NetworkEvent.Type.Disconnect )
{
Debug.Log( "Client disconnected from server" );
connections[ i ] = default( NetworkConnection );
numPlayers--;
if( numPlayers == 0 )
{
// All players are gone, shutdown
OnShutdown();
}
}
完整的服务器脚本代码可以在 GitHub 这里 找到。
部署 PlayFab 包
现在,是时候构建和打包服务器可执行文件以部署到 PlayFab 了。
确保服务器脚本在 **IntroMenu** 场景中启用,并且没有 **RunLocal** 标志,然后将构建保存到 **文件** > **构建设置** 中的单独文件夹中。然后选择所有内容并将其压缩成 zip 文件。
我们需要记住,这个可执行文件无法在本地运行,因为它期望从 PlayFab 的虚拟机中获取配置值。
接下来,我们登录到 PlayFab Dashboard 并打开 **构建** > **多人游戏** 选项卡以创建多人游戏服务器构建。如果我们尚未启用多人游戏服务器,可能需要启用它。在我们访问每月免费核心小时数之前,可能还需要添加信用卡信息。
启用后,您可以单击“新建构建”并指定服务器构建的详细信息。
选择您想要的任何名称,并为构建选择以下选项:
- 虚拟机:2 核
- 每台机器上的服务器:1
- 服务器类型:进程
- 操作系统:Windows
- 启动命令:PlayFabDemo.exe(如果您的项目可执行文件名称不同,请使用该名称)
- 区域:美国东部
- 备用服务器:1
- 最大服务器:1
- 网络名称:游戏端口
- 网络协议:UDP
**备用** 和 **最大** 设置决定了有多少 VM 可供玩家加入和参与在线会话。一旦达到最大值,玩家就无法加入任何新的在线会话,直到现有会话之一完成并回收服务器。因此,对于已发布的游戏,我们要增加此数字以匹配玩家需求。
更新客户端以使用 PlayFab
在深入研究客户端脚本代码之前,我们需要启用一个用于测试目的的 API 设置。我们单击仪表板上的齿轮图标,进入 **标题设置**,然后导航到 **API 功能** 选项卡。然后我们选择 **允许客户端启动游戏** 复选框并单击 **保存**。此标志仅用于测试目的,不应为公开上线游戏启用。
现在我们回到 Unity 编辑器,在 **IntroMenu** 场景中关闭服务器脚本,并在 **MainScene** 中打开客户端脚本。然后我们双击客户端脚本打开它。
我们在顶部的 using 语句中再添加两个语句。
using PlayFab.MultiplayerModels;
using PlayFab;
让我们添加一些方法,允许我们请求一个构建的 PlayFab 服务器。我们必须确保复制仪表板上生成的 **构建 ID GUID** 来替换函数内的内容,因为此 ID 必须匹配才能成功请求。
private void RequestMultiplayerServer()
{
RequestMultiplayerServerRequest requestData = new RequestMultiplayerServerRequest();
requestData.BuildId = "b461ecbc-12fc-4758-bd27-f3bbd84badeb"; // Build ID from the Multiplayer Dashboard
requestData.PreferredRegions = new List<string>() { "EastUs" };
requestData.SessionId = System.Guid.NewGuid().ToString(); // Generate a Session ID
PlayFabMultiplayerAPI.RequestMultiplayerServer( requestData, OnRequestMultiplayerServer, OnRequestMultiplayerServerError );
}
private void OnRequestMultiplayerServer( RequestMultiplayerServerResponse response )
{
connectToServer( response.IPV4Address, (ushort)response.Ports[ 0 ].Num );
}
private void OnRequestMultiplayerServerError( PlayFabError error )
{
Debug.Log( error.ErrorMessage );
}
最后一步是在 Start
方法中调用 RequestMultiplayerServer
方法,如下所示:
void Start()
{
Debug.Log( "Starting Client" );
if( RunLocal )
{
connectToServer( "127.0.0.1", 7777 );
}
else
{
RequestMultiplayerServer();
}
}
您可以在 GitHub 这里 找到客户端的完整代码。
最后,我们可以构建并打开游戏客户端以连接到 PlayFab 服务器,或者在 Unity 编辑器中加载 **IntroMenu** 并运行它。这是因为服务器请求必须登录才能工作。我们可以在仪表板上看到客户端何时连接,因为一个游戏会话将处于 **活动** 状态。
一旦所有客户端关闭游戏并断开连接,会话就完成了,服务器会在 PlayFab 上自行关闭并回收。
后续步骤
在本篇文章中,我们学习了如何将 PlayFab Game Server SDK 导入 Unity 项目并为多人游戏服务器代码奠定基础,然后如何将项目构建为一个已准备好用于 PlayFab 的仅服务器“无头”可执行文件。我们成功地从我们的游戏客户端请求并连接到了托管在 PlayFab 上的服务器。
在 下一篇文章 中,我们将把 PlayFab 的匹配功能集成到游戏中,以便玩家可以自动匹配,加入同一个服务器并一起玩。
要了解有关 Azure PlayFab 分析的更多信息,并获取功能概述、快速入门指南和教程,请查看 Azure PlayFab 分析文档。