本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
集成 Amazon GameLift Servers 使用 Unity 游戏客户端项目
本主题可帮助您设置要连接的游戏客户端 Amazon GameLift Servers 通过后端服务托管游戏会话。使用 Amazon GameLift Servers APIs 发起配对、申请游戏会话位置等。
向后端服务项目添加代码以允许与后端服务项目进行通信 Amazon GameLift Servers 服务。后端服务处理游戏客户端与该 GameLift 服务的所有通信。有关后端服务的更多信息,请参阅。
后端服务器处理以下游戏客户端任务:
-
自定义玩家身份验证。
-
向以下地址索取有关活跃游戏会话的信息 Amazon GameLift Servers 服务。
-
创建新的游戏会话。
-
将玩家加入到现有游戏会话。
-
将玩家从现有游戏会话中移除。
先决条件
在设置游戏服务器之前,请与 Amazon GameLift Servers 客户端,完成以下任务:
初始化游戏客户端
添加用于初始化游戏客户端的代码。在启动时运行此代码,其他代码是必需的 Amazon GameLift Servers 函数。
-
初始化
AmazonGameLiftClient
。使用默认客户端配置或自定义配置调用AmazonGameLiftClient
。有关如何配置客户端的更多信息,请参阅设置 Amazon GameLift Servers 在后端服务上。 -
为每个玩家生成唯一的玩家 ID 来连接到游戏会话。有关更多信息,请参阅生成玩家 IDs。
以下示例显示了如何设置 Amazon GameLift Servers 客户。
public class GameLiftClient { private GameLift gl; //A sample way to generate random player IDs. bool includeBrackets = false; bool includeDashes = true; string playerId = AZ::Uuid::CreateRandom().ToString<string>(includeBrackets, includeDashes); private Amazon.GameLift.Model.PlayerSession psession = null; public AmazonGameLiftClient aglc = null; public void CreateGameLiftClient() { //Access Amazon GameLift Servers service by setting up a configuration. //The default configuration specifies a location. var config = new AmazonGameLiftConfig(); config.RegionEndpoint = Amazon.RegionEndpoint.USEast1; CredentialProfile profile = null; var nscf = new SharedCredentialsFile(); nscf.TryGetProfile(profileName, out profile); AWSCredentials credentials = profile.GetAWSCredentials(null); //Initialize Amazon GameLift Servers Client with default client configuration. aglc = new AmazonGameLiftClient(credentials, config); } }
按照特定的实例集创建游戏会话
添加用于在已部署的实例集中启动新游戏会话并使其可供玩家接入的代码。晚于 Amazon GameLift Servers 已经创建了新的游戏会话并返回了GameSession
,你可以向其中添加玩家。
-
申请新游戏会话。
-
如果您的游戏使用实例集,请使用实例集或别名 ID、会话名称和游戏的最大并发玩家数量调用
CreateGameSession()
。 -
如果您的游戏使用队列,请调用
StartGameSessionPlacement()
。
-
以下示例演示如何创建游戏会话。
public Amazon.GameLift.Model.GameSession() { var cgsreq = new Amazon.GameLift.Model.CreateGameSessionRequest(); //A unique identifier for the alias with the fleet to create a game session in. cgsreq.AliasId = aliasId; //A unique identifier for a player or entity creating the game session cgsreq.CreatorId = playerId; //The maximum number of players that can be connected simultaneously to the game session. cgsreq.MaximumPlayerSessionCount = 4; //Prompt an available server process to start a game session and retrieves connection information for the new game session Amazon.GameLift.Model.CreateGameSessionResponse cgsres = aglc.CreateGameSession(cgsreq); string gsid = cgsres.GameSession != null ? cgsres.GameSession.GameSessionId : "N/A"; Debug.Log((int)cgsres.HttpStatusCode + " GAME SESSION CREATED: " + gsid); return cgsres.GameSession; }
向游戏会话中添加玩家
晚于 Amazon GameLift Servers 创建了新的游戏会话并返回了一个GameSession
对象,你可以向其中添加玩家。
-
通过新建玩家会话在游戏会话中预留玩家位置。将
CreatePlayerSession
或CreatePlayerSessions
与游戏会话 ID 和每个玩家的唯一 ID 一起使用。 -
连接到游戏会话。检索
PlayerSession
对象以获取游戏会话的连接信息。您可以使用此信息与服务器进程建立直接连接:-
使用指定的端口以及分配给服务器进程的 DNS 名称或 IP 地址进行连接。
-
使用实例集的 DNS 名称和端口。如果实例集启用了 TLS 证书生成,则需要 DNS 名称和端口。
-
引用玩家会话 ID。如果游戏服务器验证传入的玩家连接,则需要玩家会话 ID。
-
以下示例演示了如何在游戏会话中预留玩家位置。
public Amazon.GameLift.Model.PlayerSession CreatePlayerSession(Amazon.GameLift.Model.GameSession gsession) { var cpsreq = new Amazon.GameLift.Model.CreatePlayerSessionRequest(); cpsreq.GameSessionId = gsession.GameSessionId; //Specify game session ID. cpsreq.PlayerId = playerId; //Specify player ID. Amazon.GameLift.Model.CreatePlayerSessionResponse cpsres = aglc.CreatePlayerSession(cpsreq); string psid = cpsres.PlayerSession != null ? cpsres.PlayerSession.PlayerSessionId : "N/A"; return cpsres.PlayerSession; }
以下代码说明了如何将玩家连接到游戏会话。
public bool ConnectPlayer(int playerIdx, string playerSessionId) { //Call ConnectPlayer with player ID and player session ID. return server.ConnectPlayer(playerIdx, playerSessionId); }
从游戏会中移除玩家
当玩家离开游戏时,您可以将其从游戏会话中移除。
-
通知 Amazon GameLift Servers 玩家已与服务器进程断开连接的服务。使用玩家的会话 ID 调用
RemovePlayerSession
。 -
验证
RemovePlayerSession
是否返回Success
。然后,Amazon GameLift Servers 将玩家位置更改为可用,Amazon GameLift Servers 可以分配给新玩家。
以下示例说明了如何移除玩家会话。
public void DisconnectPlayer(int playerIdx) { //Receive the player session ID. string playerSessionId = playerSessions[playerIdx]; var outcome = GameLiftServerAPI.RemovePlayerSession(playerSessionId); if (outcome.Success) { Debug.Log (":) PLAYER SESSION REMOVED"); } else { Debug.Log(":(PLAYER SESSION REMOVE FAILED. RemovePlayerSession() returned " + outcome.Error.ToString()); } }