> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 跨网络多人游戏实现示例

> MOBA 风格 XBOX 游戏的跨网络多人游戏实现示例,涵盖匹配、专用服务器、聊天和 XR-007 合规性。

本主题介绍一个示例场景,演示传统多人在线战斗竞技场 (MOBA) 游戏中的跨网络功能和流程。它介绍了一种可能的设计和实现路径。本主题支持 [XR-007: 跨网络游戏、数据使用和伴侣应用交互](https://developer.microsoft.com/en-us/games/xbox/docs/gdk/xr007)。

在此示例场景中,游戏支持以下多人游戏功能。

| 功能        | 说明                                                         |
| --------- | ---------------------------------------------------------- |
| 自定义匹配     | 游戏实现了自定义匹配服务。此服务首先(可选)将玩家匹配到队伍中,然后将队伍和玩家匹配到一起。             |
| 专用服务器     | 该游戏的所有游戏运行在专用服务器上。所有流量(包括聊天流量)也通过这些服务器路由。                  |
| 自定义排行榜    | 游戏服务实现自定义排行榜,其中包含有关玩家进度的详细信息。                              |
| 多种游戏模式和设置 | 游戏支持多种游戏模式,例如合作模式与团队模式。玩家可以为这些模式配置地图、游戏规模、规则和其他设置。         |
| 游戏内货币     | 游戏提供带有可购买(高级)游戏内货币的游戏内商店。玩家可以使用该货币为团队购买增益。玩家还可以为角色购买装饰性物品。 |
| DLC       | 可购买的可下载内容 (DLC) 包括新地图和额外角色。                                |

## 游戏服务

在此示例场景中,自定义游戏服务之一是身份验证服务。此身份验证服务用于将 XBOX Live(或其他多人网络)账户与特定于游戏的玩家账户进行账户链接。当玩家首次连接到身份验证服务时,账户链接会静默执行,并创建新的跨网络玩家身份。

对于 XBOX Live,玩家的 XUID 用作链接到特定于游戏的账户的唯一玩家标识符。使用 XUID 访问必须事先经过批准,并且必须与开发者账户经理 (DAM) 讨论。特定于游戏的账户具有全局唯一标识符 (GUID),使所有游戏服务能够处理玩家,无论其网络来源和存储的玩家元数据如何。在此示例场景中,多人网络和基本游戏玩家统计信息存储在此账户中。

<Note>游戏服务在特定于游戏的账户中使用多人网络信息以确保仅可将多人游戏功能限制为 XBOX Live 玩家。</Note>

## 游戏流程

对于典型的多人游戏,跨网络功能的合规流程从玩家进入多人游戏模式开始。在此示例场景中,游戏采取以下步骤。

1. 验证特权。

   在开始多人会话之前,游戏验证多人游戏特权(254 和 189)。如果特权被拒绝,则游戏不进入多人游戏模式。游戏还应检查通信特权 (252),并相应地结束或禁用语音和文本聊天。

2. 验证跨网络特权。

   对于此示例场景,游戏将跨网络游戏集成到默认匹配体验中。当玩家进入匹配体验时,游戏验证跨网络游戏特权 (185)。如果特权被拒绝,则只能在 XBOX Live 内进行匹配。玩家首次进入跨网络游戏时,游戏会显示跨网络游戏处于活动状态的通知。

3. 团队匹配。

   游戏匹配服务根据匹配规则从跨网络玩家中组建团队。

4. 创建并加入团队或大厅多人会话目录 (MPSD) 会话。

   游戏匹配服务通过对 XBOX Live 的服务到服务调用创建多人会话目录 (MPSD) 大厅会话。所有 XBOX Live 玩家加入此大厅会话。服务使用自定义属性额外提供有关会话中不使用 XBOX Live 的玩家的提示。这些提示可供客户端逻辑在下一步设置会话状态时使用。

5. 设置团队或大厅 MPSD 会话。

   XBOX Live 客户端将大厅会话设置为活动会话。会话可加入性和关闭状态必须根据跨网络玩家状态相应设置。XBOX Live 玩家只要留在跨网络团队中,就会保留在此会话中。如果会话已满(或稍后在流程中变满),服务或大厅仲裁者必须将会话设置为关闭。没有更多玩家位置的活动会话绝不能是可加入的。

6. 团队大厅。

   在团队大厅中,XBOX Live 玩家和来自其他多人平台的玩家都存在。通过自定义游戏服务在 XBOX Live 玩家之间启用语音聊天。只有在验证所有必需的隐私和权限检查后,才允许所有玩家(XBOX Live/XBOX Live 和 XBOX Live/不使用 XBOX Live 的玩家)之间的语音聊天。对于不使用 XBOX Live 的好友关系,游戏使用不使用 XBOX Live 的好友的网络好友关系数据。在团队大厅中,XBOX Live 玩家和不使用 XBOX Live 的玩家由游戏账户身份唯一标识。所有玩家标识符也显示玩家标签和其他多人网络的等效玩家名称。

   以下屏幕截图显示了大厅中玩家名册 UI 的示例。

   <img src="https://mintcdn.com/microsoft-4404708b/ktEik-YaZoen6Rhy/images/gdk/services/xr007-crossnetworkroster.png?fit=max&auto=format&n=ktEik-YaZoen6Rhy&q=85&s=19bdb24b8a41f698f6e8f56083dbac61" alt="显示跨网络名册 UI 的屏幕截图" width="482" height="678" data-path="images/gdk/services/xr007-crossnetworkroster.png" />

   在大厅 UI 中,团队队长为下一步选择比赛属性(例如等级或自定义规则),以找到与另一支团队的游戏会话,然后开始比赛。

7. 游戏会话匹配。

   使用团队队长设置的额外比赛属性将现有跨网络团队提交给匹配。这些属性用于在新的两支比赛团队集中识别最佳比赛结果。此时,比赛服务还为两支团队识别专用服务器。

8. 创建并加入游戏 MPSD 会话。

   匿名游戏会话匹配的结果是由比赛服务(或专用服务)通过对 XBOX Live 的服务到服务调用创建的 MPSD 游戏会话。所有 XBOX Live 玩家加入此游戏会话,服务使用自定义属性额外提供有关会话中不使用 XBOX Live 的玩家的提示。这些提示可供客户端逻辑在设置会话状态时使用。

9. 连接到专用服务器。

   在最后一步中,所有客户端安全连接到专用服务器并启动跨网络游戏。多人网络之间的所有流量必须通过专用服务器路由。不允许对等连接。

10. 完成游戏。

    游戏比赛完成后,团队可以选择执行下表所示的操作。

    | 操作     | 说明                                                |
    | ------ | ------------------------------------------------- |
    | 重播比赛   | 玩家保持连接到服务器并保留在 MPSD 游戏会话中。玩家开始新的游戏比赛。             |
    | 搜索新对手。 | 玩家从服务器断开连接并离开 MPSD 游戏会话。玩家保留在大厅会话中并返回大厅屏幕进行下一轮匹配。 |

## 会话管理

为了遵守所有 XBOX 要求,游戏为 XBOX Live 玩家创建两个 MPSD 会话,如下表所示。

| 会话   | 说明                                                                                                                                                    |
| ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| 大厅会话 | 此会话由匹配服务通过对 XBOX Live 的服务到服务调用创建。创建时,会话包含团队中所有 XBOX Live 玩家的预留。这是玩家可以为其发送邀请或进行中加入的会话。邀请和进行中加入必须使用 XBOX Live 系统,且不能跨网络。因此,所有 XBOX Live 玩家将此会话设置为其活动会话。 |
| 游戏会话 | 此会话由匹配服务通过对 XBOX Live 的服务到服务调用创建。它包含游戏会话中所有 XBOX Live 玩家(跨团队)的预留,用于跟踪 XBOX Live 玩家的多人游戏活动。                                                            |

不使用 XBOX Live 的玩家不直接作为会话成员出现在 MPSD 会话中。游戏仅在自定义会话属性中跟踪其存在,如下面的代码示例所示。

```
{{"name":"kumarplayer"},{"name":"spencerplayer"},{"name":"eliseplayer"}}
```

您可以使用此列表和 XBOX Live 会话成员来确定会话是否已满。如果已满,则必须禁用 XBOX Live 的邀请和进行中加入功能以获得正确行为。玩家(或服务器)在会话上设置 `closed` 属性以禁用此功能。

<Note>用于跟踪游戏中玩家的 MPSD 会话必须启用 `gameplay` 功能以遵守 XBOX 要求。</Note>

## 玩家通信屏蔽和举报

游戏中的玩家屏蔽在游戏级别支持。

### XBOX Live 玩家屏蔽

游戏使用 [XblPrivacyBatchCheckPermissionAsync](/reference/live/xsapi-c/privacy_c/functions/xblprivacybatchcheckpermissionasync) 检查多人游戏特权。游戏还用它进行与其他 XBOX Live 玩家的聊天以及不使用 XBOX Live 的玩家类别/不使用 XBOX Live 的好友的聊天。游戏还通过 [XGameUiShowPlayerProfileCardAsync](/reference/system/xgameui/functions/xgameuishowplayerprofilecardasync) 提供对其他玩家个人资料的访问。玩家可以在玩家个人资料 UI 中屏蔽其他玩家。

### 屏蔽不使用 XBOX Live 的玩家

游戏使用游戏内屏蔽列表来支持屏蔽与不使用 XBOX Live 的玩家的通信。此列表在游戏服务上维护,并针对多人游戏权限进行检查。默认情况下不提供跨网络聊天。可以通过自定义游戏 UI 在游戏中屏蔽不使用 XBOX Live 的玩家,如下面的屏幕截图所示。

<img src="https://mintcdn.com/microsoft-4404708b/ktEik-YaZoen6Rhy/images/gdk/services/xr007-playercommblocking.png?fit=max&auto=format&n=ktEik-YaZoen6Rhy&q=85&s=a3e844b13d36e45906f7bbcb807d355c" alt="显示玩家通信屏蔽的屏幕截图" width="1300" height="731" data-path="images/gdk/services/xr007-playercommblocking.png" />

### XBOX Live 玩家举报

游戏还允许举报玩家。对于 XBOX Live,玩家通过玩家个人资料 UI 举报其他玩家。XBOX Live 强制执行处理玩家举报。

### 举报不使用 XBOX Live 的玩家

对于不使用 XBOX Live 的玩家,游戏提供自定义举报 UI 流程。游戏相应地处理游戏的玩家举报,并根据其他多人网络的准则处理。

## Microsoft Store

XBOX Live 和其他多人网络上游戏内货币的购买在游戏服务上跟踪。游戏在所有游戏版本之间提供共享的虚拟货币钱包和游戏内物品库存。下表中的限制适用于非 XBOX Live 的游戏版本。

| 限制    | 说明                                                                                                                              |
| ----- | ------------------------------------------------------------------------------------------------------------------------------- |
| 玩家皮肤  | 玩家只能通过游戏内货币购买玩家皮肤。游戏内货币在跨所有网络可用的统一游戏内钱包中管理。所有玩家皮肤在所有游戏版本中相同。                                                                    |
| 消耗品   | 玩家只能通过游戏内货币购买消耗品。与货币一样,消耗品物品在统一的游戏内库存中管理。                                                                                       |
| 可下载内容 | 在 XBOX Live 平台上,可下载内容(新地图和角色类型)通过 Microsoft Store 管理。其他商店的权利不共享。所有玩家需要在各自商店中拥有有效的权利才能在同一张地图上一起游玩。对于没有匹配权利的玩家,可以看到但无法游玩未购买的角色类型。 |

## 成就

游戏具有基于多人游戏动作的多个成就,包括已进行的多人游戏。此(和类似)成就的成就进度包括跨网络多人游戏会话。游戏没有任何仅限于跨网络游戏的成就。XBOX One 家族(或更高版本)游戏成就的成就进度可通过在其他游戏版本上进行游戏来实现。

## 玩家进度

玩家进度在所有游戏版本之间共享。自定义游戏账户保存部分玩家进度。

## Game DVR 和广播

游戏支持在跨网络多人游戏比赛中使用 Game DVR、屏幕截图以及广播。

## 排行榜

游戏的排行榜通过一个游戏服务实现,该服务提供超出 XBOX Live 排行榜的广泛排行榜功能。该服务创建多个底层排行榜并并行更新它们:每个多人网络一个排行榜,以及一个合并的排行榜,其中合并了所有多人网络的结果。当启用跨网络多人游戏时,显示合并的排行榜,如下面的屏幕截图所示。

<img src="https://mintcdn.com/microsoft-4404708b/ktEik-YaZoen6Rhy/images/gdk/services/xr007-leaderboard.png?fit=max&auto=format&n=ktEik-YaZoen6Rhy&q=85&s=eeecf23c0122c9a89fdd62c4762cc375" alt="显示合并排行榜的屏幕截图" width="536" height="350" data-path="images/gdk/services/xr007-leaderboard.png" />

<Note>所有玩家的显示方式与多人大厅中相同。</Note>

当玩家禁用跨网络游戏功能时,仅显示 XBOX Live 的排行榜。

在排行榜服务上,使用特定于游戏的账户在内部标识所有玩家。XBOX Live 玩家的外部标识符取决于查询的游戏实例。

* 在 XBOX Live 游戏实例上,返回 XUID,然后客户端执行查找以确定玩家的玩家标签字符串。

* 在非 XBOX Live 的游戏实例中,返回玩家的玩家标签或 `DisplayName` 字符串。服务通过对 XBOX Live 的服务到服务调用检索此字符串,并将其缓存最多四小时。


## Related topics

- [跨网络多人游戏实现示例:MMO](/zh-CN/services/xbox-services/multiplayer/concepts/live-console-xr007-mmo-example.md)
- [XR-007 跨网络游戏、数据使用和配套应用](/zh-CN/publishing/certification/xr/xr-007.md)
- [XR-007 跨网络游戏 — 多人游戏实现](/zh-CN/publishing/certification/xr/xr-007-multiplayer.md)
- [XR-007 跨网络游戏 — MMO 实现示例](/zh-CN/publishing/certification/xr/xr-007-mmo.md)
- [多人游戏概念](/zh-CN/services/xbox-services/multiplayer/concepts/live-multiplayer-concepts-nav.md)
