# 匹配

**URL:** https://heroiclabs.com/docs/zh/nakama/tutorials/unity/pirate-panic/matchmaking/
**Summary:** 学习如何在Pirate Panic教程游戏中添加匹配功能。

---


# 匹配

许多多人游戏的一个主要特点是能够发现并对抗随机对手。

由于Nakama知道其他在线玩家，所以最好在此安排玩家之间的比赛。Nakama[匹配](../../../../concepts/multiplayer/matchmaker/)功能简化了比赛的创建与管理，因此您无需自己构建架构。

## 服务器端设置

Nakama通过轮询玩家从客户端提交的门票来处理服务器端的匹配。这些门票通常包含玩家和他们正在寻找的比赛类型的信息。

首先，我们在服务器上设置匹配设置，以便可以接受传入的门票。关于服务器如何处理比赛请求，有三个选项可以更改：

- `max_tickets`：限制玩家（或组）一次可提交的门票总数
- `interval_sec`：更改每次尝试形成新比赛之间的时间（秒）。间隔越短意味着等待时间越短，可能需要更多的服务器资源来处理请求
- `max_intervals`：设置在使用最小玩家限制之前尝试最大玩家限制的次数

这些都是玩家无法更改的服务器设置。
为了配置这些选项，我们创建[配置文件](../../../../getting-started/configuration/)。

在Pirate Panic中的配置文件是`local.yml`，但是在您的游戏中，此配置文件可以是您所需的任何内容。在配置文件中，我们为匹配处理程序创建了一个部分：

**local.yml**

```yaml
matchmaker:
  max_tickets: 2
  interval_sec: 15
  max_intervals: 3
```

有关服务器配置其他部分的参数及其默认值的完整列表，请参阅[文档](../../../../getting-started/configuration/#matchmaker/)。

## 请求比赛

现在我们已经设置了服务器来处理请求，可以让玩家创建门票，方法是使用`AddMatchmakerAsync`：

```csharp
_ticket = await _connection.Socket.AddMatchmakerAsync(
    query: "*",
    minCount: 2,
    maxCount: 2,
    stringProperties: null,
    numericProperties: null);
```

这张门票描述了一名玩家在寻找共有两名玩家的任何比赛（`*`通配符查询）。您还可以限制查询以查找具有匹配属性的特定玩家。例如，为仅与欧洲的其他玩家匹配，您可以做出`query = "+region:europe"`。请参阅[匹配程序文档](../../../../concepts/multiplayer/query-syntax/)中的更多示例。

`stringProperties`和`numericProperties`可用于存储用户数据（例如名称、地区或排名），以与匹配程序一起使用。在本例中，我们没有偏好，所以可以不改变此`null`。

为了让玩家可以在未找到比赛时选择取消其匹配，应该在`AddMatchmakerAsync`返回的门票上使用 `RemoveMatchmakerAsync`：

```csharp
await _connection.Socket.RemoveMatchmakerAsync(_ticket);
```

## 加入比赛

提交门票后，服务器将处理匹配并为所有匹配的玩家分配新比赛（如果可以找到）。

然后，我们可以在客户端注册一个回调函数，以便在发生这种情况时运行，该函数可以用于切换场景或为加入比赛做准备：

```csharp
_connection.Socket.ReceivedMatchmakerMatched += OnMatchmakerMatched;
...
private void OnMatchmakerMatched(IMatchmakerMatched matched)
{
    ...
    _connection.Socket.ReceivedMatchmakerMatched -= OnMatchmakerMatched; // Unregister callback function

    SceneManager.LoadScene(GameConfigurationManager.Instance.GameConfiguration.SceneNameBattle); // Switch scene to battle scene
}
```

此处`ReceivedMatchmakerMatched`是一个 [Register 挂钩](../../../../server-framework/introduction/#hooks)，在服务器找到对手时会自动触发。

## 下一主题

[实时多人游戏](../multiplayer/)
