适用于 Unity 的亚马逊 GameLift 插件服务器指南 SDK 4.x - Amazon GameLift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

适用于 Unity 的亚马逊 GameLift 插件服务器指南 SDK 4.x

亚马逊 GameLift 提供工具,让您的多人游戏服务器做好在亚马逊上运行的准备 GameLift。Unity GameLift 版的亚马逊插件可以更轻松地将亚马逊 GameLift 集成到您的 Unity 游戏项目中,以及为云托管部署亚马逊 GameLift 资源。使用适用于 Unity 的插件访问亚马逊 GameLift API 并为常见游戏场景部署Amazon CloudFormation模板。

设置好插件后,你可以试用 Amazon GameLift Unity 示例 GitHub。

安装并设置插件

本节介绍如何下载、安装和设置适用于 Unity 的 Amazon GameLift 插件,版本 1.0.0。

先决条件
  • 适用于 Windows 的 Unity 2019.4 LTS、适用于 Windows 的 2020.3 LTS 或适用于 macOS 的 Unity

  • Java 的当前版本

  • .NET 4.x 的当前版本

下载并安装适用于 Unity 的插件
  1. 下载适用于 Unity 的亚马逊 GameLift 插件。您可以在适用于 Unity 的 Amazon GameLift 插件存储库页面上找到最新版本。在最新版本下,选择资产,然后下载 com.amazonaws.gamelift-version.tgz 文件。

  2. 启动 Unity 并选择一个项目。

  3. 在顶部导航栏的窗口下,选择 Package Manager

    “窗口”下的 Unity 菜单,已选择 Package Manager。
  4. Package Manager 选项卡下,选择 +,然后选择从 tarball 添加软件包...

    突出显示了“Package Manager”选项卡中“+”图标下的“从 tarball 添加软件包”。
  5. 选择磁盘上的软件包窗口中,导航到 com.amazonaws.gamelift 文件夹,选择文件 com.amazonaws.gamelift-version.tgz ,然后选择打开

    在“选择磁盘上的软件包”窗口中选择 tarball 文件。
  6. Unity 加载插件后,亚马逊 GameLift将作为新项目出现在 Unity 菜单中。安装和重新编译脚本可能需要几分钟时间。“A mazon GameLift 插件设置” 选项卡会自动打开。

    适用于 Unity 插件设置菜单的亚马逊 GameLift 插件。
  7. 软件开发工具包窗格中,选择使用 .NET 4.x

    配置后,状态将从未配置更改为已配置

在本地测试你的游戏

使用 Amazon L GameLift ocal GameLift 在您的本地设备上运行亚马逊。无需网络连接,即可使用 Amazon L GameLift ocal 在几秒钟内验证代码更改。

配置本地测试

  1. 在 Unity 插件窗口中,选择测试选项卡。

  2. 在 “测试” 窗格中,选择 “下载 Amazon L GameLift ocal”。适用于 Unity 的插件会打开浏览器窗口,并将 GameLift_06_03_2021.zip 文件下载到您的下载文件夹。

    下载内容包括 C# 服务器软件开发工具包、.NET 源文件和与 Unity 兼容的 .NET 组件。

  3. 解压下载的 GameLift_06_03_2021.zip 文件。

  4. 在 “亚马逊 GameLift 插件设置” 窗口中,选择 “亚马逊 GameLift 本地路径”,导航到解压缩的文件夹,选择文件GameLiftLocal.jar,然后选择 “打开”。

    配置后,本地测试状态将从未配置更改为已配置

  5. 验证 JRE 的状态。如果状态为未配置,请选择下载 JRE 并安装推荐的 Java 版本。

    安装和配置 Java 环境后,状态将更改为已配置

运行你的本地游戏

  1. 在“适用于 Unity 的插件”选项卡中,选择测试选项卡。

  2. 测试窗格中,选择打开本地测试 UI

  3. 本地测试窗口中,指定服务器可执行文件路径。选择...选择服务器应用程序的路径和可执行文件名称。

  4. 本地测试窗口中,指定 GL Local 端口

  5. 选择部署并运行以部署和运行服务器。

  6. 要停止游戏服务器,请选择停止或关闭游戏服务器窗口。

部署场景

场景使用Amazon CloudFormation模板来创建为游戏部署云托管解决方案所需的资源。本节介绍了 Amazon GameLift 提供的场景以及如何使用它们。

先决条件

要部署该场景,您需要一个 Amazon GameLift 服务的 IAM 角色。有关如何为 Amazon 创建角色的信息 GameLift,请参阅设置一个 Amazon Web Services 账户

每种场景都需要访问以下资源的权限:

  • Amazon GameLift

  • Amazon S3

  • Amazon CloudFormation

  • API Gateway

  • Amazon Lambda

  • Amazon WAFV2

  • Amazon Cognito

场景

适用于 Unity 的 Amazon GameLift 插件包括以下场景:

仅限身份验证

此场景创建了一个游戏后端服务,该服务在没有游戏服务器功能的情况下执行玩家身份验证。该模板在您的账户中创建以下资源:

  • Amazon Cognito 用户群体,用于存储玩家身份验证信息。

  • Amazon API Gateway REST 端点支持的 Amazon Lambda 处理程序,用于启动游戏并查看游戏连接信息。

单区域实例集

此场景使用单个 Amazon GameLift 队列创建游戏后端服务。其创建了以下资源:

  • Amazon Cognito 用户群体,供玩家进行身份验证和开始游戏。

  • 一个 Amazon Lambda 处理程序,用于搜索实例集上有开放玩家位置的现有游戏会话。如果该处理程序找不到开放位置,就会创建一个新的游戏会话。

带有队列和自定义对战构建器的多区域实例集

此场景通过使用Amazon GameLift 队列和自定义匹配器将等候池中年龄最大的玩家组合在一起来形成匹配项. 其创建了以下资源:

  • 亚马逊简单通知服务主题,亚马逊向其 GameLift 发布消息。有关 SNS 主题和通知的更多信息,请参阅 请参阅设置游戏会话置放通知。

  • 一个 Lambda 函数,由传达位置和游戏连接详情的消息调用。

  • Amazon DynamoDB 表,用于存储位置和游戏连接详情。GetGameConnection 调用从此表读取并将连接信息返回到游戏客户端。

带有队列和自定义对战构建器的竞价型实例集

此场景使用Amazon GameLift 队列和自定义匹配器形成匹配项,并配置三个队列。其创建了以下资源:

  • 两个竞价型实例集包含不同的实例类型,可确保竞价型实例不可用性更持久。

  • 一种按需型实例集,可作为其他竞价型实例集的备份。有关实例集设计的更多信息,请参阅Amazon GameLift 实例集设计指南

  • Amazon GameLift 队列,用于保持高服务器可用性和低成本。有关队列的更多信息和最佳实操,请参阅设计游戏会话队列

FlexMatch

此场景使用 FlexMatch托管配对服务将玩家配对在一起。有关更多信息 FlexMatch,请参阅什么是亚马逊 GameLift FlexMatch。此场景创建了以下资源:

  • 一个 Lambda 函数,用于在收到 StartGame 请求后创建对战票证。

  • 一个单独的 Lambda 函数,用于监听 FlexMatch 匹配事件。

为避免您的 Amazon Web Services 账户产生不必要的费用,请在使用完每个场景创建的资源后将其删除。同时删除相应的 Amazon CloudFormation 堆栈。

更新Amazon凭证

适用于 Unity 的 Amazon GameLift 插件需要安全证书才能部署场景。您可以创建新凭证或使用现有凭证。

有关配置凭证的更多信息,请参阅了解和获取您的 Amazon 凭证

更新 Amazon 凭证
  1. 在 Unity 的“适用于 Unity 的插件”选项卡中,选择部署选项卡。

  2. 部署窗格中,选择 Amazon 凭证

  3. 您可以创建新 Amazon Web Services 凭证或选择现有凭证。

    • 要创建凭证,请选择创建新的凭证配置文件,然后指定新配置文件名称Amazon 访问密钥 IDAmazon 密钥Amazon Web Services 区域

    • 要选择现有凭证,请选择选择现有凭证配置文件,然后选择配置文件名称和 Amazon Web Services 区域

  4. 更新 Amazon 凭证窗口中,选择更新凭证配置文件

更新账号引导

引导位置是部署期间使用的 Amazon S3 存储桶。它用于存储游戏服务器资产和其他依赖项。您为存储桶选择的 Amazon Web Services 区域必须与用于场景部署的区域相同。

有关 Amazon S3 存储桶的更多信息,请参阅创建、配置和使用 Amazon Simple Storage Service 存储桶

更新账户引导位置
  1. 在 Unity 的“适用于 Unity 的插件”选项卡中,选择部署选项卡。

  2. 部署窗格中,选择更新账户引导

  3. 账户引导窗口中,您可以选择现有 Amazon S3 存储桶或创建一个新的 Amazon S3 存储桶:

    • 要选择现有存储桶,请选择选择现有 Amazon S3 存储桶,然后选择更新以保存您的选择。

    • 选择创建新的 Amazon S3 存储桶以创建新的 Amazon Simple Storage Service 存储桶,然后选择策略。该策略指定了 Amazon S3 存储桶的过期时间。选择创建以创建存储桶。

部署游戏场景

您可以使用场景在 Amazon 上测试您的游戏 GameLift。每个场景都使用 Amazon CloudFormation 模板创建一个包含所需资源的堆栈。大多数场景都需要游戏服务器可执行文件和构建路径。部署场景时,作为部署的一部分,Amazon 会将游戏资产 GameLift复制到引导位置。

您必须配置 Amazon 凭证和 Amazon 账户引导才能部署场景。

部署场景
  1. 在 Unity 的“适用于 Unity 的插件”选项卡中,选择部署选项卡。

  2. 部署窗格中,选择打开部署 UI

  3. 部署窗口中,选择一个场景。

  4. 输入游戏名称。此名称必须唯一。部署场景时,游戏名称是 Amazon CloudFormation 堆栈名称的一部分。

  5. 选择游戏服务器构建文件夹路径。构建文件夹路径指向包含服务器可执行文件和依赖项的文件夹。

  6. 选择游戏服务器构建 .exe 文件路径。构建可执行文件路径指向游戏服务器可执行文件。

  7. 选择开始部署以开始部署场景。您可以在部署窗口的当前状态下关注更新状态。部署场景最多可能需要 30 分钟。

    场景部署状态更新
  8. 场景完成部署后,当前状态将更新为包括 Cognito 客户端 IDAPI Gateway 端点,您可以将其复制并粘贴到游戏中。

    场景部署状态更新
  9. 要更新游戏设置,请在 Unity 菜单上选择转到客户端连接设置。这会在 Unity 屏幕的右侧显示 Inspector 选项卡。

  10. 取消选择本地测试模式

  11. 输入 API Gateway 端点Coginito 客户端 ID。选择与场景部署相同的 Amazon Web Services 区域。然后,您可以使用已部署的场景资源重建并运行游戏客户端。

删除场景创建的资源

要删除为该场景创建的资源,请删除相应的 Amazon CloudFormation 堆栈。

删除由场景创建的资源
  1. 在 Unity 部署的 Amazon GameLift 插件窗口中,选择查看Amazon CloudFormation控制台以打开Amazon CloudFormation控制台。

  2. 在 Amazon CloudFormation 控制台中,选择堆栈,然后选择包含部署期间指定的游戏名称的堆栈。

  3. 要删除该堆栈,请选择删除。删除堆栈可能需要几分钟时间。Amazon CloudFormation 删除场景使用的堆栈后,其状态将更改为 ROLLBACK_COMPLETE

GameLift 在 Unity 中将游戏与亚马逊集成

完成以下任务,将您 GameLift 的 Unity 游戏与 Amazon 集成:

下图显示了集成游戏的示例流程。在图中,带有游戏服务器的舰队已部署到Amazon GameLift。游戏客户端与游戏服务器通信,游戏服务器与 Amazon 通信。 GameLift

将 Unity 与亚马逊集成的架构图 GameLift。

导入并运行示例游戏

适用于 Unity 的亚马逊 GameLift 插件包含一个示例游戏,你可以用它来探索将游戏与亚马逊集成的基础知识 GameLift。在本节中,您将构建游戏客户端和游戏服务器,然后使用 Amazon L GameLift ocal 在本地进行测试。

先决条件

构建并运行示例游戏服务器

设置示例游戏的游戏服务器文件。

  1. 在 Unity 中,在菜单上选择 Amazon GameLift,然后选择导入示例游戏

  2. 导入示例游戏窗口中,选择导入以导入游戏、其资产和依赖项。

  3. 构建游戏服务器。在 Unity 中,在菜单上选择亚马逊 GameLift,然后选择应用 Windows 示例服务器版本设置应用 macOS 示例服务器版本设置。配置游戏服务器设置后,Unity 会重新编译资产。

  4. 在 Unity 中,在菜单上选择文件,然后选择构建。选择服务器构建,选择构建,然后选择专门存放服务器文件的构建文件夹。

    Unity 构建示例游戏服务器,将可执行文件和所需资产放在指定的构建文件夹中。

构建并运行示例游戏客户端

设置示例游戏的游戏客户端文件。

  1. 在 Unity 中,在菜单上选择亚马逊 GameLift,然后选择应用 Windows 示例客户端版本设置应用 macOS 示例客户端版本设置。配置游戏客户端设置后,Unity 将重新编译资产。

  2. 在 Unity 中,在菜单上选择转到客户端设置。这将在 Unity 屏幕的右侧显示 Inspector 选项卡。在 Amazon GameLift 客户端设置选项卡中,选择本地测试模式

  3. 构建游戏客户端。在 Unity 中,在菜单上文件。确认未选中服务器构建,选择构建,然后选择专门存放客户端文件的构建文件夹。

    Unity 构建示例游戏客户端,将可执行文件和所需资产放在指定的客户端构建文件夹中。

  4. 您尚未构建游戏服务器和客户端。在接下来的步骤中,您将运行游戏并查看它如何与Amazon GameLift 互动。

在本地测试示例游戏

使用 Amazon L GameLift ocal 运行您导入的示例游戏。

  1. 启动游戏服务器。在 Unity 的“适用于 Unity 的插件”选项卡中,选择部署选项卡。

  2. 测试窗格中,选择打开本地测试 UI

  3. 本地测试窗口中,指定游戏服务器 .exe 文件路径。路径必须包含可执行文件名称。例如,C:/MyGame/GameServer/MyGameServer.exe

  4. 选择部署并运行。Unity 插件启动游戏服务器并打开 Amazon GameLift 本地日志窗口。窗口包含日志消息,包括游戏服务器和 Amazon L GameLift ocal 之间发送的消息。

  5. 启动游戏客户端。使用示例游戏客户端找到构建位置并选择可执行文件。

  6. Amazon GameLift 示例游戏中,提供电子邮件和密码,然后选择 “登录”。电子邮件和密码未经过验证或使用。

  7. Amazon GameLift 示例游戏中,选择 “开始”。游戏客户端会寻找游戏会话。如果找不到会话,便会自行创建。然后,游戏客户端开始游戏会话。可以在日志中看到游戏活动。

... 2021-09-15T19:55:3495 PID:20728 Log :) GAMELIFT AWAKE 2021-09-15T19:55:3512 PID:20728 Log :) I AM SERVER 2021-09-15T19:55:3514 PID:20728 Log :) GAMELIFT StartServer at port 33430. 2021-09-15T19:55:3514 PID:20728 Log :) SDK VERSION: 4.0.2 2021-09-15T19:55:3556 PID:20728 Log :) SERVER IS IN A GAMELIFT FLEET 2021-09-15T19:55:3577 PID:20728 Log :) PROCESSREADY SUCCESS. 2021-09-15T19:55:3577 PID:20728 Log :) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY) ... 2021-09-15T19:55:3634 PID:20728 Log :) GAMELOGIC AWAKE 2021-09-15T19:55:3635 PID:20728 Log :) GAMELOGIC START 2021-09-15T19:55:3636 PID:20728 Log :) LISTENING ON PORT 33430 2021-09-15T19:55:3636 PID:20728 Log SERVER: Frame: 0 HELLO WORLD! ... 2021-09-15T19:56:2464 PID:20728 Log :) GAMELIFT SESSION REQUESTED 2021-09-15T19:56:2468 PID:20728 Log :) GAME SESSION ACTIVATED 2021-09-15T19:56:3578 PID:20728 Log :) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY) 2021-09-15T19:57:3584 PID:20728 Log :) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY) 2021-09-15T19:58:0334 PID:20728 Log SERVER: Frame: 8695 Connection accepted: playerIdx 0 joined 2021-09-15T19:58:0335 PID:20728 Log SERVER: Frame: 8696 Connection accepted: playerIdx 1 joined 2021-09-15T19:58:0338 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from playerIdx 0 Msg: CONNECT: server IP localhost 2021-09-15T19:58:0338 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from player 0:CONNECT: server IP localhost 2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 CONNECT: player index 0 2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from playerIdx 1 Msg: CONNECT: server IP localhost 2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from player 1:CONNECT: server IP localhost 2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 CONNECT: player index 1
12:55:26,000 INFO || - [SocketIOServer] main - Session store / pubsub factory used: MemoryStoreFactory (local session store only) 12:55:28,092 WARN || - [ServerBootstrap] main - Unknown channel option 'SO_LINGER' for channel '[id: 0xe23d0a14]' 12:55:28,101 INFO || - [SocketIOServer] nioEventLoopGroup-2-1 - SocketIO server started at port: 5757 12:55:28,101 INFO || - [SDKConnection] main - GameLift SDK server (communicates with your game server) has started on http://localhost:5757 12:55:28,120 INFO || - [SdkWebSocketServer] WebSocketSelector-20 - WebSocket Server started on address localhost/127.0.0.1:5759 12:55:28,166 INFO || - [StandAloneServer] main - GameLift Client server (listens for GameLift client APIs) has started on http://localhost:8080 12:55:28,179 INFO || - [StandAloneServer] main - GameLift server sdk http listener has started on http://localhost:5758 12:55:35,453 INFO || - [SdkWebSocketServer] WebSocketWorker-12 - onOpen socket: /?pID=20728&sdkVersion=4.0.2&sdkLanguage=CSharp and handshake /?pID=20728&sdkVersion=4.0.2&sdkLanguage=CSharp 12:55:35,551 INFO || - [HostProcessManager] WebSocketWorker-12 - client connected with pID 20728 12:55:35,718 INFO || - [GameLiftSdkHttpHandler] GameLiftSdkHttpHandler-thread-0 - GameLift API to use: ProcessReady for pId 20728 12:55:35,718 INFO || - [ProcessReadyHandler] GameLiftSdkHttpHandler-thread-0 - Received API call for processReady from 20728 12:55:35,738 INFO || - [ProcessReadyHandler] GameLiftSdkHttpHandler-thread-0 - onProcessReady data: port: 33430 12:55:35,739 INFO || - [HostProcessManager] GameLiftSdkHttpHandler-thread-0 - Registered new process with pId 20728 12:55:35,789 INFO || - [GameLiftSdkHttpHandler] GameLiftSdkHttpHandler-thread-0 - GameLift API to use: ReportHealth for pId 20728 12:55:35,790 INFO || - [ReportHealthHandler] GameLiftSdkHttpHandler-thread-0 - Received API call for ReportHealth from 20728 12:55:35,794 INFO || - [ReportHealthHandler] GameLiftSdkHttpHandler-thread-0 - ReportHealth data: healthStatus: true 12:56:24,098 INFO || - [GameLiftHttpHandler] Thread-12 - API to use: GameLift.DescribeGameSessions 12:56:24,119 INFO || - [DescribeGameSessionsDispatcher] Thread-12 - Received API call to describe game sessions with input: {"FleetId":"fleet-123"} 12:56:24,241 INFO || - [GameLiftHttpHandler] Thread-12 - API to use: GameLift.CreateGameSession 12:56:24,242 INFO || - [CreateGameSessionDispatcher] Thread-12 - Received API call to create game session with input: {"FleetId":"fleet-123","MaximumPlayerSessionCount":4} 12:56:24,265 INFO || - [HostProcessManager] Thread-12 - Reserved process: 20728 for gameSession: arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d 12:56:24,266 INFO || - [WebSocketInvoker] Thread-12 - StartGameSessionRequest: gameSessionId=arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d, fleetId=fleet-123, gameSessionName=null, maxPlayers=4, properties=[], ipAddress=127.0.0.1, port=33430, gameSessionData?=false, matchmakerData?=false, dnsName=localhost 12:56:24,564 INFO || - [CreateGameSessionDispatcher] Thread-12 - GameSession with id: arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d created 12:56:24,585 INFO || - [GameLiftHttpHandler] Thread-12 - API to use: GameLift.DescribeGameSessions 12:56:24,585 INFO || - [DescribeGameSessionsDispatcher] Thread-12 - Received API call to describe game sessions with input: {"FleetId":"fleet-123"} 12:56:24,660 INFO || - [GameLiftSdkHttpHandler] GameLiftSdkHttpHandler-thread-0 - GameLift API to use: GameSessionActivate for pId 20728 12:56:24,661 INFO || - [GameSessionActivateHandler] GameLiftSdkHttpHandler-thread-0 - Received API call for GameSessionActivate from 20728 12:56:24,678 INFO || - [GameSessionActivateHandler] GameLiftSdkHttpHandler-thread-0 - GameSessionActivate data: gameSessionId: "arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d"

关闭服务器进程

完成示例游戏后,在 Unity 中关闭服务器。

  1. 在游戏客户端中,选择退出或关闭窗口以停止游戏客户端。

  2. 在 Unity 中,在本地测试窗口中,选择停止或关闭游戏服务器窗口以停止服务器。