无服务器多人游戏

多人游戏是一种流行的游戏机制,允许多个玩家一起互动和玩游戏。本示例演示了如何创建或加入大厅服务游戏大厅,并在简单的竞技场式游戏中进行比赛,玩家在游戏中收集金币以获取积分。

先决条件

要使用此示例用例,您必须下载并安装Unity 项目中的 UGS 用例项目。

概述

在本示例过程中,玩家可以执行以下操作

  • 随机化他们的姓名。
  • 创建供其他人加入的公开和私人大厅。
  • 从公开大厅列表中加入大厅,或通过输入密钥加入私人大厅。
  • 查看大厅中的其他玩家。
  • 发出准备开始游戏的信号。
  • 使用中继服务和游戏对象网络代码 (NGO) 参与多人游戏,以促进玩家移动并收集金币以获取积分。
  • 在游戏结束后查看获胜者、分数和个人最高统计数据等信息。

重要说明: 除非您在不同的设备上测试无服务器多人游戏示例,否则您必须使用屏幕顶部的配置文件切换器下拉菜单将每个实例设置为不同的配置文件。有关解释和更多详细信息,请参阅设置计算机以测试多人游戏

要查看此用例的实际操作,打开示例菜单并导航到无服务器多人游戏。要直接打开此场景并与用例进行交互

  1. 在 Unity 编辑器项目窗口中,选择资产 > 用例示例 > 无服务器多人游戏,然后双击ServerlessMultiplayerGameSample.unity以打开示例场景。
  2. 按下播放以进入播放模式。

初始化

当场景加载时,将执行以下初始化步骤

  1. 将与示例相关的管理器设置为 DontDestroyOnLoad,以便它们可以在示例的所有场景中保持完整。
  2. 初始化亵渎管理器,导致所有有效的玩家姓名和大厅词语被传播到允许列表,以便仅允许的词语将呈现给玩家。
  3. 初始化 UGS,并且玩家已使用正确的配置文件名称登录。
  4. 读取远程配置以配置金币生成、游戏持续时间等。
  5. 显示主菜单,以便玩家可以选择托管或加入游戏,随机化其姓名,更改要使用的 UGS 配置文件名称等。

功能

设置计算机以测试多人游戏

您必须能够播放此示例的多个实例才能测试此用例。

以下是促进多人游戏测试的一些技术

  • 再次克隆存储库(或复制项目文件夹)到另一个文件夹。然后,您可以同时在 Unity 编辑器中打开这两个/所有实例,并在每个实例中进入播放模式以测试示例。
  • 使用ParrelSync克隆项目。这是首选方法,因为对基本项目所做的更改会自动传播到所有克隆以进行测试。请注意,这不是 Unity 产品,因此建议您在使用之前查看文档和许可协议。

重要说明: 在上述任何情况下,请确保每个实例都使用不同的匿名 ID 登录 UGS。通过更改主场景上的配置文件 ID来实现此目的,将其更改为不同的配置文件(场景默认设置为上次使用的配置文件或默认的配置文件-1)。更改此配置文件选择将您登录到不同的身份验证服务配置文件,这模拟了在单个设备上拥有多个帐户。请注意,配置文件切换器仅在主场景中有效;一旦您离开以创建或加入大厅,该选择将被锁定,您无法更改它,直到您返回主场景为止。有关更多详细信息,请参阅管理配置文件

场景

此用例包含多个场景,将示例划分为更小的部分,允许开发人员仅查看他们有兴趣学习的实现。

注意: 始终使用ServerlessMultiplayerGameSample场景开始播放模式,该场景根据需要更改为其他场景。

ServerlessMultiplayerGameSample 场景

示例以ServerlessMultiplayerGameSample场景开始,玩家可以在该场景中选择开始或加入大厅,随机化其玩家姓名,以及如果创建大厅,则随机化大厅姓名,并调整设置参数,例如最大玩家数或公开/私人标志。

玩家将停留在该场景中,直到创建或加入大厅,这两个操作都会导致播放进入大厅场景。

一旦游戏结束或玩家离开大厅场景,他们将返回该场景。如果玩家刚刚完成游戏,结果屏幕将显示结果以及当前玩家的统计数据。关闭结果屏幕会将玩家带回主菜单,以便可以创建/加入另一个大厅以开始新游戏。

大厅场景

ServerlessMultiplayerGameSample场景中创建或加入大厅后,示例将打开大厅场景,该场景将显示当前大厅的内容,并允许玩家发出准备或离开的信号。此外,主持人可以选择从大厅中删除玩家。所有玩家都必须发出准备好的信号,游戏才能开始。

玩家将停留在该场景中,直到所有玩家都准备好(播放进入游戏场景),或者玩家离开大厅并返回ServerlessMultiplayerGameSample场景。

游戏场景

至少有两名玩家加入大厅,并且所有玩家都发出准备好的信号后,游戏场景将启动,此时将立即开始从三秒钟开始的倒计时。完成后,玩家可以移动并收集金币,金币将单独生成或成群生成(基于远程配置配置)。一旦玩家可以移动,游戏计时器就开始倒计时,游戏计时器到期后游戏结束。

当游戏由于游戏计时器到期而结束时,玩家将自动返回ServerlessMultiplayerGameSample场景,游戏结果以及每个玩家的个人统计数据将显示在该场景中。关闭结果屏幕后,主菜单将重新出现(仍在ServerlessMultiplayerGameSample中),并且可以创建或加入另一个大厅。

值得注意的管理器类

此用例有一些值得注意的管理器类,它们促进了示例的不同方面。ProfanityManager类确保用户生成的字符串不包含攻击性语言,而GameManager类处理玩家的请求,控制游戏玩法,并根据游戏事件更新客户端的状态。

亵渎管理器

本示例实施了亵渎管理器,以确保由一名玩家创建但对所有玩家可见的玩家和大厅名称不包含任何攻击性语言。ProfanityManager类使用允许列表来验证客户端从大厅服务接收到的字符串。此验证确保即使一名玩家入侵系统以提交攻击性字符串,任何其他收到该大厅名称或用户名 的玩家也无法看到无效字符串。

请注意,使用允许列表来限制诸如用户名之类的输入可能会受到限制,因为很难使此类列表详尽无遗。在这种情况下,您可以改用阻止列表来过滤掉被认为不合适的特定词语。

您可以在Serverless Multiplayer Game/Scripts/Menu/ProfanityManager.cs中找到ProfanityManager类,而玩家和大厅名称允许列表中包含的字符串分别在Serverless Multiplayer Game/Scripts/Menu/PlayerNameManager.csServerless Multiplayer Game/Scripts/Menu/LobbyNameManager.cs中。如果您想使用重构版本的粗俗词语管理器,请将ProfanityManager.IsValidPlayerNameProfanityManager.IsValidLobbyName方法替换为您自己的实现。

游戏网络管理器

作为一个多人游戏,此示例需要一个游戏网络管理器来促进玩家之间的游戏通信。当Game场景首次加载时,由于场景中存在GameSceneManager,因此游戏网络管理器会在主机上实例化。此游戏网络管理器在其Start()方法中实例化游戏网络管理器。

游戏网络管理器处理以下内容:

  • 启动主机/客户端
  • 为所有玩家创建玩家头像
  • 协调倒计时和游戏计时器
  • 允许玩家在倒计时完成后移动以收集硬币
  • 在需要时与其他管理器通信,例如得分时
  • 通过传播最终得分并等待所有玩家确认接收来协调游戏结束
  • 发出请求,要求所有玩家返回主菜单

如上所述,游戏网络管理器是在运行时实例化的,因此它可以使用NetworkObject.SpawnWithOwnership在主机上正确配置。因此,主机控制游戏网络管理器,所有客户端都可以根据需要与它进行交互以促进游戏玩法。

GameNetworkManager类可以在Serverless Multiplayer Game/Scripts/Game/GameNetworkManager.cs中找到。

设置

要求

要复制此用例,您需要在项目中包含以下Unity 包

角色
身份验证以匿名方式自动登录用户,以跟踪他们在服务器端的数据。此示例还使用身份验证服务切换配置文件以模拟不同的玩家,以促进多人测试。
云保存存储玩家的姓名、获胜/游戏次数和最高得分。
部署提供一个连贯的界面来部署云服务的资产。
大厅处理创建或加入大厅,以便玩家可以聚集在一起开始游戏。大厅还存储每个玩家的准备标志,以及中继加入代码,这对于加入中继服务分配以促进实时游戏玩法是必需的。
用于游戏对象的 Netcode生成网络对象,例如玩家头像和硬币,同步移动并在需要时取消生成网络对象。
中继创建/加入多人分配以促进实时游戏玩法,由大厅创建者担任中继服务主机。
远程配置维护游戏设置,例如硬币生成频率、硬币波浪大小、游戏持续时间等。

要在游戏中使用这些服务,请在Unity 云控制台中为您的组织和项目激活每个服务。

云保存

此示例使用云保存来存储每个玩家的终身统计数据,其中包括姓名、获胜次数、总游戏次数和最高得分。请注意,使用不同的配置文件会导致每个配置文件具有独立的 UGS 数据,因此每个玩家都会看到不同的统计数据。

以下是一个玩家的云保存数据的示例

{
    "playerName": "Erika",
    "highScores": [33, 27, 17],
    "winCount": 14,
    "gameCount": 15
}

Unity 云服务配置

要在您自己的 Unity 项目中复制此示例场景的设置,请配置以下项目

  • 远程配置值

要配置这些项目,您可以使用部署包,或使用 Unity 云控制台手动输入它们。推荐的最佳实践是使用部署包,因为它可以极大地加快此过程。

使用部署包

要使用部署包部署配置,请执行以下操作

  1. 打开部署窗口.
  2. 选中Serverless Multiplayer Game
  3. 单击部署选择

这将部署所有必要的项目。

使用 Unity 云控制台

您可以使用Unity 云控制台通过项目和环境手动配置您的服务。请参考以下部分来配置此示例。

远程配置

在 Unity 云控制台中设置以下配置值

类型描述
MULTIPLAYER_GAME_SETTINGSJSON基于游戏中的玩家数量,所有可能游戏的游戏设置列表。
{
    "playerOptions": [{
        "players": 2,
        "gameDuration": 16,
        "initialSpawnDelay": 1,
        "spawnInterval": 6,
        "destroyInterval": 7,
        "cluster1": 1,
        "cluster2": 1,
        "cluster3": 0
    }, {
        "players": 3,
        "gameDuration": 60,
        "initialSpawnDelay": 2,
        "spawnInterval": 5,
        "destroyInterval": 5.5,
        "cluster1": 1,
        "cluster2": 1,
        "cluster3": 1
    }, {
        "players": 4,
        "gameDuration": 60,
        "initialSpawnDelay": 3,
        "spawnInterval": 4,
        "destroyInterval": 4.5,
        "cluster1": 1,
        "cluster2": 2,
        "cluster3": 1
    }]
}

有关上述配置值中字段的更多信息

字段描述
players指定配置中的玩家数量。有效值为 2、3 和 4,并且必须有 1 个来为每个玩家计数指定游戏配置。
gameDuration游戏时长(秒)。所有游戏目前持续 60 秒,但这些值可以更改为具有更多玩家的更长游戏。
initialSpawnDelay等待多长时间才能生成第一组硬币。这允许玩家在初始硬币波出现之前进行定位。
destroyInterval硬币在消失之前保留在游戏中多长时间。这增加了紧迫性,因为硬币会消失,要求玩家赶快及时捕获它们。
spawnInterval在一波硬币生成后,等待多长时间才能生成下一波硬币。硬币以波浪形式生成,因此玩家有多种硬币选择以尝试收集。
cluster1每波应该生成多少个单硬币集群(即单个硬币)。通常只有一个单硬币集群,因此没有更好选择的玩家至少可以尝试获取单个硬币。
cluster2每波应该生成多少个双硬币集群(即硬币对)。通常至少有一个双硬币集群,因此其中一个玩家有机会获得两分,而另一个玩家只获得一分。
cluster3每波生成多少个三硬币集群。双人游戏不需要三硬币集群,但更多玩家的游戏可以添加三硬币集群。