Google Play ゲームサービス C++ SDK は、Google Play ゲームサービスで使用する C++ API を提供しており、ゲームの C++ 版をすでに実装済みのデベロッパー向けです。
この SDK は現時点では、以下のサービスを提供しています。
- 認証
- 実績
- リーダーボード
- ターン制マルチプレーヤー型ゲーム
- リアルタイム マルチプレーヤー型ゲーム
- イベントとクエスト
- 保存済みゲーム
- Nearby Connections(Android のみ)
- プレーヤーの統計情報
コンセプト
概略としては、以下の手順で SDK を使用します。
- Android 向けにプラットフォーム構成をセットアップします。
GameServices::Builder
を使ってGameServices
オブジェクトを設定、構築します。GameServices
オブジェクトは自動的にログインを試行し、その結果をOnAuthActionFinished()
のコールバックを通じて返します。コールバックで返された結果をメモしておきます。自動ログインの試行が失敗した場合、ログインできるボタンをユーザーに表示することができます。OnAuthActionFinished()
という結果を受け取ると、GameServices
とその子の Manager を使って以下のような Play ゲームサービスを呼び出すことができます。- ログイン(認証失敗後):
StartAuthorizationUI()
- 実績のロック解除:
Achievements().Unlock()
- 組み込みの UI を使った実績の表示:
Achievements().ShowAllUI()
- ハイスコアの送信:
Leaderboards().SubmitScore()
- ログアウト:
SignOut()
- ログイン(認証失敗後):
使用を終えた
GameServices
オブジェクトは、リセットまたは破棄します。
詳細な手順:
プラットフォーム構成の初期化: プラットフォーム固有の初期化情報を含むオブジェクトです。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);
GameServices
オブジェクトの構築: このオブジェクトは Google Play ゲームサービス機能のメインのエントリ ポイントとなります。GameServices
インスタンスはGameServices::Builder
を使って作成します。ほとんどの実装では、特定の
GameServices
オブジェクトはお使いの C 環境が存続する限り保持されます。AndroidActivity
を一時停止や再開するときに再度初期化する必要はありません。// 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);
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();
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 の使用方法の例をご確認ください。