SDK を使用してマッチメイキングする - セッション入門 - (Unity モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
ラッパーを開く
このチュートリアルでは、AccelByte Gaming Services (AGS) Software Development Kit (SDK) を使用して AGS セッションを実装する方法を学びます。Byte Wars では、ゲームインスタンスラッパーが SessionEssentialsWrapper クラスで定義されています。このラッパーは、セッションの作成、退出、セッション招待の処理などのセッション関連のアクションを管理します。このチュートリアルでは、SessionEssentialsWrapper のスターターバージョンである SessionEssentialsWrapper_Starter クラスを使用します。
スターターパックの内容
このチュートリアルを進めるには、SessionEssentialsWrapper_Starter というスターターラッパークラスを使用します。このクラスは、以下のファイルで定義されている AccelByteWarsOnlineSession クラスを継承しています。
- C# ファイル:
Assets/Resources/Modules/Play/OnlineSessionUtils/Scripts/AccelByteWarsOnlineSession.cs
SessionEssentialsWrapper_Starter クラスは以下のファイルで定義されています。
- C# ファイル:
Assets/Resources/Modules/Play/SessionEssentials/Scripts/SessionEssentialsWrapper_Starter.cs
さらに、ヘルパー関数と変数を含むモデルクラスが以下のファイルで定義されています。
- C# ファイル:
Assets/Resources/Modules/Play/OnlineSessionUtils/Scripts/AccelByteWarsOnlineSessionModels.cs - C# ファイル:
Assets/Resources/Modules/Play/SessionEssentials/Scripts/SessionEssentialsModels.cs
AccelByteWarsOnlineSession クラスは、セッション関連のロジックのための基底抽象クラスです。以下を含むいくつかの事前定義されたヘルパーコンポーネントが含まれています。
-
AGS SDK インターフェースを参照するためのヘルパー変数。これらの変数は初期化時に割り当てられます。
protected static User User;
protected static Lobby Lobby;
protected static Session Session;
protected virtual void Awake()
{
...
User ??= AccelByteSDK.GetClientRegistry().GetApi().GetUser();
Lobby ??= AccelByteSDK.GetClientRegistry().GetApi().GetLobby();
Session ??= AccelByteSDK.GetClientRegistry().GetApi().GetSession();
...
} -
アクティブなセッションを追跡するための静的ヘルパープロパティ:
public static SessionV2GameSession CachedSession { get; protected set; } = null;
AccelByteWarsOnlineSessionModels ファイルには、以下を含むいくつかの事前定義されたヘルパーコンポーネントが含まれています。
-
Admin Portal で設定された Session Template に基づいて、セッションテンプレート名を格納する文字列定数:
public const string NoneSessionTemplateName = "unity-elimination-none"; -
セッションテンプレート名に基づいて、ゲーム内モードをセッションリクエストモデルにマッピングするヘルパー辞書:
public static readonly Dictionary<InGameMode, Dictionary<GameSessionServerType, SessionV2GameSessionCreateRequest>> SessionCreateRequestModels = new()
{
{
InGameMode.None, new()
{
{
GameSessionServerType.None,
new SessionV2GameSessionCreateRequest()
{
type = SessionConfigurationTemplateType.NONE,
joinability = SessionV2Joinability.OPEN,
configurationName = NoneSessionTemplateName,
matchPool = NoneSessionTemplateName,
}
}
}
}
...
}; -
ゲーム内モードでセッションリクエストモデルを取得するヘルパー関数:
public static SessionV2GameSessionCreateRequest GetGameSessionRequestModel(
InGameMode gameMode,
GameSessionServerType serverType)
{
if (!SessionCreateRequestModels.TryGetValue(gameMode, out var matchTypeDict))
{
return null;
}
matchTypeDict.TryGetValue(serverType, out var request);
return request;
}
セッションを作成する
このセクションでは、AGS SDK を使用してセッション作成リクエストを送信する方法を説明します。
-
SessionEssentialsWrapper_Starterクラスを開き、以下の関数を作成します。この関数は、新しいセッションを作成する前に、アクティブなセッション(存在する場合)から退出します。リクエストが完了すると、割り当てられたデリゲートを呼び出し、セッションをローカルにキャッシュします。public override void CreateGameSession(
SessionV2GameSessionCreateRequest request,
ResultCallback<SessionV2GameSession> onComplete)
{
// Leave the existing session before creating a new session.
if (CachedSession != null)
{
LeaveGameSession(CachedSession.id, (leaveResult) =>
{
// Abort only if there's an error and it's not due to a missing session.
if (leaveResult.IsError && leaveResult.Error.Code != ErrorCode.SessionIdNotFound)
{
BytewarsLogger.LogWarning($"Failed to create game session. Error {leaveResult.Error.Code}: {leaveResult.Error.Message}");
onComplete?.Invoke(Result<SessionV2GameSession>.CreateError(leaveResult.Error));
return;
}
CreateGameSession(request, onComplete);
});
return;
}
// Create a new session.
Session.CreateGameSession(request, (result) =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning($"Failed to create game session. Error {result.Error.Code}: {result.Error.Message}");
}
else
{
BytewarsLogger.Log($"Success to create game session. Session ID: {result.Value.id}");
}
CachedSession = result.Value;
onComplete?.Invoke(result);
});
}
セッションから退出する
このセクションでは、AGS SDK を使用してセッション退出リクエストを送信する方法を説明します。
-
SessionEssentialsWrapper_Starterクラスを開き、以下の関数を作成します。この関数は、セッション ID を使用してセッションから退出するリクエストを送信します。リクエストが完了すると、割り当てられたデリゲートを呼び出します。public override void LeaveGameSession(
string sessionId,
ResultCallback onComplete)
{
Session.LeaveGameSession(sessionId, (result) =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning(
$"Failed to leave game session with ID: {sessionId}. " +
$"Error {result.Error.Code}: {result.Error.Message}");
}
else
{
BytewarsLogger.Log($"Success to leave game session. Session ID: {sessionId}");
}
CachedSession = null;
onComplete?.Invoke(result);
});
}
セッションに参加する
このセクションでは、AGS SDK を使用してセッション参加リクエストを送信する方法を説明します。
-
SessionEssentialsWrapper_Starterクラスを開き、以下の関数を作成します。この関数は、新しいセッションに参加する前に、アクティブなセッション(存在する場合)から退出します。リクエストが完了すると、割り当てられたデリゲートを呼び出し、セッションをローカルにキャッシュします。public override void JoinGameSession(
string sessionId,
ResultCallback<SessionV2GameSession> onComplete)
{
// Leave the existing session before joining a new session.
if (CachedSession != null)
{
LeaveGameSession(CachedSession.id, (leaveResult) =>
{
// Abort only if there's an error and it's not due to a missing session.
if (leaveResult.IsError && leaveResult.Error.Code != ErrorCode.SessionIdNotFound)
{
BytewarsLogger.LogWarning($"Failed to join game session. Error {leaveResult.Error.Code}: {leaveResult.Error.Message}");
onComplete?.Invoke(Result<SessionV2GameSession>.CreateError(leaveResult.Error));
return;
}
JoinGameSession(sessionId, onComplete);
});
return;
}
// Join a new session.
Session.JoinGameSession(sessionId, (result) =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning($"Failed to join game session. Error {result.Error.Code}: {result.Error.Message}");
}
else
{
BytewarsLogger.Log($"Success to join game session. Session ID: {result.Value.id}");
}
CachedSession = result.Value;
onComplete?.Invoke(result);
});
}
セッション招待を送信する
このセクションでは、AGS SDK を使用して他のプレイヤーにセッション招待リクエストを送信する方法を説明します。
-
SessionEssentialsWrapper_Starterクラスを開き、以下の関数を作成します。この関数は、セッション ID と招待されるユーザーのユーザー ID を提供することで、他のプレイヤーにセッション招待を送信します。リクエストが完了すると、割り当てられたデリゲートを呼び出します。public override void SendGameSessionInvite(
string sessionId,
string inviteeUserId,
ResultCallback onComplete)
{
Session.InviteUserToGameSession(
sessionId,
inviteeUserId,
(result) =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning(
$"Failed to send game session invite to {inviteeUserId}. " +
$"Error {result.Error.Code}: {result.Error.Message}");
}
else
{
BytewarsLogger.Log($"Success to send game session invite to {inviteeUserId}");
}
onComplete?.Invoke(result);
});
}
セッション招待を拒否する
このセクションでは、AGS SDK を使用してセッション招待拒否リクエストを送信する方法を説明します。
-
SessionEssentialsWrapper_Starterクラスを開き、以下の関数を作成します。この関数は、セッション招待を拒否するリクエストを送信します。リクエストが完了すると、割り当てられたデリゲートを呼び出します。public override void RejectGameSessionInvite(
string sessionId,
ResultCallback onComplete)
{
Session.RejectGameSessionInvitation(sessionId, (result) =>
{
if (result.IsError)
{
BytewarsLogger.LogWarning(
$"Failed to reject game session with ID: {sessionId}. " +
$"Error {result.Error.Code}: {result.Error.Message}");
}
else
{
BytewarsLogger.Log($"Success to reject game session. Session ID: {sessionId}");
}
onComplete?.Invoke(result);
});
}
リソース
-
このチュートリアルで使用されるファイルは、Unity Byte Wars GitHub リポジトリで入手できます。
- Assets/Resources/Modules/Play/SessionEssentials/Scripts/SessionEssentialsWrapper_Starter.cs
- Assets/Resources/Modules/Play/SessionEssentials/Scripts/SessionEssentialsModels.cs
- Assets/Resources/Modules/Play/OnlineSessionUtils/Scripts/AccelByteWarsOnlineSession.cs
- Assets/Resources/Modules/Play/OnlineSessionUtils/Scripts/AccelByteWarsOnlineSessionModels.cs