ゲームセッションの属性を統合する
注釈:本資料はAI技術を用いて翻訳されています。
概要
AccelByte Gaming Services(AGS)セッションを使用したゲームセッションには、ゲームセッションをホストするために使用されるメンバーと専用サーバー(DS)間で共有されるデータの保存と読み取りに使用できるセッション属性を含めることができます。すべてのゲームセッションメンバーとDSは、このデータへの読み取りおよび書き込みアクセス権を持っています。
この記事では、AGS Game SDKを通じてセッションデータの更新の保存、読み取り、通知のリスニング方法を示します。次のトピックに関するコードスニペットも提供されています。
- セッション属性の保存
- 更新の競合の処理
- セッション属性の読み取り
- セッションデータ更新の通知のリスニング
セッション属性を保存する
セッションデータの保存には、開発者がセッションを属性で更新する必要があります。属性は、ゲームセッションの作成時にも入力できます。
- OSS
- Unity
Unreal OSSのセッション属性はセッション設定内に保存されるため、セッション設定でセッション属性を設定してからUpdateSessionを呼び出す必要があります。
FOnlineSubsystemAccelByte* AccelByteOSS = static_cast<FOnlineSubsystemAccelByte*>(IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM));
if(AccelByteOSS == nullptr)
{
// AccelByteOSSが見つからない場合は中止
return;
}
FOnlineSessionV2AccelBytePtr SessionInterface = StaticCastSharedPtr<FOnlineSessionV2AccelByte>(AccelByteOSS->GetSessionInterface());
// ローカルセッション設定データを取得し、属性で更新
FOnlineSessionSettings* SessionSettings = SessionInterface->GetSessionSettings(NAME_GameSession);
SessionSettings->Set(FName("attributename"), TEXT("attributeValue"));
// セッション更新完了のデリゲートをリスニング
FDelegateHandle UpdateSessionCompleteHandle;
UpdateSessionCompleteHandle = SessionInterface->AddOnUpdateSessionCompleteDelegate_Handle(FOnUpdateSessionCompleteDelegate::CreateLambda(
[&SessionInterface, &UpdateSessionCompleteHandle](FName SessionName, bool bWasSuccessful)
{
// ここで更新完了後に何かを実行
// 再度トリガーされないようにデリゲートハンドラを削除
SessionInterface->ClearOnUpdateSessionCompleteDelegate_Handle(UpdateSessionCompleteHandle);
}));
SessionInterface->UpdateSession(NAME_GameSession, *SessionSettings);
var session = AccelByteSDK.GetClientRegistry().GetApi().GetSession();
var sessionId = "abc123"; // ここにセッションIDを挿入
var updateGameSessionRequest = new SessionV2GameSessionUpdateRequest()
{
version = 1 // バックエンドからの最新バージョンに応じて変更
};
updateGameSessionRequest.attributes.Add("testAttribute", "attributeValue");
session.PatchGameSession(sessionId, updateGameSessionRequest, result =>
{
{
if (result.IsError)
{
// PatchGameSessionでエラーが発生した場合に何かを実行
Debug.Log($"Error PatchGameSession, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// PatchGameSessionが成功した場合に何かを実行
}
});
マッチチケットで属性を使用しているセッションがマッチメイキングから作成された場合も、属性が入力されます。
更新の競合を処理する
セッションデータを更新するリクエストは、更新リクエストのバージョンがバックエンドのバージョンと等しい場合にのみ受け入れられます。
- OSS
- Unity
Unreal OSSでは、競合する更新のために更新リクエストが失敗した場合、OSSはセッションデータを更新し、最新のバックエンドデータをクエリします。その後、更新に失敗したセッション設定を渡しながら、AddOnSessionUpdateConflictErrorDelegate_Handleで設定されたデリゲートをトリガーします。その後、更新セッション呼び出しを再試行できます。
SessionInterface->AddOnSessionUpdateConflictErrorDelegate_Handle(FOnSessionUpdateConflictErrorDelegate::CreateLambda(
[](FName SessionName, FOnlineSessionSettings FailedSessionSettings)
{
// 更新の競合のためにセッション更新が失敗した場合に何かを実行
}));
Unityでは、古いデータのために更新リクエストが失敗した場合、エラーコードErrorCode.SessionVersionMismatchで応答します。このエラーコードを受け取った場合は、まずバックエンドをクエリして最新のセッションデータを取得し、最新のセッションバージョンで更新を再試行する必要があります。
セッション属性を読み取る
セッション属性は、ゲームセッションの詳細をリクエストすると返されます。
- OSS
- Unity
FOnlineSubsystemAccelByte* AccelByteOSS = static_cast<FOnlineSubsystemAccelByte*>(IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM));
if(AccelByteOSS == nullptr)
{
// AccelByteOSSが見つからない場合は中止
return;
}
FOnlineSessionV2AccelBytePtr SessionInterface = StaticCastSharedPtr<FOnlineSessionV2AccelByte>(AccelByteOSS->GetSessionInterface());
// 属性値を取得
FString Attribute{};
SessionInterface->GetSessionSettings(NAME_GameSession)->Get(FName("attributename"), Attribute);
var session = AccelByteSDK.GetClientRegistry().GetApi().GetSession();
var sessionId = "abc123"; // ここにセッションIDを挿入
session.GetGameSessionDetailsBySessionId(sessionId, result =>
{
{
if (result.IsError)
{
// GetGameSessionDetailsBySessionIdでエラーが発生した場合に何かを実行
Debug.Log($"Error GetGameSessionDetailsBySessionId, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// GetGameSessionDetailsBySessionIdが成功した場合に何かを実行
Dictionary<string, object> sessionAttributes = result.Value.attributes;
}
});
セッションデータ更新の通知をリスニングする
セッションに更新があると、セッション内の各ユーザーに通知が送信されます。更新があるかどうかを知るために、この通知のリスナーを追加できます。
- OSS
- Unity
FOnlineSubsystemAccelByte* AccelByteOSS = static_cast<FOnlineSubsystemAccelByte*>(IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM));
if(AccelByteOSS == nullptr)
{
// AccelByteOSSが見つからない場合は中止
return;
}
FOnlineSessionV2AccelBytePtr SessionInterface = StaticCastSharedPtr<FOnlineSessionV2AccelByte>(AccelByteOSS->GetSessionInterface());
UpdateNotificationHandle = SessionInterface->AddOnSessionUpdateReceivedDelegate_Handle(FOnSessionUpdateReceivedDelegate::CreateLambda(
[&UpdateNotificationHandle, &SessionInterface_User2](FName SessionName) {
// セッション更新デリゲートが受信されたら何かを実行
}));
var lobby = AccelByteSDK.GetClientRegistry().GetApi().GetLobby();
lobby.SessionV2GameSessionUpdated += result =>
{
if (result.IsError)
{
// SessionV2GameSessionUpdatedでエラーが発生した場合に何かを実行
Debug.Log($"Error SessionV2GameSessionUpdated, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// SessionV2GameSessionUpdatedが正常に受信された場合に何かを実行
Dictionary<string, object> sessionAttributes = result.Value.attributes;
};