将亚马逊 GameLift 集成到 Unity 项目中 - Amazon GameLift

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

将亚马逊 GameLift 集成到 Unity 项目中

本主题介绍如何设置适用于 Unity 的 Amazon GameLift C# 服务器SDK插件并将其集成到您的游戏项目中。

其他资源

先决条件

要使用适用于 Unity 的 Amazon GameLift C# 服务器SDK插件,您需要以下组件:

  • 该插件支持的开发环境和 Unity 编辑器版本(请参阅获取 Amazon GameLift 开发工具)。有关 Unity 版本的信息,请参阅 Unity 文档中的 Unity 系统要求

  • 适用于 Unity 软件包的亚马逊 GameLift 服务器SDK插件。此软件包包括适用于 C# 的服务器 SDK 5+。您可以从以下网站下载软件包:Amazon 入门 GameLift

  • 第三方范围内的注册表 UnityNuGet。此工具管理第三方DLLs。有关更多信息,请参阅 UnityNuGetGithub 存储库。

设置 UnityNuGet

如果您尚未为游戏项目进行 UnityNuGet 设置,请按照以下步骤使用 Unity 包管理器安装该工具。或者 NuGet CLI,您可以使用手动下载DLLs。有关更多信息,请参阅适用于 Unity 的 Amazon GameLift C# 服务器SDKREADME

要集成 UnityNuGet 到你的游戏项目中
  1. 在 Unity 编辑器中打开项目后,进入主菜单并选择编辑项目设置。从选项中选择包管理器部分,然后打开范围界定的注册表组。

  2. 选择 + 按钮,然后为限定 UnityNuGet 范围的注册表输入以下值:

    Name: Unity NuGet URL: https://unitynuget-registry.azurewebsites.net Scope(s): org.nuget
  3. 对于 Unity 2021 版本的用户:

    设置完成后 UnityNuGet,检查 Unity 控制台中是否显示Assembly Version Validation错误。如果 NuGet包中强命名程序集的绑定重定向未正确解析到 Unity 项目中的路径,则会发生这些错误。要解决这一问题,请配置 Unity 的程序集版本验证:

    1. 在 Unity 编辑器中,进入主菜单并选择 编辑项目设置,然后打开玩家部分。

    2. 取消选择程序集版本验证选项。

安装插件

使用以下过程安装适用于 Unity 的 Amazon GameLift C# 服务器SDK插件并配置 log4net 日志记录。

安装该插件
  1. 在 Unity 编辑器中打开项目后,进入主菜单并选择窗口包管理器

  2. 选择 + 按钮添加新软件包。选择从 tarball 添加软件包选项。

  3. 选择磁盘上的软件包中,找到用于 Unity 下载文件的 Amazon GameLift C# 服务器SDK插件,然后选择亚马逊 GameLift 服务器SDK.tgz文件。选择打开以安装插件。

亚马逊 GameLift 服务器SDK使用 log4net 框架输出日志消息。默认情况下,它配置为向服务器版本的终端输出消息,但是 Unity 需要配置才能添加文件日志记录支持。您可以通过在 Amazon GameLift Server SDK 包中导入提供的样本来为您的项目添加此支持。按照以下过程添加示例并配置 log4net:

为文件输出配置 log4net
  1. 在 Unity 编辑器中打开项目后,进入主菜单并选择窗口包管理器

  2. 从下拉菜单中选择 “软件包:在项目中”,然后SDK从软件包列表中选择 Amazon GameLift Server。这将打开包裹详情。

  3. 在包裹详细信息中,选择样品组选项,然后按导入

  4. log4net.config 文件和随附的 LoggingConfiguration.cs 脚本会自动执行配置,该配置现在已设置在项目的 Assets/Samples 文件夹中。

    注意

    如果您需要将 log4net.config 文件移动到项目中的其他文件夹,则还必须使用新路径更新脚本 LoggingConfiguration.cs 中配置文件的文件路径。有关更多信息,请参阅有关配置 log4net 的 log4net 手册

有关更详细的说明和测试指南,请参阅插件下载中的README

设置亚马逊 GameLift Anywhere 用于测试的舰队

您可以将开发工作站设置为 Amazon GameLift Anywhere 托管队列以迭代测试您的 Amazon GameLift 集成。通过此设置,您可以在工作站上启动游戏服务器进程,向 Amazon 发送玩家加入或配对请求 GameLift以开始游戏会话,并将客户端连接到新的游戏会话。将您自己的工作站设置为托管服务器后,您可以监控游戏与 Amazon 集成的各个方面 GameLift。

有关设置工作站的说明,请参阅在 Amazon 上设置本地测试 GameLift Anywhere以完成以下步骤:

  1. 为您的工作站创建自定义位置。

  2. 创建亚马逊 GameLift Anywhere 使用您的新自定义位置的舰队。如果成功,此请求将返回实例集 ID。记下 ARN,稍后您将用到它。

  3. 在新版中将您的工作站注册为计算机 Anywhere 舰队。为您的工作站提供唯一的计算名称并指定 IP 地址。如果成功,此请求将返回一个服务SDK端点,其形式为 WebSocket URL。记下 ARN,稍后您将用到它。

  4. 为您的工作站计算生成身份验证令牌。这种短暂的身份验证包括令牌和到期日期。您的游戏服务器使用它来验证与 Amazon GameLift 服务的通信。将身份验证存储在您的工作站计算机上,以便正在运行的游戏服务器进程可以对其进行访问。

将亚马逊 GameLift 服务器代码添加到您的 Unity 项目中

您的游戏服务器与 Amazon GameLift 服务通信,以接收指令并报告持续状态。为此,您需要添加使用 Amazon 服务器的游戏 GameLift服务器代码SDK。

提供的代码示例说明了所需的基本集成元素。它使用来说明MonoBehavior如何使用 Amazon 进行简单的游戏服务器初始化 GameLift。该示例假设游戏服务器在 Amazon 上运行 GameLift Anywhere 用于测试的舰队。它包括以下代码:

  • 初始化亚马逊 GameLift API客户端。该示例使用InitSDK()带有服务器参数的版本作为您的 Anywhere 舰队和计算。按照上一主题中的 WebSocket URL定义,使用舰队 ID、计算名称(主机 ID)和身份验证令牌设置亚马逊 GameLift Anywhere 用于测试的舰队

  • 实现回调函数以响应 Amazon GameLift 服务的请求OnStartGameSession,包括OnProcessTerminate、和onHealthCheck

  • 使用指定端口调用 ProcessReady (),以便在进程准备好托管游戏会话时通知 Amazon GameLift 服务。

本主题中介绍的代码建立了与Amazon GameLift 服务的通信,. 它还实现了一组回调函数,用于响应来自的请求。有关每个函数以及代码作用的更多信息,请参阅初始化服务器进程。有关此代码中使用的SDK操作和数据类型的更多信息,请阅读适用于 C# 和 Unity 的亚马逊 GameLift 服务器 SDK 5.x:操作

此示例演示如何添加所有必需元素,如将 Amazon GameLift 添加到游戏服务器中所述。它包括:

有关添加 Amazon GameLift 功能的更多信息,请参阅以下主题:

using System.Collections.Generic; using Aws.GameLift.Server; using UnityEngine; public class ServerSDKManualTest : MonoBehaviour { //This example is a simple integration that initializes a game server process //that is running on an Amazon GameLift Anywhere fleet. void Start() { //Identify port number (hard coded here for simplicity) the game server is listening on for player connections var listeningPort = 7777; //WebSocketUrl from RegisterHost call var webSocketUrl = "wss://us-west-2.api.amazongamelift.com"; //Unique identifier for this process var processId = "myProcess"; //Unique identifier for your host that this process belongs to var hostId = "myHost"; //Unique identifier for your fleet that this host belongs to var fleetId = "myFleet"; //Authorization token for this host process var authToken = "myAuthToken"; //Server parameters are required for a GameLift Anywhere fleet. //They are not required for a GameLift managed EC2 fleet. ServerParameters serverParameters = new ServerParameters( webSocketUrl, processId, hostId, fleetId, authToken); //InitSDK establishes a local connection with an Amazon GameLift agent //to enable further communication. var initSDKOutcome = GameLiftServerAPI.InitSDK(serverParameters); if (initSDKOutcome.Success) { //Implement callback functions ProcessParameters processParameters = new ProcessParameters( //Implement OnStartGameSession callback (gameSession) => { //GameLift sends a game session activation request to the game server //with game session object containing game properties and other settings. //Here is where a game server takes action based on the game session object. //When the game server is ready to receive incoming player connections, //it invokes the server SDK call ActivateGameSession(). GameLiftServerAPI.ActivateGameSession(); }, (updateGameSession) => { //GameLift sends a request when a game session is updated (such as for //FlexMatch backfill) with an updated game session object. //The game server can examine matchmakerData and handle new incoming players. //updateReason explains the purpose of the update. }, () => { //Implement callback function OnProcessTerminate //GameLift invokes this callback before shutting down the instance hosting this game server. //It gives the game server a chance to save its state, communicate with services, etc., //and initiate shut down. When the game server is ready to shut down, it invokes the //server SDK call ProcessEnding() to tell GameLift it is shutting down. GameLiftServerAPI.ProcessEnding(); }, () => { //Implement callback function OnHealthCheck //GameLift invokes this callback approximately every 60 seconds. //A game server might want to check the health of dependencies, etc. //Then it returns health status true if healthy, false otherwise. //The game server must respond within 60 seconds, or GameLift records 'false'. //In this example, the game server always reports healthy. return true; }, //The game server gets ready to report that it is ready to host game sessions //and that it will listen on port 7777 for incoming player connections. listeningPort, new LogParameters(new List<string>() { //Here, the game server tells GameLift where to find game session log files. //At the end of a game session, GameLift uploads everything in the specified //location and stores it in the cloud for access later. "/local/game/logs/myserver.log" })); //The game server calls ProcessReady() to tell GameLift it's ready to host game sessions. var processReadyOutcome = GameLiftServerAPI.ProcessReady(processParameters); if (processReadyOutcome.Success) { print("ProcessReady success."); } else { print("ProcessReady failure : " + processReadyOutcome.Error.ToString()); } } else { print("InitSDK failure : " + initSDKOutcome.Error.ToString()); } } void OnApplicationQuit() { //Make sure to call GameLiftServerAPI.ProcessEnding() and GameLiftServerAPI.Destroy() before terminating the server process. //These actions notify Amazon GameLift that the process is terminating and frees the API client from memory. GenericOutcome processEndingOutcome = GameLiftServerAPI.ProcessEnding(); GameLiftServerAPI.Destroy(); if (processEndingOutcome.Success) { Environment.Exit(0); } else { Console.WriteLine("ProcessEnding() failed. Error: " + processEndingOutcome.Error.ToString()); Environment.Exit(-1); } } }

其他资源

使用以下资源来测试您的游戏服务器并扩展其功能: