65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Unity 在 Azure PlayFab 上进行多人游戏(第三部分):设置多人服务器(第一部分)

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2022年1月27日

CPOL

3分钟阅读

viewsIcon

6037

downloadIcon

86

如何通过设置和构建 Unity 游戏项目作为后端服务器来为我们的游戏添加功能。

在本系列六篇文章的前两篇文章中,我们已经了解了如何通过 Unity 模板创建一个游戏并将其链接到我们的 Azure PlayFab 帐户,然后添加帐户创建和登录功能。在本文中,我们将通过设置和构建 Unity 游戏项目作为后端服务器来完善我们的游戏。我们将把这个后端与 PlayFab 多人游戏服务一起使用,以便我们可以在云端托管它并进行扩展以满足玩家的需求。

我们将把 PlayFab 游戏服务器 SDK (GSDK) 添加到我们的 Unity 游戏项目中,添加脚本代码以启动和处理服务器事件,例如玩家加入和离开,然后将项目构建为无 GUI 的仅服务器可执行文件。让我们继续使用来自上一篇文章的 Unity 游戏项目,并将其转换为服务器代码,我们的游戏可以连接到该服务器以进行多人游戏比赛。

要求

要按照本指南进行操作,您需要拥有您的免费PlayFab 帐户,并在您的计算机上安装此软件

本文基于来自上一篇指南的 Unity 游戏项目,该项目已配置了 Azure PlayFab。在继续学习本教程之前,您应该阅读本系列的前两篇文章。要查看完整的教程,请查看完整的项目代码

将 PlayFab GSDK 添加到 Unity

Unity GSDK 是 PlayFab 的游戏服务器 SDK。它使我们能够将 Unity 游戏项目变成一个在 PlayFab 的可扩展云实例上运行的多人游戏服务器。每个玩家的游戏实例都可以连接到此服务器以实现多人游戏体验。

首先,下载GSDK 存储库

提取文件并在文件资源管理器中打开 UnityGsdk/Assets/PlayFabSdk 文件夹。

要将 GSDK 导入游戏,请将 MultiplayerAgent 文件夹拖放到您的 Unity 项目的 Assets/PlayFabSDK 文件夹中。此操作将添加代理代码脚本。

我们还需要通过将其添加到设置中来启用构建中的 PlayFab 服务器功能。首先,打开 File > Build Settings 并单击窗口左下角的 Player Settings… 按钮。然后,添加 ENABLE_PLAYFABSERVER_API 作为新的 Scripting Define Symbol 并单击 Apply

创建服务器脚本

您现在可以关闭弹出窗口。接下来,我们将为多人游戏服务器逻辑添加一个脚本。

Assets/Scripts 文件夹下创建一个新的 C# 脚本,我们的新服务器代码将位于其中。命名该文件,然后双击它以在 Visual Studio 中打开。

在代码顶部添加以下 using 语句

using System;
using PlayFab;
using PlayFab.MultiplayerAgent.Model;

接下来,让我们在类中定义一个调试模式的属性和一个用于跟踪已连接玩家的列表

private List<ConnectedPlayer> players;
public bool Debugging = true;

然后,我们根据PlayFab 多人游戏服务器代理示例代码添加多个 PlayFab 服务器事件的处理程序。

IEnumerator ReadyForPlayers()
{
    yield return new WaitForSeconds(.5f);
    PlayFabMultiplayerAgentAPI.ReadyForPlayers();
}

private void OnServerActive()
{
    Debug.Log("Server Started From Agent Activation");
}

private void OnPlayerRemoved(string playfabId)
{
    ConnectedPlayer player =
    players.Find(x => x.PlayerId.Equals(playfabId, StringComparison.OrdinalIgnoreCase));
    players.Remove(player);
    PlayFabMultiplayerAgentAPI.UpdateConnectedPlayers(players);
}

private void OnPlayerAdded(string playfabId)
{
    players.Add(new ConnectedPlayer(playfabId));
    PlayFabMultiplayerAgentAPI.UpdateConnectedPlayers(players);
}

private void OnAgentError(string error)
{
    Debug.Log(error);
}

private void OnShutdown()
{
    Debug.Log("Server is shutting down");
    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());
}

最后,按如下方式更新 Start() 方法以允许服务器启动。

void Start()
{
    players = new List<ConnectedPlayer>();
    PlayFabMultiplayerAgentAPI.Start();
    PlayFabMultiplayerAgentAPI.IsDebugging = Debugging;
    PlayFabMultiplayerAgentAPI.OnMaintenanceCallback += OnMaintenance;
    PlayFabMultiplayerAgentAPI.OnShutDownCallback += OnShutdown;
    PlayFabMultiplayerAgentAPI.OnServerActiveCallback += OnServerActive;
    PlayFabMultiplayerAgentAPI.OnAgentErrorCallback += OnAgentError;

    StartCoroutine(ReadyForPlayers());
}

完整的服务器脚本代码应该如下所示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using PlayFab;
using PlayFab.MultiplayerAgent.Model;

public class Server : MonoBehaviour
{
    private List<ConnectedPlayer> players;
    public bool Debugging = true;

    IEnumerator ReadyForPlayers()
    {
        yield return new WaitForSeconds(.5f);
        PlayFabMultiplayerAgentAPI.ReadyForPlayers();
    }

    private void OnServerActive()
    {
        Debug.Log("Server Started From Agent Activation");
    }

    private void OnPlayerRemoved(string playfabId)
    {
        ConnectedPlayer player =
        players.Find(x => x.PlayerId.Equals(playfabId, StringComparison.OrdinalIgnoreCase));
        players.Remove(player);
        PlayFabMultiplayerAgentAPI.UpdateConnectedPlayers(players);
    }

    private void OnPlayerAdded(string playfabId)
    {
        players.Add(new ConnectedPlayer(playfabId));
        PlayFabMultiplayerAgentAPI.UpdateConnectedPlayers(players);
    }

    private void OnAgentError(string error)
    {
        Debug.Log(error);
    }

    private void OnShutdown()
    {
        Debug.Log("Server is shutting down");
        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());
    }

    // Start is called before the first frame update
    void Start()
    {
        players = new List<ConnectedPlayer>();
        PlayFabMultiplayerAgentAPI.Start();
        PlayFabMultiplayerAgentAPI.IsDebugging = Debugging;
        PlayFabMultiplayerAgentAPI.OnMaintenanceCallback += OnMaintenance;
        PlayFabMultiplayerAgentAPI.OnShutDownCallback += OnShutdown;
        PlayFabMultiplayerAgentAPI.OnServerActiveCallback += OnServerActive;
        PlayFabMultiplayerAgentAPI.OnAgentErrorCallback += OnAgentError;

        StartCoroutine(ReadyForPlayers());
    }

    // Update is called once per frame
    void Update()
    {

    }
}

将项目构建为服务器可执行文件

虽然我们的服务器代码还没有做太多事情,但我们当然不需要它包含游戏客户端拥有的所有图形用户界面 (GUI) 和着色器功能。因此,我们可以将项目构建为无头网络服务器。

我们通过打开 File > Build Settings,启用 Server Build 复选框,然后单击 Build 来执行此操作。此操作会创建一个非图形的、仅服务器的项目版本,我们可以将其上传以在 PlayFab 的虚拟机上运行。

这就是我们多人游戏服务器代码设置的全部内容!

后续步骤

这次,我们学习了如何将 PlayFab 游戏服务器 SDK 导入到 Unity 项目中,并为多人游戏服务器代码奠定了基础。然后,我们将项目构建为仅服务器的无头可执行文件,准备好用于 PlayFab。

请跳到下一篇文章,在那里我们将把这个服务器代码变成简单的服务器端多人游戏操作。然后,我们将通过仪表板将其上传并部署到 PlayFab。

要了解有关 PlayFab 的最新路线图更新的更多信息,请查看PlayFab 路线图 - PlayFab

© . All rights reserved.