适用于 Unity 的 Amazon GameLift 插件(服务器 SDK 4.x)
注意
本主题提供了适用于 Unity 的 Amazon GameLift 插件的早期版本相关信息。版本 1.0.0(2021 年发布)使用 Amazon GameLift 服务器 SDK 4.x 或更早版本。有关插件最新版本(使用服务器 SDK 5.x 并支持 Amazon GameLift Anywhere)的文档,请参阅适用于 Unity 的 Amazon GameLift 插件(服务器 SDK 5.x)。
Amazon GameLift 提供一些工具,用于让您的多人游戏服务器准备就绪,从而在 Amazon GameLift 上运行。借助适用于 Unity 的 Amazon GameLift 插件,您可以更轻松地将 Amazon GameLift 集成到 Unity 游戏项目中并部署 Amazon GameLift 资源进行云托管。使用适用于 Unity 的插件来访问 Amazon GameLift API,并为常见的游戏场景部署 AWS CloudFormation 模板。
设置插件后,您可以在 GitHub 上试用 Amazon GameLift Unity 示例
主题
安装并设置插件
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
本节介绍如何下载、安装和设置适用于 Unity 的 Amazon GameLift 插件版本 1.0.0。
先决条件
-
适用于 Windows 的 Unity 2019.4 LTS、适用于 Windows 的 2020.3 LTS 或适用于 macOS 的 Unity
-
Java 的当前版本
-
.NET 4.x 的当前版本
下载并安装适用于 Unity 的插件
-
下载适用于 Unity 的 Amazon GameLift 插件。您可以在适用于 Unity 存储库的 Amazon GameLift 插件
页面上找到最新版本。在最新版本 下,选择资产,然后下载 com.amazonaws.gamelift-version.tgz
文件。 -
启动 Unity 并选择一个项目。
-
在顶部导航栏的窗口下,选择 Package Manager:
-
在 Package Manager 选项卡下,选择 +,然后选择从 tarball 添加软件包...:
-
在选择磁盘上的软件包窗口中,导航到
com.amazonaws.gamelift
文件夹,选择文件com.amazonaws.gamelift-version.tgz
,然后选择打开: -
Unity 加载插件后,Amazon GameLift 将作为新项目出现在 Unity 菜单中。安装和重新编译脚本可能需要几分钟时间。Amazon GameLift 插件设置选项卡会自动打开。
-
在软件开发工具包窗格中,选择使用 .NET 4.x。
配置后,状态将从未配置更改为已配置。
在本地测试游戏
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
使用 Amazon GameLift Local 在本地设备上运行 Amazon GameLift。无需网络连接,即可使用 Amazon GameLift Local 在几秒钟内验证代码更改。
配置本地测试
-
在 Unity 插件窗口中,选择测试选项卡。
-
在测试窗格中,选择下载 Amazon GameLift Local。适用于 Unity 的插件会打开浏览器窗口,并将
GameLift_06_03_2021.zip
文件下载到您的下载文件夹。下载内容包括 C# 服务器软件开发工具包、.NET 源文件和与 Unity 兼容的 .NET 组件。
-
解压下载的
GameLift_06_03_2021.zip
文件。 -
在 Amazon GameLift 插件设置窗口中,选择 Amazon GameLift Local 路径,导航到解压缩的文件夹,选择
GameLiftLocal.jar
文件,然后选择打开。配置后,本地测试状态将从未配置更改为已配置。
-
验证 JRE 的状态。如果状态为未配置,请选择下载 JRE 并安装推荐的 Java 版本。
安装和配置 Java 环境后,状态将更改为已配置。
运行本地游戏
-
在“适用于 Unity 的插件”选项卡中,选择测试选项卡。
-
在测试窗格中,选择打开本地测试 UI。
-
在本地测试窗口中,指定服务器可执行文件路径。选择...选择服务器应用程序的路径和可执行文件名称。
-
在本地测试窗口中,指定 GL Local 端口。
-
选择部署并运行以部署和运行服务器。
-
要停止游戏服务器,请选择停止或关闭游戏服务器窗口。
部署场景
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
一个场景使用 AWS CloudFormation 模板来创建为游戏部署云托管解决方案所需的资源。本节介绍 Amazon GameLift 提供的场景及其使用方法。
先决条件
要部署该场景,您需要为 Amazon GameLift 服务设置一个 IAM 角色。有关如何为 Amazon GameLift 创建角色的信息,请参阅设置一个 AWS 账户。
每种场景都需要访问以下资源的权限:
-
Amazon GameLift
-
Amazon S3
-
AWS CloudFormation
-
API Gateway
-
AWS Lambda
-
AWS WAFV2
-
Amazon Cognito
场景
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
适用于 Unity 的 Amazon GameLift 插件包括以下场景:
仅限身份验证
此场景创建了一个游戏后端服务,该服务在没有游戏服务器功能的情况下执行玩家身份验证。该模板在您的账户中创建以下资源:
-
Amazon Cognito 用户群体,用于存储玩家身份验证信息。
-
Amazon API Gateway REST 端点支持的 AWS Lambda 处理程序,用于启动游戏并查看游戏连接信息。
单区域实例集
此场景使用单个 Amazon GameLift 实例集创建游戏后端服务。其创建了以下资源:
-
Amazon Cognito 用户群体,供玩家进行身份验证和开始游戏。
-
一个 AWS Lambda 处理程序,用于搜索实例集上有开放玩家位置的现有游戏会话。如果该处理程序找不到开放位置,就会创建一个新的游戏会话。
带有队列和自定义对战构建器的多区域实例集
此场景使用 Amazon GameLift 队列和自定义对战构建器将等候池中年龄最大的玩家分组在一起,从而形成对战。其创建了以下资源:
-
Amazon Simple Notification Service 主题,Amazon GameLift 向其发布消息。有关 SNS 主题和通知的更多信息,请参阅 请参阅设置游戏会话置放通知。。
-
一个 Lambda 函数,由传达位置和游戏连接详情的消息调用。
-
Amazon DynamoDB 表,用于存储位置和游戏连接详情。
GetGameConnection
调用从此表读取并将连接信息返回到游戏客户端。
带有队列和自定义对战构建器的竞价型实例集
此场景使用 Amazon GameLift 队列和自定义对战构建器形成对战,并配置三个实例集。其创建了以下资源:
-
两个竞价型实例集包含不同的实例类型,可确保竞价型实例不可用性更持久。
-
一种按需型实例集,可作为其他竞价型实例集的备份。有关实例集设计的更多信息,请参阅托管式实例集设计指南。
-
用于保持服务器高可用性和低成本的 Amazon GameLift 队列。有关队列的更多信息和最佳实操,请参阅设计游戏会话队列。
FlexMatch
此场景使用 FlexMatch 托管对战服务将玩家匹配在一起。有关 FlexMatch 的更多信息,请参阅什么是 Amazon GameLift FlexMatch。此场景创建了以下资源:
-
一个 Lambda 函数,用于在收到
StartGame
请求后创建对战票证。 -
一个单独的 Lambda 函数,用于侦听 FlexMatch 匹配事件。
为避免您的 AWS 账户产生不必要的费用,请在使用完每个场景创建的资源后将其删除。同时删除相应的 AWS CloudFormation 堆栈。
更新 AWS 凭证
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
适用于 Unity 的 Amazon GameLift 插件需要安全凭证才能部署场景。您可以创建新凭证或使用现有凭证。
有关配置凭证的更多信息,请参阅了解和获取您的 AWS 凭证。
更新 AWS 凭证
-
在 Unity 的“适用于 Unity 的插件”选项卡中,选择部署选项卡。
-
在部署窗格中,选择 AWS 凭证。
-
您可以创建新 AWS 凭证或选择现有凭证。
-
要创建凭证,请选择创建新的凭证配置文件,然后指定新配置文件名称、AWS 访问密钥 ID、AWS 密钥和 AWS 区域。
-
要选择现有凭证,请选择选择现有凭证配置文件,然后选择配置文件名称和 AWS 区域。
-
-
在更新 AWS 凭证窗口中,选择更新凭证配置文件。
更新账户引导程序
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
引导位置是部署期间使用的 Amazon S3 存储桶。它用于存储游戏服务器资产和其他依赖项。您为存储桶选择的 AWS 区域必须与用于场景部署的区域相同。
有关 Amazon S3 存储桶的更多信息,请参阅创建、配置和使用 Amazon Simple Storage Service 存储桶。
更新账户引导位置
-
在 Unity 的“适用于 Unity 的插件”选项卡中,选择部署选项卡。
-
在部署窗格中,选择更新账户引导。
-
在账户引导窗口中,您可以选择现有 Amazon S3 存储桶或创建一个新的 Amazon S3 存储桶:
-
要选择现有存储桶,请选择选择现有 Amazon S3 存储桶,然后选择更新以保存您的选择。
-
选择创建新的 Amazon S3 存储桶以创建新的 Amazon Simple Storage Service 存储桶,然后选择策略。该策略指定了 Amazon S3 存储桶的过期时间。选择创建以创建存储桶。
-
部署游戏场景
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
您可以使用场景在 Amazon GameLift 上测试您的游戏。每个场景都使用 AWS CloudFormation 模板创建一个包含所需资源的堆栈。大多数场景都需要游戏服务器可执行文件和构建路径。部署场景时,作为部署的一部分,Amazon GameLift 会将游戏资产复制到引导位置。
您必须配置 AWS 凭证和 AWS 账户引导才能部署场景。
部署场景
-
在 Unity 的“适用于 Unity 的插件”选项卡中,选择部署选项卡。
-
在部署窗格中,选择打开部署 UI。
-
在部署窗口中,选择一个场景。
-
输入游戏名称。此名称必须唯一。部署场景时,游戏名称是 AWS CloudFormation 堆栈名称的一部分。
-
选择游戏服务器构建文件夹路径。构建文件夹路径指向包含服务器可执行文件和依赖项的文件夹。
-
选择游戏服务器构建 .exe 文件路径。构建可执行文件路径指向游戏服务器可执行文件。
-
选择开始部署以开始部署场景。您可以在部署窗口的当前状态下关注更新状态。部署场景可能需要数分钟。
-
场景完成部署后,当前状态将更新为包括 Cognito 客户端 ID 和 API Gateway 端点,您可以将其复制并粘贴到游戏中。
-
要更新游戏设置,请在 Unity 菜单上选择转到客户端连接设置。这会在 Unity 屏幕的右侧显示 Inspector 选项卡。
-
取消选择本地测试模式。
-
输入 API Gateway 端点和 Coginito 客户端 ID。选择与场景部署相同的 AWS 区域。然后,您可以使用已部署的场景资源重建并运行游戏客户端。
删除场景创建的资源
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
要删除为该场景创建的资源,请删除相应的 AWS CloudFormation 堆栈。
删除由场景创建的资源
-
在适用于 Unity 的 Amazon GameLift 插件的部署窗口中,选择查看 AWS CloudFormation 控制台以打开 AWS CloudFormation 控制台。
-
在 AWS CloudFormation 控制台中,选择堆栈,然后选择包含部署期间指定的游戏名称的堆栈。
-
要删除该堆栈,请选择删除。删除堆栈可能需要几分钟时间。AWS CloudFormation 删除场景使用的堆栈后,其状态将更改为
ROLLBACK_COMPLETE
。
在 Unity 中将游戏与 Amazon GameLift 集成
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
完成以下任务,将您的 Unity 游戏与 Amazon GameLift 集成:
下图显示了集成游戏的示例流程。在图中,带有游戏服务器的实例集部署到了 Amazon GameLift。游戏客户端与游戏服务器通信,游戏服务器与 Amazon GameLift 通信。

导入并运行示例游戏
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
适用于 Unity 的 Amazon GameLift 插件包含一个示例游戏,可用于探索将游戏与 Amazon GameLift 集成的基础知识。在本节中,您将构建游戏客户端和游戏服务器,然后使用 Amazon GameLift Local 在本地进行测试。
先决条件
构建并运行示例游戏服务器
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
设置示例游戏的游戏服务器文件。
-
在 Unity 中,在菜单上选择 Amazon GameLift,然后选择导入示例游戏。
-
在导入示例游戏窗口中,选择导入以导入游戏、其资产和依赖项。
-
构建游戏服务器。在 Unity 中,在菜单上选择 Amazon GameLift,然后选择应用 Windows 示例服务器构建设置或应用 MacOS 示例服务器构建设置。配置游戏服务器设置后,Unity 会重新编译资产。
-
在 Unity 中,在菜单上选择文件,然后选择构建。选择服务器构建,选择构建,然后选择专门存放服务器文件的构建文件夹。
Unity 构建示例游戏服务器,将可执行文件和所需资产放在指定的构建文件夹中。
构建并运行示例游戏客户端
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
设置示例游戏的游戏客户端文件。
-
在 Unity 中,在菜单上选择 Amazon GameLift,然后选择应用 Windows 示例客户端构建设置或应用 MacOS 示例客户端构建设置。配置游戏客户端设置后,Unity 将重新编译资产。
-
在 Unity 中,在菜单上选择转到客户端设置。这将在 Unity 屏幕的右侧显示 Inspector 选项卡。在 Amazon GameLift 客户端设置选项卡中,选择本地测试模式。
-
构建游戏客户端。在 Unity 中,在菜单上文件。确认未选中服务器构建,选择构建,然后选择专门存放客户端文件的构建文件夹。
Unity 构建示例游戏客户端,将可执行文件和所需资产放在指定的客户端构建文件夹中。
-
您尚未构建游戏服务器和客户端。在接下来的步骤中,您将运行游戏并了解其如何与 Amazon GameLift 互动。
在本地测试示例游戏
注意
本主题指的是适用于 Unity 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
使用 Amazon GameLift Local 运行导入的示例游戏。
-
启动游戏服务器。在 Unity 的“适用于 Unity 的插件”选项卡中,选择部署选项卡。
-
在测试窗格中,选择打开本地测试 UI。
-
在本地测试窗口中,指定游戏服务器 .exe 文件路径。路径必须包含可执行文件名称。例如,
C:/MyGame/GameServer/MyGameServer.exe
。 -
选择部署并运行。适用于 Unity 的插件启动游戏服务器并打开 Amazon GameLift Local 日志窗口。窗口包含日志消息,包括游戏服务器和 Amazon GameLift Local 之间发送的消息。
-
启动游戏客户端。使用示例游戏客户端找到构建位置并选择可执行文件。
-
在 Amazon GameLift 示例游戏中,提供电子邮件和密码,然后选择登录。电子邮件和密码未经过验证或使用。
-
在 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 的 Amazon GameLift 插件版本 1.0.0(使用服务器 SDK 4.x 或更早版本)。
完成示例游戏后,在 Unity 中关闭服务器。
-
在游戏客户端中,选择退出或关闭窗口以停止游戏客户端。
-
在 Unity 中,在本地测试窗口中,选择停止或关闭游戏服务器窗口以停止服务器。