设置 v2 原生 C 或 C++

本文档可帮助您为 v2 原生 C 或 C++ 设置 C++ 项目,并验证身份验证服务。

前期准备

您必须在 Google Play 管理中心内设置 Play 游戏服务

应用要满足的前提条件

确保您应用的 build 文件使用以下值:

  • minSdkVersion19 或更高版本
  • compileSdkVersion28 或更高版本

设置游戏项目

完成以下步骤以设置您的游戏项目。

更新 build.gradle

在应用级 build.gradle 文件中,执行以下操作:

  • 确保已启用 prefab 构建功能。

  • 添加 v2 原生 SDK(Beta 版)的依赖项:

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

示例如下:

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

更新 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)

更新 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 函数来检索服务器授权代码。

如需了解详情,请参阅服务器访问指南