开始使用适用于 C 和 C++ 的 Play 游戏服务

本指南介绍如何设置一个使用原生 C 或 C++ 作为主要编程语言的游戏项目,以使用 Play 游戏服务 v2 原生 SDK 并集成 登录服务。为了将其他 Play 游戏服务 功能 集成到您的游戏中以及将 Play 游戏服务集成到您的 后端游戏服务器,登录集成是必需的。

支持的功能

Play 游戏服务 v2 原生 SDK 处于测试阶段,仅支持登录服务。它尚不支持其他 Play 游戏服务 功能

API 参考文档

SDK 的头文件包含 API 的参考文档。头文件位于 SDK 文件中的 include 文件夹中,在您将项目与 SDK 存储库同步后即可使用。

要求

  • 一个使用原生 C 或 C++ 作为主要编程语言的游戏项目。

  • 您的游戏项目和开发环境必须设置了 Gradle 构建系统。

开始之前

您必须在 Google Play Console 中 设置 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 文件中执行以下操作

  • 确保启用了 预制件 构建功能。

  • 添加 Play 游戏服务 v2 原生 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 函数来检索服务器授权代码。

有关更多信息,请参阅 服务器访问指南