C++用の Playゲームサービスを始める



  • この記事は、Google Playゲームサービスに関する記事を和訳したものです。
  • 原文: Get Started with Play Games Services for C++
  • 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
  • 自己責任でご利用ください。
  • 和訳した時期は 2019年7月ころです。

Google Playゲームサービス C++ SDKは、Google Playゲームサービスを使用するための C++の APIを提供し、それは、彼らのゲームに既存の C++の実装を持っている開発者向けのものです。

現在、SDKは次のサービスを実装しています:

  • 認証
  • 実績
  • リーダーボード
  • ターンベース型マルチプレイヤー
  • リアルタイム型マルチプレイヤー
  • イベントとクエスト
  • セーブドゲーム
  • Nearby接続(Androidのみ)
  • プレイヤーの統計情報

コンセプト

高いレベルでは、次の手順に従って SDKを使用します:

  1. Android用のプラットフォームの構成をセットアップします。
  2. GameServicesオブジェクトを構成し、構築するために、GameServices::Builderを使用します。 GameServicesオブジェクトは自動的にサインインしようと試み、OnAuthActionFinished()コールバックを経由して結果を返します。 コールバックによって返された結果をメモしてください。 もし自動的なサインインの試みが失敗したならば、ユーザにサインインさせるためのボタンを表示することができます。
  3. OnAuthActionFinished()結果を受け取った後、以下のような Playゲームサービスの呼び出しをするために、GameServicesオブジェクトとその子のマネジャーを使用することができます:

    • サインインさせる(認証に失敗した後に): StartAuthorizationUI()
    • 実績をアンロックする: Achievements().Unlock()
    • ビルトインの UIを使用して実績を表示する: Achievements().ShowAllUI()
    • ハイスコアを提出する: Leaderboards().SubmitScore()
    • サインアウトさせる: SignOut()
  4. GameServicesオブジェクトを使用し終えたとき、それをリセットあるいは破壊します。

より詳細なレベルでは:

  1. プラットフォームの構成を初期化します: これはプラットフォーム固有の初期化情報を含むオブジェクトです。 Androidでは、プラットフォームの構成は、Java VMと、現在の Activityへのポインタを含んでいます:

    // In android_main(), create a platform configuration
    // and bind the object activity.
    // Alternately, attach the activity in JNI_Onload().
    gpg::AndroidPlatformConfiguration platform_configuration;
    platform_configuration.SetActivity(state->activity->clazz);
    
  2. GameServicesオブジェクトを構築します: このオブジェクトは、Google Playゲームサービスの機能のための主要なエントリポイントです。 GameServicesインスタンスは GameServices::Builderを用いて作成されます。

    ほとんどの実装では、与えられた GameServicesオブジェクトは、あなたの C環境がする限り保持されるでしょう; あなたの Androidの Activityが pauseし resumeしたとき、それを再び初期化する必要はありません。

    // Creates a GameServices object that has lambda callbacks.
    game_services_ = gpg::GameServices::Builder()
            .SetDefaultOnLog(gpg::LogLevel::VERBOSE)
            .SetOnAuthActionStarted([started_callback](gpg::AuthOperation op) {
                is_auth_in_progress_ = true;
                started_callback(op);
            })
            .SetOnAuthActionFinished([finished_callback](gpg::AuthOperation op,
                                                         gpg::AuthStatus status) {
                LOGI("Sign in finished with a result of %d", status);
                is_auth_in_progress_ = false;
                finished_callback(op, status);
            })
            .Create(pc);
    
  3. あなたの GameServicesオブジェクトを管理するためにマネジャークラスを使用します。 マネジャーは GameServicesインスタンス、および、一緒に機能を関連されたグループからアクセスされます。 これらの例は、実績およびリーダーボードのマネジャーを含んでいます。 それらは、ユーザに見える状態それら自体を含んでいません。 マネジャーは参照によって返され、含んでいる GameServicesインスタンスはそれらのライフサイクルを制御します。 あなたのクライアントはマネジャーの参照を保持しないでください。 代わりに、あなたのクライアントは GameServicesインスタンスを保持する必要があります。

    マネジャーはイミュータブルな値の型のオブジェクトを経由してデータを返します。 これらの値は、クエリが作成された時点での基礎となるデータの一貫性のあるビューを反映しています。

    // Submit a high score
    game_services_->Leaderboards().SubmitScore(leaderboard_id, score);
    
    // Show the default Achievements UI
    game_services_->Achievements().ShowAllUI();
    
  4. GameServicesオブジェクトを使用し終えたとき、それを所有する unique_ptrreset()を呼び出すことによって、あるいは、unique_ptrをスコープの外に移行するときに自動的に破壊させることによって、クリーンアップします。

スレッドモデル

特に記載のない限り、すべての GameServicesとマネジャーメソッドは、スレッドセーフで非同期的な実装を持っています。 それらは外部ロックを用いずに任意のスレッドで呼び出されることができ、呼び出しの順序と一貫して順に実行されます。

アクセサメソッド(状態を読むもの)は、2つの主要なバリアントが提供されます。 メソッドの第 1のタイプ(FetchProperty()のような名前を伴う)は、その結果を提供されたコールバックに非同期的に提供します; 第 2(FetchPropertyBlocking()のような名前を伴う)は、その結果を呼び出しスレッドに同期的に返します。

// Blocking callback
gpg::AchievementManager::FetchAllResponse fetchResponse =
        game_services_->Achievements().FetchAllBlocking(std::chrono::milliseconds(1000));

// Non-blocking callback
game_services_->Achievements().FetchAll(gpg::DataSource::CACHE_OR_NETWORK,
    [] (gpg::AchievementManager::FetchAllResponse response) {
    LogI("Achievement response status: %d", response.status);});

すべてのユーザコールバックは専用のコールバックスレッド上で呼び出されます。 このスレッドは、任意のプラットフォームの "main thread" あるいは "UI thread" のコンセプトとは潜在的に別個のものです。 ユーザコールバックが迅速に実行されることも確認してみてください; ストールされたコールバックスレッドがユーザに見える問題を引き起こすかもしれません(例えば、サインアウトのリクエストの完了が遅延する)。

プラットフォーム固有の情報

Android上で Playゲーム C++ SDKを使用し始めるには、Android上で C++用の Playゲームサービスを始めるに進んでください。

参考文献

詳細については、Google Playゲームサービス C++ SDKで提供されるクラスのドキュメントを読み、SDKを使用する方法をデモンストレーションする samplesをチェックアウトしてください。