Начало работы с игровыми сервисами Play для C и C++

В этом руководстве описывается, как настроить собственный игровой проект C или C++ для использования Play Games Services v2 Native SDK и интеграции службы входа . Интеграция входа необходима для интеграции других функций игровых сервисов Play в вашу игру, а также для интеграции игровых сервисов Play с вашим серверным игровым сервером .

Поддерживаемые функции

Native SDK Play Games Services v2 находится на стадии бета-тестирования и поддерживает только службу входа. Он пока не поддерживает другие функции игровых сервисов Play.

Справочная документация API

Файлы заголовков SDK содержат справочную документацию по API. Файлы заголовков расположены в папке include в файлах SDK, которые доступны после синхронизации проекта с репозиторием SDK.

Требования

  • Игровой проект, использующий собственный язык C или C++ в качестве основного языка программирования.

  • В вашем игровом проекте и среде разработки должна быть настроена система сборки Gradle .

Прежде чем начать

Вам необходимо настроить игровые сервисы Play в консоли Google 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 уровня приложения выполните следующие действия:

  • Убедитесь, что функция сборной сборки включена.

  • Добавьте зависимость для собственного SDK Play Games Services v2:

    • 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 Games Services. Вы можете сделать это, добавив в файл следующие строки:

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    
  2. Создайте строковый ресурс для идентификатора вашего проекта. Это позволит вашей игре получить доступ к идентификатору во время сборки. Чтобы создать ресурс, создайте файл 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. Создайте и протестируйте свою игру. В случае успеха при запуске игры отображается приглашение на вход или баннер успешного входа.

Получить идентификатор игрока

Ваша игра может получить доступ к информации об игроке, вошедшем в систему, путем получения его идентификатора игрока. Вы можете получить идентификатор игрока, вызвав функцию GetPlayerID , что показано в следующем примере.

#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 .

Дополнительную информацию см. в руководстве по доступу к серверу .