開始使用 C 和 C++ 適用的 Play 遊戲服務

本指南將會說明如何設定原生 C 或 C++ 遊戲專案,以便使用 Play 遊戲服務第 2 版原生 SDK 並整合登入服務。必須整合登入功能,才能將其他 Play 遊戲服務功能整合至您的遊戲,並將 Play 遊戲服務整合至後端遊戲伺服器

支援的功能

Play 遊戲服務第 2 版原生 SDK 目前為 Beta 版,僅支援登入服務。尚未支援其他 Play 遊戲服務功能

API 參考說明文件

SDK 的標頭檔案包含 API 的參考說明文件。標頭檔案位於 SDK 檔案的 include 資料夾中,可在專案與 SDK 存放區同步後使用。

相關規定

  • 使用原生 C 或 C++ 做為主要程式設計語言的遊戲專案。

  • 遊戲專案和開發環境必須設定 Gradle 建構系統。

事前準備

您必須在 Google Play 管理中心設定 Play 遊戲服務

設定遊戲專案

如要設定遊戲專案,請完成下列步驟。

更新 CMakeLists.txt

CMakeLists.txt 檔案中,新增下列程式碼:

  find_package(com.google.android.gms.games.v2.c REQUIRED CONFIG)

  // link games_static for -DANDROID_STL=c++_static or default
  // link games_shared for -DANDROID_STL=c++_shared
  target_link_libraries(
    app PUBLIC com.google.android.gms.games.v2.c::games_static)

更新 build.gradle

在應用程式層級 build.gradle 檔案中,請按照下列步驟操作:

  • 確認已啟用 prefab 建構功能。

  • 新增 Play 遊戲服務第 2 版原生 SDK 的依附元件:

    • com.google.android.gms:play-services-games-v2-native-c:17.0.0-beta1

範例如下:

  android {
    ...
    buildFeatures {
      prefab true
    }
    ...
  }
  dependencies {
    ...
    implementation "com.google.android.gms:play-services-games-v2-native-c:17.0.0-beta1"
  }

更新 AndroidManifest.xml

  1. AndroidManifest.xml 檔案中,定義 Play 遊戲服務專案 ID。您可以在檔案中新增下列程式行,完成此操作:

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    
  2. 為專案 ID 建立字串資源。這樣一來,遊戲在建構時間就能存取 ID。如要建立資源,請建立 project_root/app/src/main/res/values/games-ids.xml 檔案並新增下列項目:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="game_services_project_id"
                translatable="false">add your Project ID here</string>
    </resources>
    
  3. 建構並測試遊戲。如果成功,啟動遊戲時,遊戲會顯示登入提示或成功的登入橫幅。

取得玩家 ID

遊戲只要擷取玩家 ID,即可存取已登入玩家的玩家資訊。您可以呼叫 GetPlayerID 函式來擷取玩家 ID,如以下範例所示。

#include <assert.h>
#include "gni/gni.h"
#include "gni/gni_task.h"
#include "pgs/pgs_play_games.h"
#include "pgs/pgs_players_client.h"

// A callback for a GniTask returned from PgsPlayersClient_getCurrentPlayerId.
void OnGetCurrentPlayerIdCompleteCallback(GniTask *task, void *user_data) {

   if (!GniTask_isSuccessful(task)) {
      const char *error_message = nullptr;
      GniTask_getErrorMessage(task, &error_message);

      // Log error message here.

      GniString_destroy(error_message);
      GniTask_destroy(task);
      return;
   }

   const char *result = nullptr;
   PgsPlayersClient_getCurrentPlayerId_getResult(task, &result);

   // Log player id here.

   GniString_destroy(result);
   GniTask_destroy(task);
}

// Gets the player ID.
void GetPlayerId(jobject main_activity) {
   static const PgsPlayersClient *players_client =
           PgsPlayGames_getPlayersClient(main_activity);

   GniTask *get_current_player_id_task =
           PgsPlayersClient_getCurrentPlayerId(players_client);
   assert(get_current_player_id_task != nullptr);
   GniTask_addOnCompleteCallback(get_current_player_id_task,
                                 OnGetCurrentPlayerIdCompleteCallback,
                                 nullptr);
}

// Entry point for our test app
void TestPGSNative(JNIEnv *env, jobject main_activity) {
   JavaVM *java_vm;
   env->GetJavaVM(&java_vm);

   GniCore_init(java_vm, main_activity);

   GetPlayerId(main_activity);
}

重新啟動登入提示

如果玩家拒絕在遊戲啟動時自動顯示的初始 Play 遊戲服務登入提示,玩家可能會在遊戲工作階段期間改變心意。只要目前沒有玩家登入,即可呼叫 PgsGamesSignInClient_signIn 來重新啟動登入提示。

遊戲伺服器授權

玩家成功登入 Play 遊戲服務後,遊戲用戶端即可要求提供伺服器授權碼,讓後端遊戲伺服器可用來安全地與 Play 遊戲服務進行通訊。這可讓遊戲伺服器擷取、更新及儲存已登入玩家的資料。您可以呼叫 PgsGamesSignInClient_requestServerSideAccess 函式來擷取伺服器授權碼。

詳情請參閱伺服器存取指南