TapTapTap!!!(45)~アルファ版の Google Play Games のサインインを行う~

TapTapTap!!!(44)~Unity ベータ版 2018.3.0b5 用に設定を行う~では Unity のベータ版をインストールしたことによって変わってしまったゲーム画面の調整等を行った。今回は以前からうまく行っていない、Google Play Games へのサインインに再度挑戦する。

1.参考サイト

サインインに再挑戦するにあたり、くらげになりたい。様のサイトが参考になりそうだったので、こちらを参考に「TapTapTap!!!」の改良を行っていきたいと思う。

2.Google Play Games 用のスクリプトを作成する。

Google Play Games 用のスクリプトでは、「サインイン」、「サインアウト」、「実績解除」、「スコアの登録」を行うメソッドを作成する。今回、改良した点としては各処理の中ですでにサインインが完了しているかを判定する処理を加えている。これによってサインインエラーによって強制終了することがなくなることおよび無駄なサインイン処理をなくすことを狙っている。ここではクラス名を「GPGManager」としている。※ GPG は Google Play Games の略

[cce_csharp]using GooglePlayGames;
using GooglePlayGames.BasicApi;
using System.Reflection;
using UnityEngine;

public class GPGManager : MonoBehaviour
{
    /// <summary>
    /// スクリプトの開始
    /// </summary>
    void Start()
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        // Google Play Games へログイン済みか判定する
        if (!IsLogined())
        {
            // クライアントの設定
            PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().Build();
            PlayGamesPlatform.InitializeInstance(config);
            PlayGamesPlatform.DebugLogEnabled = true;
            PlayGamesPlatform.Activate();
        }
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }

    /// <summary>
    /// Google Play Games の処理完了時のコールバックメソッド
    /// </summary>
    /// <param name="success"></param>
    public delegate void GPGExecute(bool success);

    /// <summary>
    /// Google Play Games へのサインイン
    /// </summary>
    /// <param name="method">サインイン処理完了時のコールバックメソッド</param>
    public void SignIn(GPGExecute method)
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        Social.localUser.Authenticate((bool success) =>
        {
            method(success);
        });
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }

    /// <summary>
    /// Google Play Games からのサインアウト
    /// </summary>
    public void SingOut()
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        PlayGamesPlatform.Instance.SignOut();
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }

    /// <summary>
    /// Google Play Games へのサインイン状態の確認
    /// </summary>
    /// <returns>サインイン状態</returns>
    public bool IsLogined()
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        return Social.localUser.authenticated;
    }
    /// <summary>
    /// 連続タップした
    /// </summary>
    /// <param name="method">Google Play Games の処理完了時のコールバック</param>
    public void ContinuityTap(int count, GPGExecute method)
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        if (count == 8)
        {
            GooglePlayAchievement(GPGSIds.achievement_8, method);
        }
        else if (count == 50)
        {
            GooglePlayAchievement(GPGSIds.achievement_50, method);
        }
        else if (count == 100)
        {
            GooglePlayAchievement(GPGSIds.achievement_100, method);
        }
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }
    /// <summary>
    /// 実績解除特定のレベルに到達した
    /// </summary>
    /// <param name="method">Google Play Games の処理完了時のコールバック</param>
    public void ReachedLEVEL(int level, GPGExecute method)
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        if (level == 5)
        {
            GooglePlayAchievement(GPGSIds.achievement, method);
        }
        else if (level == 10)
        {
            GooglePlayAchievement(GPGSIds.achievement_2, method);
        }
        else if (level == 20)
        {
            GooglePlayAchievement(GPGSIds.achievement_3, method);
        }
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }

    /// <summary>
    /// プレイ回数
    /// </summary>
    /// <param name="method">Google Play Games の処理完了時のコールバック</param>
    public void PlayAnyTimes(GPGExecute method)
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        // 5回プレイした
        GooglePlayIncrementAchievement(GPGSIds.achievement_5, 20, method);
        // 10回プレイした
        GooglePlayIncrementAchievement(GPGSIds.achievement_10, 10, method);
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }
    /// <summary>
    /// レベルの登録
    /// </summary>
    /// <param name="level">レベル</param>
    /// <param name="method">Google Play Games の処理完了時のコールバック</param>
    public void RegisterLevel(int level, GPGExecute method)
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        GooglePlayScore(GPGSIds.leaderboard, level, method);
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }

    /// <summary>
    /// スコアの登録
    /// </summary>
    /// <param name="score">スコア</param>
    /// <param name="method">Google Play Games の処理完了時のコールバック</param>
    public void RegisterScore(int score, GPGExecute method)
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        GooglePlayScore(GPGSIds.leaderboard_2, score, method);
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }


    /// <summary>
    /// Google Play Games のスコア登録
    /// </summary>
    /// <param name="id">スコアID</param>
    /// <param name="point">スコア</param>
    /// <param name="method">Google Play Games の処理完了時のコールバック</param>
    private void GooglePlayScore(string id, int point, GPGExecute method)
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        // ログインしていない場合はスコアを登録しない
        if (!IsLogined())
        {
            method(false);
            MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
            return;
        }
        Social.ReportScore(point, id, (bool success) =>
        {
            method(success);
        });
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }

    /// <summary>
    /// GooglePlayGames 実績解除
    /// </summary>
    /// <param name="id">実績 ID</param>
    /// <param name="method">Google Play Games の処理完了時のコールバック</param>
    private void GooglePlayIncrementAchievement(string id, int increment, GPGExecute method)
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        // ログインしていない場合は実績を解除しない
        if (!IsLogined())
        {
            method(false);
            MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
            return;
        }
        PlayGamesPlatform.Instance.IncrementAchievement(id, increment, (bool success) =>
        {
            method(success);
        });
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }

    /// <summary>
    /// GooglePlayGames 実績解除
    /// </summary>
    /// <param name="id">実績 ID</param>
    /// <param name="method">Google Play Games の処理完了時のコールバック</param>
    private void GooglePlayAchievement(string id, GPGExecute method)
    {
        MyLogger.GetInstance().StartLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
        // ログインしていない場合は実績を解除しない
        if (!IsLogined())
        {
            method(false);
            MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
            return;
        }
        PlayGamesPlatform.Instance.ReportProgress(id, 100, (bool success) =>
        {
            method(success);
        });
        MyLogger.GetInstance().EndLog(this.GetType().Name, MethodBase.GetCurrentMethod().Name);
    }
}[/cce_csharp]

3.他のスクリプトとの調整を行う

今回「GPGManager」を作成したことによって「GoolePlayUtility」が不要となった。そこで、「GoolePlayUtility」を使っていた箇所を「GPGManager」に移行する。基本的には大きな変更はせず、以下のような変更となり、参照するクラスを変更するのみで対応できる。

[cce_csharp]GoolePlayUtility.ReachedLEVEL(level);
↓
GetComponent<GPGManager>().ReachedLEVEL(level, GPGExecute);[/cce_csharp]

4.Google Play コンソールにアップロードし動作確認を行う

Studio Fun の環境では無事サインインを行えた。あとはアルファ版テスターさんの環境で動作が行われるかが問題だ。相も変わらずテスターさんを募集しておりますので、テスターをご希望いただける方はお問い合わせまたは以下のフォームからご連絡ください。

%d人のブロガーが「いいね」をつけました。