本指南介绍了如何设置原生 C 或 C++ 游戏项目以使用 Play 游戏服务 v2 原生 SDK 并集成登录服务。为了将其他 Play 游戏服务功能集成到您的游戏以及将 Play 游戏服务集成到您的后端游戏服务器,必须进行登录集成。
支持的功能
Play 游戏服务 v2 原生 SDK 处于测试版阶段,目前仅支持登录服务。它尚不支持其他 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 游戏服务 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
在您的
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>
为您的项目 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>
构建并测试您的游戏。如果成功,当您启动游戏时,它会显示登录提示或成功的登录横幅。
获取玩家 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
函数来检索服务器授权码。
如需了解更多信息,请参阅服务器访问指南。