C++ 用 Play Games サービス

Google Play ゲームサービス C++ SDK は、Google Play ゲームサービスで使用する C++ API を提供しており、ゲームの C++ 版をすでに実装済みのデベロッパー向けです。

この SDK は現時点では、以下のサービスを提供しています。

  • 認証
  • 実績
  • リーダーボード
  • イベント
  • 保存済みゲーム
  • Nearby Connections(Android のみ)
  • プレーヤーの統計情報

コンセプト

概略としては、以下の手順で SDK を使用します。

  1. Android 向けにプラットフォーム構成をセットアップします。
  2. GameServices::Builder を使用して、GameServices オブジェクトを構成して作成します。GameServices オブジェクトは自動的にログインを試行し、その結果を OnAuthActionFinished() コールバックを通じて返します。コールバックで返された結果をメモしておきます。自動ログインの試行が失敗した場合、ログインできるボタンをユーザーに表示することができます。
  3. OnAuthActionFinished() 結果を受け取ると、GameServices オブジェクトとその子の Manager を使って、次のような Play ゲームサービスを呼び出すことができます。

    • ログイン(認証失敗後): 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 を一時停止や再開するときに再度初期化する必要はありません。

    // 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. Manager クラスを使用して GameServices オブジェクトを管理します。複数の Manager に、GameServices インスタンスやグループ関連の機能から同時にアクセスできます。例として、実績やリーダーボードの Manager が挙げられます。Manager の状態がユーザーに表示されることはありません。Manager は参照渡しで返され、それを含む GameServices インスタンスがそのライフサイクルを制御します。クライアントは、Manager の参照を直接保持せずに、代わりに、GameServices インスタンス上で保持する必要があります。

    Manager は、変更不能な値型のオブジェクトを介してデータを返します。クエリが行われた場合、その時点におけるデータに基づく一貫したビューがこれらの値に反映されます。

    // Submit a high score
    game_services_->Leaderboards().SubmitScore(leaderboard_id, score);
    
    // Show the default Achievements UI
    game_services_->Achievements().ShowAllUI();
    
  4. GameServices オブジェクトの使用を終えたら、オブジェクトを所有する unique_ptr に対して reset() を呼び出すか、スコープ外になった unique_ptr が自動的に破棄されることで、クリーンアップします。

スレッドモデル

特に記載のない限り、GameServices と Manager のすべてのメソッドは、スレッドセーフで、非同期に実装されます。外部ロックを行わず、どのスレッドでも呼び出すことが可能で、呼び出された順に実行されます。

状態を読み取る Accessor メソッドには、主に 2 種類のバリアントがあります。1 つは、FetchProperty() のような名前のメソッドで、コールバックに対して非同期に結果を返します。もう 1 つは 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);});

ユーザーのコールバックはすべて、専用のコールバック スレッドで呼び出されます。このスレッドは、「メインスレッド」または「UI スレッド」のようなプラットフォームのコンセプトとは異なることがあります。また、ユーザーのコールバックはすみやかに実行を図る必要があります。処理の滞ったコールバック スレッドは、ユーザーが感知するような問題(たとえば、ログアウト リクエストの完了の遅延)を引き起こすことがあります。

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

Android で Play ゲーム C++ SDK を使い始めるには、引き続きクイックスタート ガイドをご覧ください。

参考資料

詳細については、Google Play ゲームサービス C++ SDK に付属のクラスに関するドキュメントをご覧ください。また、サンプルページで SDK の使用方法の例をご確認ください。

ゲームでバックエンド サーバーを使用している場合は、Google Play Games サービスへのサーバー側アクセスの有効化をご覧ください。