Unity Authentication を用いて匿名サインイン処理を行う【Unity Gaming Services】
Unity Authentication
Unity 公式の認証サービスです.匿名サインイン処理や各プラットフォームごとのサインイン処理のAPIが提供されています. 執筆段階では Beta 版です.
匿名サインインのサンプルプロジェクト
匿名サインインのサンプルプロジェクトを作成したので,よかったら参考にしてみてください.
検証環境
- Unity 2021.1.26f1
- Unity Authentication 1.0.0-pre.6
- UniRx 7.1.0
- UniTask 2.2.5
- Zenject 9.2.0
動作の様子
解説
インストール
Add Package by Name に com.unity.services.authentication
を追加することで完了します.
あるいは manifest.json に以下を追加すればできます.
"dependencies": { "com.unity.services.authentication": "1.0.0-pre.6", }
初期化処理
Unity Authentication を利用する前に,まずは Unity Game Services の Core の初期化処理を行う必要があります. 非同期処理なので,UniTask が利用できます.
await UnityServices.InitializeAsync();
今回では引数なしの方を利用しましたが,オプション設定がある場合は以下の API が提供されています.
async Task InitializeAsync(InitializationOptions options);
Task 型のため,初期化が完了したかどうかの判定は,ServicesInitializationState State
から取得することになります.
public bool IsInitialized => UnityServices.State == ServicesInitializationState.Initialized;
匿名サインイン
/// <summary> /// 匿名サインイン処理 /// </summary> public async UniTask<bool> SignInAnonymously() { if (!IsInitialized) { Debug.Log("まだ初期化処理が完了していません."); return false; } if (IsSignedIn) { Debug.Log("すでにサインイン処理が完了しています."); return true; } // サインイン成功・失敗,サインアウト時のコールバック登録 AuthenticationService.Instance.SignedIn += SignedInCallback; AuthenticationService.Instance.SignInFailed += SignedInFailedCallback; AuthenticationService.Instance.SignedOut += SignedOutCallback; // 匿名サインイン処理 try { await AuthenticationService.Instance.SignInAnonymouslyAsync(); } // 認証エラー発生時の例外処理 catch (AuthenticationException ex) { Debug.LogException(ex); Debug.LogError($"エラーコード: {ex.ErrorCode}"); } // リクエストエラー発生時の例外処理 catch (RequestFailedException ex) { Debug.LogException(ex); Debug.LogError($"エラーコード: {ex.ErrorCode}"); } _signedInSubject.OnNext((IsSignedIn, PlayerId)); return IsSignedIn; }
匿名サインインする前に UGS の初期化処理が済んだかどうか,すでにサインイン済かのガード節を入れています. また,サインイン成功,サインイン失敗,サインアウト時のコールバック登録も行います.
匿名サインインの API は以下のようになります.
await AuthenticationService.Instance.SignInAnonymouslyAsync();
サーバーにリクエストを送るので,例外が起こることもあります.しっかり例外処理を入れておきます.
SignInAnonymousLyAsync
の場合は AuthenticationException
と RequestFailedException
の二種類の例外があります.
前者は認証エラー時の例外,後者は純粋なリクエストエラー時の例外です.
各例外の API を見ると整数型のエラーコードが降ってくるのでありがたいです.
// 認証エラー発生時の例外処理 catch (AuthenticationException ex) { Debug.LogException(ex); Debug.LogError($"エラーコード: {ex.ErrorCode}"); } // リクエストエラー発生時の例外処理 catch (RequestFailedException ex) { Debug.LogException(ex); Debug.LogError($"エラーコード: {ex.ErrorCode}"); }
サインインに成功すれば,AuthenticationService.Instance.SignedIn
に,
サインインに失敗すれば,AuthenticationService.Instance.SignInFailed
に登録されたコールバックが呼び出されます.
プレイヤーIDを取得したい場合は AuthenticationService.Instance.PlayerId
から取得することができます.
サインインに成功した場合は AuthenticationService.Instance.IsSignedIn
が true
になります.
サインアウト処理
/// <summary> /// サインアウト処理 /// </summary> public void SignOut() { if (!IsInitialized) { Debug.Log("まだ初期化処理が完了していません."); return; } if (!IsSignedIn) { Debug.Log("サインインしていません."); return; } // サインアウト処理 _signedOutSubject.OnNext(Unit.Default); AuthenticationService.Instance.SignOut(); // コールバック解除 AuthenticationService.Instance.SignedIn -= SignedInCallback; AuthenticationService.Instance.SignInFailed -= SignedInFailedCallback; AuthenticationService.Instance.SignedOut -= SignedOutCallback; }
AuthenticationService.Instance.SignOut()
を叩くとサインアウトが完了します.
他のサインイン処理
匿名処理以外のサインイン処理は以下があります.どちらも上記で説明した2種類の例外を吐きます.
/// <summary> /// 端末に保存されているセッショントークンを使って、現在のプレーヤーにサインイン /// </summary> Task SignInWithSessionTokenAsync(); /// <summary> /// AppleのIDトークンを使ってサインイン /// </summary> Task SignInWithAppleAsync(string idToken); /// <summary> /// GoogleのIDトークンを使ってサインイン /// </summary> Task SignInWithGoogleAsync(string idToken); /// <summary> /// Facebookのアクセストークンを使ってサインイン /// </summary> Task SignInWithFacebookAsync(string accessToken); /// <summary> /// Steamのセッションチケットを使ってサインイン /// </summary> Task SignInWithSteamAsync(string sessionTicket); /// <summary> /// 現在のプレーヤーと外部プロバイダーとのサインイン /// </summary> Task SignInWithExternalTokenAsync(ExternalTokenRequest externalToken);
参考資料
ドキュメントが丁寧なので,読むだけですぐできると思います. docs.unity.com