C++용 Play 게임 서비스 시작하기

Google Play 게임 서비스 C++ SDK는 Google Play 게임 서비스와 함께 사용할 수 있는 C++ API를 제공합니다. 이는 C++로 구현된 기존 게임을 보유한 개발자를 위한 것입니다.

현재 SDK로 다음 서비스를 구현할 수 있습니다.

  • 인증
  • 업적
  • 리더보드
  • 턴 방식 멀티플레이어
  • 실시간 멀티플레이어
  • 이벤트 및 퀘스트
  • 저장된 게임
  • Nearby Connections(Android에만 해당)
  • 플레이어 통계

개념

고급 단계에서 다음 절차에 따라 SDK를 사용합니다.

  1. Android의 플랫폼 구성을 설정합니다.
  2. GameServices::Builder를 사용하여 GameServices 객체를 설정하고 구성합니다. GameServices 객체가 자동으로 로그인을 시도하고 OnAuthActionFinished() 콜백을 통해 결과를 반환합니다. 이때 콜백이 반환한 결과를 기록해 둡니다. 자동 로그인 시도가 실패한 경우 사용자가 로그인하도록 버튼을 표시할 수 있습니다.
  3. OnAuthActionFinished() 결과를 수신한 후, GameServices 객체와 하위 Manager를 사용하여 다음을 포함한 Play 게임 서비스를 호출할 수 있습니다.

    • 로그인(인증 실패 후): StartAuthorizationUI()
    • 업적 달성: Achievements().Unlock()
    • 기본 제공 UI를 사용하여 업적 표시: Achievements().ShowAllUI()
    • 최고점수 제출: Leaderboards().SubmitScore()
    • 로그아웃: SignOut()
  4. GameServices 객체 사용을 마치면 재설정하거나 삭제합니다.

더욱 구체적인 절차는 다음과 같습니다.

  1. 플랫폼 설정 초기화: 플랫폼별 초기화 정보가 포함된 객체입니다. Android의 경우 플랫폼 설정에 자바 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 환경이 존재하는 한 계속 존재합니다. 따라서Android Activity가 일시중지되고 재개될 때도 다시 초기화할 필요가 없습니다.

    // 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. Manager 클래스를 사용하여 GameServices 객체를 관리합니다. Manager는 GameServices 인스턴스에서 액세스하고 관련 기능을 함께 그룹화합니다. 이러한 예에는 Achievement와 Leaderboard Manager가 포함됩니다. 여기에는 사용자가 볼 수 있는 상태가 없습니다. Manager는 참조로 반환되고 포함된 GameServices 인스턴스가 수명 주기를 제어합니다. 클라이언트가 Manager 참조를 보유해서는 안 됩니다. 대신 GameServices 인스턴스를 보유해야 합니다.

    Manager는 변경할 수 없는 값 유형 객체를 통해 데이터를 반환합니다. 이러한 값은 쿼리가 실행된 시점에서 기본 데이터의 일관된 뷰를 반영합니다.

    // 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와 Manager 메서드는 스레드로부터 안전한 비동기 구현을 이용합니다. 외부 잠금 없이 모든 스레드에서 호출될 수 있으며 호출 순서와 일치하는 순서대로 실행됩니다.

상태를 읽는 메서드인 Accessor 메서드에는 두 가지 주요한 변형이 있습니다. 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 사용 방법을 시연하는 샘플도 확인해 보세요.