C++ 版 Play 游戏服务

Google Play 游戏服务 C++ SDK 提供了一个 C++ API,可用于 Google Play 游戏服务,旨在面向已经拥有游戏 C++ 实现的开发者。

目前,SDK 实现以下服务:

  • 授权
  • 成就
  • 排行榜
  • 事件
  • 已保存的游戏
  • 附近连接(仅限 Android)
  • 玩家数据

概念

高级别上,您可以按照以下步骤使用 SDK:

  1. 为 Android 设置平台配置。
  2. 使用GameServices::Builder配置和构建GameServices对象。GameServices对象会自动尝试登录,并通过OnAuthActionFinished()回调返回结果。请注意回调返回的结果。如果自动登录尝试失败,您可以显示一个按钮让用户登录。
  3. 收到OnAuthActionFinished()结果后,您可以使用GameServices对象及其子管理器来进行 Play 游戏服务调用,包括:

    • 登录(授权失败后):StartAuthorizationUI()
    • 解锁成就:Achievements().Unlock()
    • 使用内置 UI 显示成就:Achievements().ShowAllUI()
    • 提交高分:Leaderboards().SubmitScore()
    • 退出登录:SignOut()
  4. 完成GameServices对象的用后,请重置或销毁它。

更详细的级别:

  1. 初始化平台配置:这是一个包含平台特定初始化信息的對象。在 Android 上,平台配置包含 Java VM 和指向当前Activity的指针。

    // In android_main(), create a platform configuration
    // and bind the object activity.
    // Alternately, attach the activity in JNI_Onload().
    gpg::AndroidPlatformConfiguration platform_configuration;
    platform_configuration.SetActivity(state->activity->clazz);
    
  2. 构建GameServices对象:此对象是 Google Play 游戏服务功能的主要入口点。GameServices实例是使用GameServices::Builder创建的。

    在大多数实现中,给定的GameServices对象会在您的 C 环境持续存在的时间内持续存在;当您的 AndroidActivity暂停和恢复时,您无需重新初始化它。

    // Creates a GameServices object that has lambda callbacks.
    game_services_ = gpg::GameServices::Builder()
            .SetDefaultOnLog(gpg::LogLevel::VERBOSE)
            .SetOnAuthActionStarted([started_callback](gpg::AuthOperation op) {
                is_auth_in_progress_ = true;
                started_callback(op);
            })
            .SetOnAuthActionFinished([finished_callback](gpg::AuthOperation op,
                                                         gpg::AuthStatus status) {
                LOGI("Sign in finished with a result of %d", status);
                is_auth_in_progress_ = false;
                finished_callback(op, status);
            })
            .Create(pc);
    
  3. 使用管理器类来管理您的GameServices对象。管理器可从GameServices实例访问,并将相关功能组合在一起。示例包括成就和排行榜管理器。它们本身不包含对用户可见的状态。管理器通过引用返回,包含的GameServices实例控制其生命周期。您的客户端不应保留管理器引用。相反,您的客户端应保留GameServices实例。

    管理器通过不可变值类型对象返回数据。这些值反映了查询时底层数据的统一视图。

    // Submit a high score
    game_services_->Leaderboards().SubmitScore(leaderboard_id, score);
    
    // Show the default Achievements UI
    game_services_->Achievements().ShowAllUI();
    
  4. 完成GameServices对象的用后,通过调用拥有它的unique_ptr上的reset()进行清理,或者在超出范围时让unique_ptr自动销毁它。

线程模型

除非另有说明,否则所有GameServices和管理器方法都具有线程安全、异步的实现。它们可以在任何线程上调用,无需外部锁定,并且将按照其调用顺序执行。

访问器方法(读取状态的那些方法)有两种主要变体。第一种方法(名称类似于FetchProperty())异步地向提供的回调提供其结果;第二种(名称类似于FetchPropertyBlocking())同步地将结果返回到调用线程。

// Blocking callback
gpg::AchievementManager::FetchAllResponse fetchResponse =
        game_services_->Achievements().FetchAllBlocking(std::chrono::milliseconds(1000));

// Non-blocking callback
game_services_->Achievements().FetchAll(gpg::DataSource::CACHE_OR_NETWORK,
    [] (gpg::AchievementManager::FetchAllResponse response) {
    LogI("Achievement response status: %d", response.status);});

所有用户回调都在专用回调线程上调用。此线程可能与任何平台概念的“主线程”或“UI 线程”不同。您还应尝试确保用户回调快速执行;阻塞的回调线程可能会导致用户可见的问题(例如,退出登录请求完成延迟)。

平台特定信息

要开始在 Android 上使用 Play 游戏 C++ SDK,请继续阅读快速入门指南

进一步阅读

请务必阅读 Google Play 游戏服务 C++ SDK 中提供的类文档以了解更多详细信息,并查看示例,这些示例演示了如何使用 SDK。

如果您的游戏使用后端服务器,请参阅启用对 Google Play 游戏服务的服务器端访问