匹配 #

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

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

服务器端设置 #

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

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

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

这些都是玩家无法更改的服务器设置。 为了配置这些选项,我们创建配置文件

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

local.yml

1
2
3
4
matchmaker:
  max_tickets: 2
  interval_sec: 15
  max_intervals: 3

有关服务器配置其他部分的参数及其默认值的完整列表,请参阅文档

请求比赛 #

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

1
2
3
4
5
6
_ticket = await _connection.Socket.AddMatchmakerAsync(
    query: "*",
    minCount: 2,
    maxCount: 2,
    stringProperties: null,
    numericProperties: null);

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

stringPropertiesnumericProperties可用于存储用户数据(例如名称、地区或排名),以与匹配程序一起使用。在本例中,我们没有偏好,所以可以不改变此null

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

1
await _connection.Socket.RemoveMatchmakerAsync(_ticket);

加入比赛 #

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

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

1
2
3
4
5
6
7
8
9
_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 挂钩,在服务器找到对手时会自动触发。

下一主题 #

实时多人游戏

Related Pages