AGS Game SDK を使用してログインする - デバイス ID でログインする - (Unity モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
ラッパーを開く
このチュートリアルでは、デバイス ID を使用してログインするために、AGS ソフトウェア開発キット (SDK) を使用して AccelByte Gaming Services (AGS) を実装する方法を学びます。
Byte Wars には、AuthEssentialsWrapper クラスで定義されたゲームインスタンスラッパーがあります。このラッパーは、AGS にログインリクエストを送信するために使用されます。このチュートリアルでは、AuthEssentialsWrapper クラスのスターターバージョンである AuthEssentialsWrapper_Starter ラッパーを使用して、機能をゼロから実装します。
スターターパックの内容
このチュートリアルに従うには、AuthEssentialsWrapper_Starter というスターターラッパークラスを使用します。このラッパーは次のファイルで定義されています。
- C# ファイル:
Assets/Resources/Modules/Access/AuthEssentials/Scripts/AuthEssentialsWrapper_Starter.cs
AuthEssentialsWrapper_Starter クラスには、いくつかの事前定義されたコンポーネントが含まれています。
-
AGS SDK インターフェースを参照するためのヘルパー変数。これらの変数は、ラッパーが初期化されるときに割り当てられます。
private User user;
private UserProfiles userProfiles;
private Lobby lobby;
private void Start()
{
user = AccelByteSDK.GetClientRegistry().GetApi().GetUser();
userProfiles = AccelByteSDK.GetClientRegistry().GetApi().GetUserProfiles();
lobby = AccelByteSDK.GetClientRegistry().GetApi().GetLobby();
} -
ログイン関数を呼び出すときに使用されるオプションパラメータを保持する変数。これは、後でログインキューを統合する予定がある場合に便利ですが、統合しない場合でも使用できます。パラメータを未設定のままにしておくだけです。
// Optional Parameters
public LoginV4OptionalParameters OptionalParameters = new();
AGS Game SDK を使用してログインを実装する
-
AuthEssentialsWrapper_Starterクラスを開き、デバイス ID を使用してログインリクエストを送信する新しい関数を作成します。リクエストが完了すると、コールバック関数が呼び出されます。public void LoginWithDeviceId(ResultCallback<TokenData, OAuthError> resultCallback)
{
LoginWithDeviceIdV4OptionalParameters optionalParams = new LoginWithDeviceIdV4OptionalParameters
{
OnQueueUpdatedEvent = OptionalParameters.OnQueueUpdatedEvent,
OnCancelledEvent = OptionalParameters.OnCancelledEvent,
CancellationToken = OptionalParameters.CancellationToken
};
user.LoginWithDeviceIdV4(
optionalParams,
result => OnLoginCompleted(result, resultCallback));
} -
新しい関数を作成して、アカウントが新規の場合にユーザープロファイルを作成または取得します。このプロファイルは、アカウントのセットアップを完了するために必要です。
private void CreateOrGetUserProfile(ResultCallback<UserProfile> resultCallback)
{
userProfiles.GetUserProfile((Result<UserProfile> getUserProfileResult) =>
{
// If not found because it is not yet created, then try to create one.
if (getUserProfileResult.IsError &&
getUserProfileResult.Error.Code == ErrorCode.UserProfileNotFoundException)
{
CreateUserProfileRequest request = new CreateUserProfileRequest()
{
language = System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName,
timeZone = TutorialModuleUtil.GetLocalTimeOffsetFromUTC(),
};
userProfiles.CreateUserProfile(request, resultCallback);
return;
}
resultCallback.Invoke(getUserProfileResult);
});
} -
ユーザー ID、表示名、アバター URL などの公開ユーザーデータを取得する新しい関数を作成します。
private void GetUserPublicData(string userId, ResultCallback<AccountUserPlatformInfosResponse> resultCallback)
{
user.GetUserOtherPlatformBasicPublicInfo("ACCELBYTE", new string[] { userId }, resultCallback);
} -
次に、ログイン結果を処理するコールバック関数を作成します。ログインが成功した場合、いくつかのアクションを実行します。AGS ロビーに接続し、ユーザープロファイルを取得または作成し、公開ユーザーデータを取得してローカルにキャッシュします。
private void OnLoginCompleted(
Result<TokenData, OAuthError> loginResult,
ResultCallback<TokenData, OAuthError> resultCallback = null)
{
// Abort if login failed.
if (loginResult.IsError)
{
BytewarsLogger.Log($"Failed to login. Error: {loginResult.Error.error}");
resultCallback?.Invoke(loginResult);
return;
}
// Connect to the lobby if not already connected.
if (!lobby.IsConnected)
{
lobby.Connect();
}
// Get user profile.
TokenData tokenData = loginResult.Value;
BytewarsLogger.Log("Login successful. Retrieving user profile and info.");
CreateOrGetUserProfile((Result<UserProfile> userProfileResult) =>
{
// Abort if failed to retrieve or create user profile.
if (userProfileResult.IsError)
{
BytewarsLogger.LogWarning($"Failed to retrieve or create user profile. Error: {userProfileResult.Error.Message}");
resultCallback?.Invoke(Result<TokenData, OAuthError>.CreateError(new OAuthError() { error = userProfileResult.Error.Message }));
return;
}
// Get public user info.
GetUserPublicData(tokenData.user_id, (Result<AccountUserPlatformInfosResponse> userInfoResult) =>
{
// Abort if failed to get user info.
if (userInfoResult.IsError || userInfoResult.Value.Data.Length <= 0)
{
BytewarsLogger.LogWarning($"Failed to retrieve user info. Error: {userInfoResult.Error.Message}");
resultCallback?.Invoke(Result<TokenData, OAuthError>.CreateError(new OAuthError() { error = userInfoResult.Error.Message }));
return;
}
// Cache the public user info in the game.
AccountUserPlatformData publicUserData = userInfoResult.Value.Data[0];
GameData.CachedPlayerState.PlayerId = publicUserData.UserId;
GameData.CachedPlayerState.AvatarUrl = publicUserData.AvatarUrl;
GameData.CachedPlayerState.PlayerName = AccelByteWarsOnlineUtility.GetDisplayName(publicUserData);
GameData.CachedPlayerState.PlatformId =
string.IsNullOrEmpty(GameData.CachedPlayerState.PlatformId) ?
tokenData.platform_id : GameData.CachedPlayerState.PlatformId;
resultCallback.Invoke(loginResult);
});
});
} -
次に、ログアウトリクエストを送信する関数を作成します。
public void Logout(Action action)
{
user.Logout(result => OnLogoutComplete(result, action));
} -
最後に、ログアウト結果を処理するコールバック関数を作成します。
private void OnLogoutComplete(Result result, Action callback)
{
if (!result.IsError)
{
BytewarsLogger.Log("Logout successful");
callback?.Invoke();
}
else
{
BytewarsLogger.Log($"Logout failed. Error message: {result.Error.Message}");
}
}
リソース
-
このチュートリアルで使用されているファイルは、Unity Byte Wars GitHub リポジトリで入手できます。