入门

注意: 数字服务法 (DSA) 要求 Unity 在 Unity 采取影响 DSA 下最终用户行动时通知我们的客户的最终用户。为了符合此要求,如果您使用依赖 Unity 身份验证服务的 Unity 游戏服务 (UGS) 产品,您必须集成通知 API。

有关 DSA 的更多信息,请参阅数字服务法 - 合规性更新

要使您的游戏符合规定,请参阅DSA 通知

本指南将引导您完成安装匹配器 SDK、启用匹配器、创建第一个匹配票据和创建游戏服务器托管分配所需的步骤。

先决条件

要开始使用匹配器,您需要执行以下操作

配置您的托管

在启用匹配器之前,您必须初始化游戏服务器托管或中继。参见入门(游戏服务器托管)和入门(中继)。

安装匹配器 SDK

要安装适用于 Unity 的最新匹配器软件包

  1. 在 Unity 编辑器中,导航到 **窗口** > **软件包管理器**。
  2. 从 **软件包管理器** 中,搜索 **com.unity.services.matchmaker** 或滚动浏览 **Unity 注册表** 以查找 **匹配器** 软件包。
  3. 选择软件包,然后单击 **安装**。

有关更多信息,请参见软件包管理器 文档。

设置匹配器

您可以通过Unity 云仪表盘 设置和管理匹配器

  1. 转到cloud.unity.com
  2. 从侧边栏中选择 **产品** 选项卡。
  3. 在 **游戏服务** > **多人游戏** 下,转到 **匹配器** 并选择 **启动**。

首次启动匹配器时,这会将匹配器添加到侧边栏上的 **快捷方式** 部分,并打开 **概述** 页面。

创建队列和池

  1. 选择 **创建队列**。选择第一个队列的名称并设置匹配票据上的最大玩家数量。单击 **创建**。
  2. 选择 **创建池**。选择池的名称。选择在先前步骤中创建的队列。设置票据的超时值。单击 **下一步**。
  3. 选择您的托管类型
  • 如果您使用游戏服务器托管,请先在下拉菜单中选择 **游戏服务器托管**,然后选择配置游戏服务器托管时创建的 **舰队** 和 **构建配置**。
  • 如果您使用中继,请在下拉菜单中选择 **中继**。
  1. 单击 **下一步**。

定义用于定义将票据发送到该队列和池时创建的匹配的规则。选择 **JSON** 并复制/粘贴以下代码块

{
  "Name": "Test",
  "MatchDefinition": {
    "Teams": [
      {
        "Name": "Main team",
        "TeamCount": {
          "Min": 1,
          "Max": 1
        },
        "PlayerCount": {
          "Min": 1,
          "Max": 5
        }
      }
    ],
    "MatchRules": []
  },
  "BackfillEnabled": false
}

这将创建一个拥有至少一名玩家,最多五名玩家的单一团队匹配。

  1. 单击 **逻辑构建器** 并通过从下拉菜单中选择一个区域来设置 **默认 QoS 区域**。
  2. 单击页面底部的 **创建**。

匹配器现在已配置。您可以通过单击 **匹配器** 部分下的菜单中的 **队列** 来查看创建的队列和池。

创建匹配票据

现在匹配器已配置,我们可以创建和发送票据以请求游戏服务器托管分配

Unity SDK

var players = new List<Player>
{
    new Player("Player1", new Dictionary<string, object>())
};


// Set options for matchmaking
var options = new CreateTicketOptions(
  "Default", // The name of the queue defined in the previous step,
  new Dictionary<string, object>());

// Create ticket
var ticketResponse = await MatchmakerService.Instance.CreateTicketAsync(players, options);

// Print the created ticket id
Debug.Log(ticketResponse.Id);

CURL

# Fetch anonymous token
curl -X POST -H "ProjectId: <projectId>" https://player-auth.services.api.unity.com/v1/authentication/anonymous

# Call the create ticket endpoint
curl -X POST -H "Authorization: Bearer <TOKEN>" \
-H 'Content-Type: application/json' \
--data-raw '{
    "queueName": "Default",
    "attributes": {},
    "players": [{
        "id": "Player 1",
        "customData": {}
    }]
}' \
'https://matchmaker.services.api.unity.com/v2/tickets'

REST API

https://services.docs.unity.com/matchmaker/v2/index.html#tag/Tickets/operation/createTicket

轮询票据状态

创建票据后,客户端会轮询以使用创建票据时返回的票据 ID 获取票据的状态。

当票据被分配到匹配并分配服务器时,匹配器会将服务器信息添加到票据状态响应中。

Unity SDK

MultiplayAssignment assignment = null;
bool gotAssignment = false;
do
{
    //Rate limit delay
    await Task.Delay(TimeSpan.FromSeconds(1f));

    // Poll ticket
    var ticketStatus = await MatchmakerService.Instance.GetTicketAsync("<ticket id here>");
    if (ticketStatus == null)
    {
        continue;
    }

    //Convert to platform assignment data (IOneOf conversion)
    if (ticketStatus.Type == typeof(MultiplayAssignment))
    {
        assignment = ticketStatus.Value as MultiplayAssignment;
    }

    switch (assignment?.Status)
    {
        case MultiplayAssignment.StatusOptions.Found:
            gotAssignment = true;
            break;
        case MultiplayAssignment.StatusOptions.InProgress:
            //...
            break;
        case MultiplayAssignment.StatusOptions.Failed:
            gotAssignment = true;
            Debug.LogError("Failed to get ticket status. Error: " + assignment.Message);
            break;
        case MultiplayAssignment.StatusOptions.Timeout:
            gotAssignment = true;
            Debug.LogError("Failed to get ticket status. Ticket timed out.");
            break;
        default:
            throw new InvalidOperationException();
    }

} while (!gotAssignment);

CURL

# Call the poll ticket status endpoint with same anonymous token as for the creation

curl -X GET -H "Authorization: Bearer <TOKEN>" \
--header 'Content-Type: application/json' \
'https://matchmaker.services.api.unity.com/v2/tickets/status?id=<TICKETID>'

REST API

https://services.docs.unity.com/matchmaker/v2/index.html#tag/Tickets/operation/getTicketStatus

匹配结果

在服务器端,当服务器被分配时,可以使用匹配结果 获取有关使用有效负载分配 进行的匹配的信息。

匹配结果为服务器提供有关应该参加比赛的不同玩家的信息,以及他们的数据以及他们在不同团队中的分配情况。

This code only works on the server allocated by Game Server Hosting.

Unity SDK

var payloadAllocation = await MultiplayService.Instance.GetPayloadAllocationFromJsonAs<MatchmakingResults>();

Note: Use the server.json file to get a server’s allocation UUID. [!NOTE] You will need to install the Game Server Hosting SDK to access the matchmaking results

CURL

curl -X GET https://:8086/payload/<allocation_uuid>