Unity Authentication を用いて匿名サインイン処理を行う【Unity Gaming Services】

Unity Authentication

Unity 公式の認証サービスです.匿名サインイン処理や各プラットフォームごとのサインイン処理のAPIが提供されています.
執筆段階では Beta 版です.

匿名サインインのサンプルプロジェクト

匿名サインインのサンプルプロジェクトを作成したので,よかったら参考にしてみてください.

github.com

検証環境

  • Unity 2021.1.26f1
  • Unity Authentication 1.0.0-pre.6
  • UniRx 7.1.0
  • UniTask 2.2.5
  • Zenject 9.2.0

動作の様子

gyazo.com

解説

インストール

Add Package by Name に com.unity.services.authentication を追加することで完了します.
f:id:xrdnk:20211023151155p:plain

あるいは 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 の場合は AuthenticationExceptionRequestFailedException の二種類の例外があります.
前者は認証エラー時の例外,後者は純粋なリクエストエラー時の例外です.
各例外の 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.IsSignedIntrue になります.

サインアウト処理

        /// <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