경기 통계

게임 통계는 플레이어가 게이머 프로필에서 확인할 수 있는 게임에 관한 누적 통계입니다. 이러한 통계를 통해 플레이어는 전체 기간의 진행 상황을 추적하고, 하이라이트 순간을 확인하고, 다른 플레이어와 비교할 수 있으며, 향후 퀘스트, 소셜 챌린지 등의 Google Play 기능을 활용할 수 있습니다.

게임 통계는 다음 요건을 충족해야 합니다.

  • 구매 (예: 보석 구매)가 필요하지 않습니다. 즉, 인앱 구매의 결과로 업데이트되지 않아야 합니다.
  • 광고 시청을 요구하지 않아야 합니다. 즉, 광고 시청으로 인해 업데이트되지 않아야 합니다.
  • 게임을 일반적인 방식으로 사용하지 않아야 합니다 (예: 게임 열기, 설정 사용).
  • Play 정책에 정의된 개인 정보 및 민감한 사용자 데이터(사용자 ID, 비밀번호, 정확한 위치 또는 건강 데이터 포함) 또는 불쾌감을 주거나, 욕설이 포함되거나, 선정적이거나, 폭력적이거나, 증오 콘텐츠를 포함하지 않습니다.
  • 모든 사용자가 사용할 수 있어야 합니다 (예: 팀별 작업이 아니거나 특정 수준의 사용자만 사용할 수 있거나 시간 제한이 있는 라이브옵스 등으로 제한되지 않음).

이 이미지는 내 페이지 탭의 게이머 프로필에 표시된 게임 통계를 보여줍니다. 내 페이지 탭의 이 사용자 인터페이스 (UI)는 테스트 목적으로만 사용할 수 있습니다. 게임 통계 UI는 2026년 9월에 제공될 예정입니다.

내 페이지 탭의 게임 통계
내 페이지 탭의 하이라이트가 포함된 게임 통계

집계 유형

집계 유형은 전송하는 이벤트별 값에서 통계를 계산하는 방법을 Google Play에 알려줍니다.

  • SUM: 누적 통계 (예: 수집한 총 코인 수, 총 피해량)에 사용합니다. 게임은 각 이벤트 인스턴스 중에 획득한 개별 금액을 전송해야 합니다.
  • COUNT: 이벤트 발생 횟수를 나타내는 통계에 사용합니다(예: 플레이한 게임, 이긴 게임). 게임은 개별 이벤트 발생 인스턴스를 전송해야 합니다.
  • MAX: 단일 실행에서 최고 점수, 최대 연속 콤보, 단일 경기 최대 피해와 같이 단일 발생 최고 성과에만 사용합니다. MAX를 해결 방법으로 사용하여 사전 계산된 실행 값에서 전체 기간 합계를 표시하지 마세요.

반복 통계의 중요한 구현 요구사항

  • 이벤트별 값 전송: 각 이벤트에 대해 해당 이벤트에서 발생한 값만 전송합니다(예: 한 번의 실행에서 수집된 코인). 그런 다음 통계 구성에서 SUM 또는 COUNT와 같은 집계 유형을 설정합니다. 이렇게 하면 반복적인 통계를 참여 유도 메커니즘 전반에서 재사용할 수 있으며 Google Play에서 적절한 플레이어 환경을 만들 수 있습니다.
  • 전체 기간 합계를 전송하지 않음: 예를 들어 플레이어가 게임 클라이언트 또는 서버에서 수집한 총 코인을 추적하고 MAX 집계로 해당 합계를 전송하지 않습니다. 이러한 통계는 게이머 프로필 UI에 계속 표시되지만 Google Play에서는 리그, 퀘스트, 스프린트와 같은 보상 기능을 지원하여 플레이어 환경을 개선하고 게임에 영향을 미치는 데 이러한 통계를 사용할 수 없습니다.

올바른 이벤트 모델링에 관한 안내와 예는 플레이어 이벤트 및 통계 구성을 참고하세요.

통합 단계

Game Stats API를 사용하여 반복 통계의 플레이어 이벤트와 진행 상황 통계의 사전 정의된 이벤트 progressUpdate로 데이터를 전송합니다. 또한 게이머 프로필에 표시되는 통계와 표시 정보를 계산하는 로직을 구성해야 합니다.

플레이어 이벤트는 고유한 인게임 순간, 게임 루프 완료 또는 진행 상황 이정표를 나타냅니다.

플레이어 이벤트는 다음과 같이 정의되고 모델링됩니다.

  1. 이벤트는 경기 완료, 달리기 완료, 상자 열기, 영역에서 진행 상황 저장과 같이 플레이어가 취하는 특정 작업으로 표현됩니다.
  2. 각 작업은 특정 결과를 가져오거나 작업을 정의하는 특정 특성을 갖습니다. 이러한 이벤트는 이벤트 및 특정 결과에 대한 컨텍스트를 제공하는 이벤트 속성으로 모델링됩니다 (예: 경기 유형, 해당 실행 중에 수집된 코인, 경기 결과 또는 헤드샷 수).

통합은 다음 단계로 구성됩니다.

  • 원시 데이터 스키마 선언: Play Console에서 CSV 업로드를 사용하여 플레이어 이벤트를 정의합니다. 이벤트 만들기를 참고하세요.
  • 게임 통계 API와 통합: 플레이어 이벤트 및 progressUpdate 이벤트에 대해 선언된 형식으로 원시 플레이어 데이터를 전송합니다.
  • ZIP 파일 업로드: 5개의 반복 통계와 1개의 플레이어 진행 수준을 정의하는 CSV 파일 3개와 모든 아이콘 이미지 파일을 제공합니다. 자세한 내용은 ZIP 파일 가이드라인을 참고하세요. 다음 세부정보를 포함합니다.
    • 반복 통계용 CSV 파일:
      • 통계의 고유 ID입니다.
      • 통계 계산에 사용할 이벤트 라벨을 지정합니다. 여기에서는 progressUpdate 이벤트 라벨을 사용할 수 없습니다.
        • 통계 계산에 사용할 속성 라벨을 지정합니다. 지정된 이벤트의 속성이어야 합니다.
        • 집계 유형 (SUM, MAX, MIN 또는 COUNT)을 지정하여 선택한 속성 라벨에서 통계를 계산하는 방법을 결정합니다.
        • 조건이 충족되는 경우에만 로직을 계산하도록 선택적 필터 조건을 지정합니다. 속성 및 이벤트 라벨, 연산자 (=, <, <=, >=, >), 기준점을 정의합니다.
      • 통계를 경쟁 기능에 사용할 수 있는지 나타내는 불리언 플래그를 포함합니다.
      • 기능을 경쟁 기능에 사용할 수 있는 경우 실제 플레이어의 시간당 최소 및 최대 한도입니다. 이는 리그 및 소셜 챌린지와 같은 기능에 참여할 때 악용할 수 있는 플레이어를 식별하는 데 사용됩니다.
      • 플레이어에게 표시되는 통계의 고유한 표시 이름을 입력합니다.
      • 통계를 설명하는 고유한 텍스트를 제공합니다. 이 설명에는 플레이어가 통계를 획득하는 방법에 관한 세부정보가 포함되어야 하며 게이머 프로필 UI에서 플레이어에게 표시됩니다.
      • CSV 파일에 정확한 아이콘 파일 이름을 입력하여 통계를 나타내는 고유한 아이콘을 제공합니다.
      • 값이 증가하는 것이 플레이어에게 좋은지, 감소하는 것이 좋은지 선택적 입력을 제공합니다. 이 입력은 플레이어 움직임을 축하하는 데 사용됩니다.
      • 통계의 측정 단위(예: km, 마일, 초)를 선택적으로 제공합니다.
    • 플레이어 진행 상황 통계의 CSV 파일:
      • 플레이어에게 표시되는 플레이어 진행 상황의 고유한 표시 이름을 입력합니다.
      • 통계를 나타내는 고유한 아이콘을 제공합니다.
      • 진행 상황 통계에 대한 설명을 입력합니다.
      • 값이 증가하는 것이 플레이어에게 좋은지, 감소하는 것이 좋은지 선택적 입력을 제공합니다. 이 입력은 currentProgress 속성이 INT 유형인 경우에만 플레이어 움직임을 축하하는 데 사용됩니다.
      • 통계의 선택적 측정 단위(예: km, 마일, 초)를 제공합니다.
    • 현지화용 CSV 파일: 모든 통계에 현지화된 표시 이름을 제공합니다.
      • 현지화마다 행을 하나씩 추가합니다.
      • 이전 CSV에 추가된 통계 표시 이름 문자열을 사용하여 현지화가 추가되는 통계를 고유하게 식별합니다.
      • 언어 코드 목록에서 언어를 지정합니다.
      • 지정된 언어로 표시 이름의 현지화를 추가합니다.
      • 지정된 언어로 통계 설명의 현지화를 추가합니다.

스키마 계획

게임 통계 API를 사용하여 플레이어 이벤트와 플레이어 진행 상황 통계에 대한 사전 정의된 이벤트라는 두 가지 유형의 데이터를 전송할 수 있습니다.

다음 예는 다양한 게임 유형에서 플레이어 이벤트가 어떻게 표시되는지 보여줍니다.

플레이어 이벤트

플레이어 이벤트는 고유한 게임 내 순간, 게임 루프 완료 또는 진행 상황 마일스톤으로 정의됩니다.

  • 이벤트를 특정 게임 내 순간, 게임 루프 완료 또는 진행 상황 마일스톤으로 정의합니다.
    • 완료된 경기 또는 실행과 같은 게임 루프 완료
    • 저장된 영역 탐색 진행 상황 또는 완료된 레벨과 같은 진행 상황 마일스톤
    • 반복 통계는 플레이어의 반복 가능한 작업을 실제로 나타내야 하므로 정의된 이벤트는 핵심 게임플레이와 연결되어야 합니다.
  • 속성을 추가하여 이벤트 및 결과에 대한 컨텍스트를 제공합니다(예: 레벨 번호, 경기 유형, 무기 유형, 무기 수, 헤드샷, 수집한 코인, 경기 결과, 랩 타임, 자동차 유형).
  • 게임플레이 세션 내에서 이벤트가 발생하는 즉시 이벤트를 전송합니다. 예를 들어 루프가 완료된 직후에 게임 루프 완료 이벤트를 전송합니다.
예
게임 유형 이벤트 라벨 인게임 순간 / 진행 이벤트 완료 / 게임 루프 완료 결과 특성
선형 진행 인디 퍼즐 게임 chapter_completed 진행 이벤트 완료 해당 사항 없음 챕터 번호, 챕터 이름, 시도 횟수, 화면 수, 이동 횟수, 챕터 콘텐츠
screen_completed 진행 이벤트 완료 챕터 번호, 챕터 이름, 시도 횟수, 이동 횟수, 챕터 콘텐츠
3D 무한 러너 run_completed 게임 루프 완료 수집한 코인, 점수 달리기 시간, 제트팩에서 수집한 코인, 달리기 시작 시 사용한 부스터, 사용한 서핑보드, 사용한 자석, 사용한 점퍼, 사용한 제트팩
오픈 월드 액션 RPG areaExplorationProgress 진행 이벤트 완료 처치한 적, 수집한 물약 영역 번호, 영역 이름, 진행률(백분율)
questCompleted 게임 루프 완료 해당 사항 없음 퀘스트 이름
weaponUnlocked 게임 내 순간 해당 사항 없음 무기 이름, 무기 레벨
chestUnlocked 게임 내 순간 강화 광석 수집됨
장식 메타가 있는 캐주얼 퍼즐 puzzleCompleted 게임 루프 완료 / 진행 이벤트 완료 수집한 코인, 수집한 부스터 이동 횟수, 버틀러의 선물 사용 여부, 레벨 유형, 레벨 번호, 사용된 색상 부스터, 사용된 다이너마이트
cardsCollected 게임 내 순간 별 1개 카드, 별 2개 카드, 별 3개 카드, 총 카드 수 앨범 번호, 앨범 이름
아케이드 레이싱 raceCompleted 게임 루프 완료 순위, 사용한 NOS, race_time Type of race, rating, car_used
carUpgraded 게임 내 순간 업그레이드된 자동차 특성, 이전 레벨 / 값, 새 레벨 / 값 자동차 유형, 현재 차고 레벨
3인칭 배틀 로열 슈팅 게임 matchCompleted 게임 루프 완료 처치, 헤드샷, 명예 수치 경기 유형, 생존 시간
e스포츠 경영 시뮬레이션 matchCompleted 게임 루프 완료 결과, 득점, 골 상대 팀 이름, 경기 팀 이름
trainingCompleted 게임 내 순간 Drills done, teamplay_form_attack, teamplay_form_defense, teamplay_form_possession, teamplay_form_condition

progressUpdate 이벤트

게임에 기본 진행 메커니즘이 있는 경우 이 이벤트를 사용하여 플레이어의 현재 진행 상황을 전송합니다. 이 이벤트에는 INT 또는 STRING 유형의 'currentProgress'라는 사전 정의된 속성이 하나 있습니다. 이 속성을 사용하여 기본 진행 메커니즘에서 플레이어 진행 상황의 현재 값을 전송해야 합니다. 이 이벤트를 사용하는 경우 사전 정의된 속성 'currentProgress'가 있어야 하며 이 속성을 사용하여 진행 상황 통계를 정의해야 합니다.

lifetime highest score 또는 current coin balance와 같은 게임의 다른 진행 시스템의 현재 값을 이 이벤트의 다른 속성으로 전송할 수 있습니다.

플레이어는 게임 내 현재 진행 상황을 기준으로 프로필을 비교할 수 있으므로 첫 통합 후 현재 진행 상황 값을 가져오는 데 지연이 없어야 합니다. 플레이어에게 정확한 현재 진행 상황을 표시하려면 각 게임 세션이 시작될 때와 현재 진행 상황이 업데이트될 때마다 progressUpdate 이벤트를 전송해야 합니다.

예
게임 유형 `progressUpdate` 이벤트의 currentProgress 속성
선형 진행 퍼즐 게임 현재 챕터 번호 또는 레벨 번호
3D 무한 러너 최고 점수, 현재 부스터 잔액
캐주얼 퍼즐 현재 레벨 번호, 첫 번째 시도에서 완료한 레벨 수, 완료한 영역 수, 완료한 컬렉션 수
아케이드 레이싱 현재 레벨 번호, 통화 잔액
오픈 월드 액션 RPG 현재 캐릭터 등급, 현재 레벨 번호
3인칭 슈팅 게임 현재 레벨 번호
e스포츠 시뮬레이션 관리자 등급 번호, 클럽 등급 번호

통계 구성

각 통계에 관한 계산 로직과 표시 정보를 정의하여 반복 및 진행 통계를 구성해야 합니다. 다양한 게임 장르의 반복 통계 예시는 아래에 포함되어 있습니다. 반복 통계는 일반적으로 소수의 (3~4개) 게임 세션에서 모든 플레이어에 대해 반복적으로 업데이트되고 핵심 게임 루프와 연결된 통계입니다.

SUM, COUNT 또는 MAX를 사용해야 하는 경우를 알아보려면 적절한 집계 유형 선택을 참조하세요.

게임 이름 게임 통계 표시 이름 이벤트 속성 계산 로직[aggregation] 필터
3D Endless Runner 실행 완료됨 run_completed 이벤트의 모든 속성 개수 모든 값[필터 없음]
수집한 코인 run_completed 이벤트의 coins_collected 속성 합계 해당 사항 없음
수집한 열쇠 run_completed 이벤트의 keys_collected 속성 합계 해당 사항 없음
최고 러닝 점수 run_completed 이벤트의 점수 속성 최대 해당 사항 없음
코인 많이 획득 러닝 완료 run_completed 이벤트의 coins_collected 속성 개수 값 > 5000
선형 진행 퍼즐 게임 완료한 챕터 chapter_completed 이벤트의 모든 속성 개수 모든 값[필터 없음]
완료된 화면 screen_completed 이벤트의 모든 속성 개수 모든 값[필터 없음]
첫 번째 시도에서 완료한 챕터 chapter_completed 이벤트의 num_try 속성 개수 Num_try = 1
첫 번째 시도에서 완료된 화면 screen_completed 이벤트의 num_try 속성 개수 Num_try = 1
오픈 월드 액션 RPG 완료한 퀘스트 quest_completed 이벤트의 모든 속성 개수 모든 값[필터 없음]
탐색한 영역 area_exploration_progress 이벤트의 perc_progress 속성 개수 값 = 100
획득한 검 weapon_unlocked 이벤트의 weapon_type 속성 개수 Value = "sword"
처치한 적 area_exploration_progress 이벤트의 Enemies_defeated 속성 합계 해당 사항 없음
수집한 체력 물약 chest_unlocked 이벤트의 enhancement_ores 속성 합계 해당 사항 없음
캐주얼 퍼즐 완료한 레벨 level_completed 이벤트의 모든 속성 개수 모든 값[필터 없음]
첫 번째 시도에서 완료한 레벨 level_completed 이벤트의 num_try 속성 개수 값 = 1
사용된 색상 부스터 level_completed 이벤트의 color_booster_used 속성 합계 해당 사항 없음
사용된 폭탄 부스터 level_completed 이벤트의 bomb_booster_used 속성 합계 해당 사항 없음
수집된 카드 cards_collected 이벤트의 total_cards 속성 합계 해당 사항 없음
아케이드 레이싱 이긴 경기 race_completed 이벤트의 순위 속성 개수 값 = 1
가장 빠른 레이스 race_completed 이벤트의 race_time 속성 민 해당 사항 없음
NOS 사용됨 race_completed 이벤트의 NOS_used 속성 합계 해당 사항 없음
머스탱으로 완주한 레이스 race_completed 이벤트의 car_type 속성 개수 Value = "Mustang"
자동차 업그레이드 car_upgraded 이벤트의 모든 속성 개수 모든 값[필터 없음]
3인칭 배틀 로열 슈팅 게임 승리 경기 수 match_completed 이벤트의 모든 속성 개수 Match_result = TRUE
총 탈락 수 match_completed 이벤트의 Eliminations 속성 합계 해당 사항 없음
최장 생존 시간 match_completed 이벤트의 survival_time 속성 최대 해당 사항 없음
총 헤드샷 수 match_completed 이벤트의 헤드샷 속성 합계 해당 사항 없음
총 기술 가치 match_completed 이벤트의 skill_value 속성 합계 해당 사항 없음
e스포츠 경영 시뮬레이션 승리 경기 수 match_completed 이벤트의 결과 속성 개수 Result = 'Won'
총 득점 수 match_completed 이벤트의 goals_scored 속성 합계 해당 사항 없음
어려움 경기 승리 hard_match_completed 이벤트의 결과 속성 개수 결과 = 'Won'
최고 골득실 승리 match_completed 이벤트의 goal_difference 속성 최대 Result = 'Won'
총 훈련 드릴 training_completed 이벤트의 drills_done 속성 합계 해당 사항 없음
완료한 총 교육 수 training_completed 이벤트의 모든 속성 개수 해당 사항 없음

통합 세부정보

이 섹션에서는 이벤트를 구성하고 클라이언트 측 및 서버 측 통합 모두에서 전송하는 방법을 보여줍니다.

데이터를 전송해야 하는 경우

플레이어 이벤트는 게임 루프 완료 또는 특정 인게임 순간과 관련된 인게임 작업을 나타냅니다. 이러한 이벤트가 발생하면 즉시 제출합니다. 예를 들어 루프가 완료되는 즉시 게임 루프 완료 이벤트를 제출합니다.

progressUpdate 이벤트는 플레이어의 현재 진행 상황 수준을 나타냅니다. 진행 상황 통계 데이터는 다음과 같은 상황에서 이 이벤트를 사용하여 전송해야 합니다.

  1. 현재 진행 상황이 업데이트될 때마다 최신 값을 즉시 전송합니다.
  2. 플레이어가 게임을 실행할 때마다 플레이어의 이 통계가 항상 존재하는지 확인합니다.

통합 방법

통합에는 클라이언트와 서버 간 통합이라는 두 가지 경로가 있습니다.

서버 간 통합

공개 API 엔드포인트를 사용하면 다음 구성을 사용하여 요청 페이로드에서 이벤트를 전송할 수 있습니다.

HTTP 요청

POST https://games.googleapis.com/games/v1/players/{playerId}/gameStats: batchRecordEvents

경로 매개변수
매개변수 데이터 유형 설명
playerId 문자열 플레이어의 PGS ID입니다.

승인 및 인증

서버 간 API 호출은 OAuth 2.0을 사용하는 표준 Play 게임즈 서비스에 대한 서버 측 액세스 가이드라인을 따릅니다. 요청에는 https://www.googleapis.com/auth/games 범위로 승인된 Bearer 토큰이 포함되어야 합니다.

이벤트: 요청 본문

백엔드 API에는 엄격한 구조적 검증 한도가 있습니다.

  • 일괄 크기: BatchRecordEventsRequest당 최대 30개 이벤트입니다.
  • 속성 수: PlayerGameEvent당 최대 25개의 맞춤 속성
  • 길이 제한: 이벤트 이름(최대 100자(영문 기준)), 속성 키(최대 100자(영문 기준)), 속성 문자열 값(최대 1,024자(영문 기준))
  • 이벤트 ID: 유효한 36자(영문 기준) UUID 문자열이어야 합니다.
  • 재시도 및 캐싱: API가 실패할 경우 로컬에서 과도한 이벤트를 캐싱하거나 누적하지 마세요. 30개를 초과하는 일괄 재시도는 거부됩니다. 배치 크기 한도를 준수하도록 항상 재시도를 청크합니다.

BatchRecordEventsRequest

BatchRecordEventsRequest을 참고하세요.

{
  "packageName": string,
  "requestTime": string,
  "events": [
    {
      object (PlayerGameEvent)
    }
  ]
}

PlayerGameEvent

{
  "eventId": string,
  "eventName": string,
  "eventProperties": {
    // keys (e.g., "matchId", "score")
    "": {
       object (PropertyValue)
    }
  },
  "eventTime": string // RFC 3339 formatted timestamp string (e.g., "2026-01-01T18:00:00Z").
}

PropertyValue

// ONE of the following fields will be present:
{
// 64-bit integer formatted as a string to prevent data loss
"intValue": "string",
// Double-precision floating point number.
"doubleValue": number,
// Standard UTF-8 text string.
"stringValue": "string",
// Boolean value (true or false).
"boolValue": boolean,
// Duration in seconds suffixed with 's' (e.g., "240s" or "3.5s").
"durationValue": "string"
}

progressUpdate 이벤트: 요청 본문

BatchRecordEventsRequest

{
  "packageName": string,
  "requestTime": string,
  "events": [
    {
      object (PlayerGameEvent)
    }
  ]
}

PlayerGameEvent - progressUpdate

{
  "eventId": string,
  "eventName": "progressUpdate",
  "eventProperties": {
    "": {
       object (PropertyValue)
// Must have at least one property "currentProgress"  of  type  INT  or  STRING
    }
  },
  "eventTime": string // RFC 3339 formatted timestamp string (e.g., "2026-01-01T18:00:00Z")
}

응답 본문

성공하면 빈 JSON 객체와 함께 HTTP 200 OK 상태를 반환합니다.

요청 본문 예시

이벤트: PlayerGameEvent

{
  "packageName": "com.example.awesomegame",//Your package name
  "requestTime": "2026-05-09T00:44:44Z",
  "events": [
    {
      "eventId": "123e1234-e29b-41d4-a123-446655440000", // UUID for deduplication and idempotency
      "eventName": "matchCompleted",
      "eventTime": "2026-05-09T01:44:44Z", // RFC 3339 formatted timestamp string (e.g., "2026-05-09T01:44:44Z").
      "eventProperties": {
        "matchId": {
          "stringValue": "Match_A"
        },
        "gameMode": {
          "stringValue": "Battle_B"
        },
        "locationId": {
          "stringValue": "Location_XYZ"
        },
        "playerElimination": {
          "intValue": 2
        },
        "isWinner": {
          "boolValue": true
        }
      }
    }
  ]
}

progressUpdate 이벤트

{
  "packageName": "com.example.awesomegame",//Your package name
  "requestTime": "2026-05-09T00:44:44Z",
  "events": [
    {
      "eventId": "123e1234-e29b-41d4-a123-446655440000", // UUID
      "eventName": "progressUpdate",
      "eventTime": "2026-05-09T01:44:44Z", // RFC 3339 formatted timestamp string (e.g., "2026-01-01T18:00:00Z").
      "eventProperties": {
        "currentProgress": {
          "intValue": 52
        },
//Add more properties as per your requirement
      }
    }
  ]
}

클라이언트 구현

플랫폼의 게임 통계 클라이언트 구현에 관한 자세한 내용은 다음 리소스를 참고하세요.

중요 시점

날짜 게임 통계 API 통합 게임 통계 구성
2026년 9월 해당 사항 없음 플레이어의 게이머 프로필에 게임 통계가 표시되기 시작합니다.