# Google

> Provide a Google sign-in option to enable players to authenticate using their Google accounts in your game.

###### 最小 SDK バージョン: 2.0.0

> **Note:**
>
> **ノート**: 以下のコード サンプルが機能するためには、正しい SDK とプラグインのバージョンを使用してください。

ここでは、Google アカウントを使用してゲーム内でのプレイヤーの認証を設定する以下のシナリオについて説明します。

* Google サインインを設定する。
* 戻ってきたプレイヤーをサインインする、または新しいプレイヤーを作成する。
* 匿名ログインから Google アカウントを介したプラットフォームログインへとプレイヤーを更新する。

ゲーム内のプレイヤーに Google サインインのオプションを提供するには、Google Play Console でアプリケーションを作成し、Google Play Games plugin for Unity v10.14 をインストールしてプレイヤーをサインインし、アクセストークンを取得してください。Firebase や Google などの他のサービスに対してプレイヤーを識別するオープン認証 (ID) アクセストークンが必要です。

```cs
{
    ((PlayGamesLocalUser)Social.localUser).GetIdToken()
}
```

v10.14 以降を実行しているプラグイン バージョンについては、[Google Play Games](./google-play-games.md) を参照してください。

> **Note:**
>
> **ノート**: 以下のコード例は、プレイヤーの Google ID トークンをすでに取得済みであることを前提としています。

## Google サインインを設定する##set-up-a-google-sign-in

**ノート**: Google サインインは、Play Games Services v1 SDK を使用している [Google Play Games plugin for Unity v10.14](https://github.com/playgameservices/play-games-plugin-for-unity/releases/tag/v10.14) 以前でサポートされています。

1. Google Play Games [plugin](https://github.com/playgameservices/play-games-plugin-for-unity/releases/tag/v10.14) for Unity v10.14 をダウンロードし、インポートします。
2. アプリケーションを設定して Google サインインを有効にします。Google サインインを有効にするための [ゲームの設定](https://developer.android.com/games/pgs/unity/unity-start) 方法については、Google のドキュメントに従ってください。
3. Unity Authentication について、ID プロバイダーを Google に設定します。
   1. Unity エディターメニューで、**Edit** (編集) > **Project Settings...** (プロジェクト設定...) を選択し、ナビゲーションメニューから **Services** (サービス) > **Authentication** を選択します。
   2. **ID Providers** (ID プロバイダー) を **Google** に設定し、**Add** (追加) を選択します。
   3. **ウェブアプリケーションクライアント ID** を **Client ID** テキストフィールドに入力し、**Save** (保存) を選択します。

> **Note:**
>
> **ノート**: Authentication SDK を使用するには、プラグインの設定ダイアログで **ウェブアプリケーションクライアント ID** を設定する必要があります。

```cs
void InitializePlayGamesLogin()
{
    var config = new PlayGamesClientConfiguration.Builder()
        // Requests an ID token be generated.
        // This OAuth token can be used to
        // identify the player to other services such as Firebase.
        .RequestIdToken()
        .Build();

    PlayGamesPlatform.InitializeInstance(config);
    PlayGamesPlatform.DebugLogEnabled = true;
    PlayGamesPlatform.Activate();
}

void LoginGoogle()
{
    Social.localUser.Authenticate(OnGoogleLogin);
}

void OnGoogleLogin(bool success)
{
    if (success)
    {
        // Call Unity Authentication SDK to sign in or link with Google.
        Debug.Log("Login with Google done. IdToken: " + ((PlayGamesLocalUser)Social.localUser).GetIdToken());
    }
    else
    {
        Debug.Log("Unsuccessful login");
    }
}
```

## 戻ってきたプレイヤーのサインインまたは新しいプレイヤーの作成##sign-in-a-returning-player-or-create-new-player

`SignInWithGoogleAsync` メソッドを使用して、以下のいずれかを行います。

* Google の認証情報を使用して新しい Unity Authentication プレイヤーを作成する。
* Google の認証情報を使用して既存のプレイヤーをサインインする。

```cs
async Task SignInWithGoogleAsync(string idToken)
{
    try
    {
        await AuthenticationService.Instance.SignInWithGoogleAsync(idToken);
        Debug.Log("SignIn is successful.");
    }
    catch (AuthenticationException ex)
    {
        // Compare error code to AuthenticationErrorCodes
        // Notify the player with the proper error message
        Debug.LogException(ex);
    }
    catch (RequestFailedException ex)
    {
        // Compare error code to CommonErrorCodes
        // Notify the player with the proper error message
        Debug.LogException(ex);
    }
}
```

## プレイヤーを匿名から Google アカウントへと更新する##update-a-player-from-anonymous-to-a-google-account

匿名認証を設定した後、プレイヤーが匿名からアップグレードし、Google アカウントを作成してサインインすることを希望する場合は、ゲームのプレイヤーにプロンプトを表示し、Google サインインをトリガーして Google から ID トークンを取得するよう求める必要があります。その後、`LinkWithGoogleAsync` API を呼び出して、プレイヤーを Google ID トークンにリンクします。

キャッシュされたプレイヤーが SDK に存在する場合は、キャッシュされたプレイヤーを Google アカウントにリンクできます。

1. `SignInAnonymouslyAsync` を使用して、キャッシュされたプレイヤーのアカウントにサインインします。
2. `LinkWithGoogleAsync` を使用して、キャッシュされたプレイヤーのアカウントを Google アカウントにリンクします。

```cs
async Task LinkWithGoogleAsync(string idToken)
{
    try
    {
        await AuthenticationService.Instance.LinkWithGoogleAsync(idToken);
        Debug.Log("Link is successful.");
    }
    catch (AuthenticationException ex) when (ex.ErrorCode == AuthenticationErrorCodes.AccountAlreadyLinked)
    {
        // Prompt the player with an error message.
        Debug.LogError("This user is already linked with another account. Log in instead.");
    }

    catch (AuthenticationException ex)
    {
        // Compare error code to AuthenticationErrorCodes
        // Notify the player with the proper error message
        Debug.LogException(ex);
    }
    catch (RequestFailedException ex)
    {
        // Compare error code to CommonErrorCodes
        // Notify the player with the proper error message
        Debug.LogException(ex);
    }
}
```

## Google アカウントのリンク解除##unlink-google-account

`UnlinkGoogleAsync` API を使用して、プレイヤーが自身の Google アカウントをリンク解除できるようにします。リンク解除後、そのアカウントが他のどの ID にもリンクされていない場合、そのアカウントは匿名アカウントに遷移します。

```cs
async Task UnlinkGoogleAsync(string idToken)
{
   try
   {
       await AuthenticationService.Instance.UnlinkGoogleAsync(idToken);
       Debug.Log("Unlink is successful.");
   }
   catch (AuthenticationException ex)
   {
       // Compare error code to AuthenticationErrorCodes
       // Notify the player with the proper error message
       Debug.LogException(ex);
   }
   catch (RequestFailedException ex)
   {
       // Compare error code to CommonErrorCodes
       // Notify the player with the proper error message
       Debug.LogException(ex);
   }
}
```
