무관련자

문서 및 도움말
Steamworks 문서
통계 및 도전 과제

개요

Steam 통계 및 도전 과제는 귀사의 게임에서 사용자의 도전 과제와 통계를 지속적으로 확인 및 추적할 수 있는 간단한 방법을 제공합니다. 사용자의 데이터는 Steam 계정과 연결되어 있으며 각 사용자의 도전 과제와 통계는 각자의 Steam 커뮤니티 프로필에 일정한 형식으로 표시됩니다.

좋은 점

도전 과제는 게임에서 가치가 높은 보상을 제공하는 것 이외에도 팀 협동이나 플레이어 상호작용에 대해 보상하고 이를 권장하는 데 매우 유용하며, 게임에 다각적인 목표를 부여하고 게임에 더 많은 시간을 소비하는 사용자에게 보상을 제공할 수 있습니다.

통계는 플레이 시간, 사용한 파워 업 숫자 등의 세밀한 정보를 추적합니다. 게임 내부 데이터를 추적할 때만 통계를 사용할 수도 있습니다. 예를 들어, 사용자가 여러 개의 컴퓨터에서 플레이한 여러 개의 게임 플레이 세션 통계를 기초로 도전 과제 달성을 인정할 수 있습니다.

구현 개요

게임 통계 및 도전 과제 정의

도전 과제는 애플리케이션에 따라 다르며 Steamworks 파트너 사이트의 앱 관리자 페이지에서 설정할 수 있습니다.

게임에 저장할 수 있는 통계에는 세 가지가 있습니다.
  • INT - 32비트(부호) 정수(예: 플레이한 게임 수)
  • FLOAT - 32비트 부동 소수점 값(예: 운전한 킬로미터 수)
  • AVGRATE - 이동 평균. 참고: AVGRATE 통계 방식

Steamworks 파트너 웹사이트는 귀사의 게임 통계 및 도전 과제를 정의하고 업데이트할 수 있는 인터페이스를 제공합니다. 이 인터페이스로 다음과 같은 작업이 가능합니다.
  • 초기 통계 및 도전 과제를 정의할 수 있습니다.
  • 통계 및 도전 과제를 추가할 수 있습니다.
  • 도전 과제 이름과 설명, 아이콘을 업데이트할 수 있습니다.
  • 통계 매개변수 및 제약 조건(최대값 및 최소값, 이동 평균 창 크기 등)을 업데이트할 수 있습니다.
통계에는 다음과 같은 속성이 있습니다.
  • ID - 자동으로 생성되는 각 통계의 숫자 ID.
  • Type - 통계의 종류 - INT, FLOAT, 또는 AVGRATE.
  • API Name - 해당 API를 사용해 통계에 접근할 때 사용되는 문자열.
  • Set By - 통계를 수정할 수 있는 사람을 설정합니다. 기본 설정은 클라이언트입니다. 자세한 내용은 게임 서버 통계 문서를 참조하세요.
  • Increment Only - 설정할 경우, 시간이 지남에 따라 값이 증가하는 것만 허용합니다.
  • Max Change - 설정할 경우, 통계 값이 하나의 SetStat 호출에서 다음 SetStat 호출로 넘어갈 수 있는 변화량의 한계를 설정합니다.
  • Min Value - 설정할 경우, 해당 통계가 취할 수 있는 최소 숫자 값입니다. 기본적으로 최소값은 기본 숫자 형식의 최소값(INT_MIN 또는 -FLT_MAX)입니다.
  • Max Value - 설정할 경우, 해당 통계가 취할 수 있는 최대 숫자 값입니다. 기본적으로 최대값은 기본 숫자 형식의 최대값(INT_MAX 또는 FLT_MAX)입니다.
  • Default Value - 설정할 경우, 새로운 사용자에게 처음 설정되는 통계의 기본값입니다. 설정하지 않을 경우 기본값은 0입니다.
  • Aggregated - 설정할 경우, Steam에서 이 통계의 전체 합계를 보관합니다. 전체 통계에 대한 자세한 내용은 아래를 참고해 주세요.
  • Display Name - Steam 커뮤니티에 표시되는 통계의 이름입니다. 현지화 가능합니다.
AVGRATE 통계에는 다음과 같은 추가 속성이 있습니다.
  • Window - 귀사 데이터의 평균을 구하는 데 사용되는 ‘슬라이드식 창’의 크기.
AVGRATE 통계는 Steam에서 자동으로 평균값을 계산합니다. 자세한 내용은 아래 AVGRATE 섹션을 참조하세요.

도전 과제에는 다음과 같은 속성이 있습니다.
  • ID - 자동으로 생성되는 각 도전 과제의 숫자 ID.
  • API Name - 해당 API를 사용해 도전 과제에 접근할 때 사용되는 문자열.
  • Progress Stat - 커뮤니티에 표시되는 해당 도전 과제의 진행 상황 막대에 사용할 통계를 지정합니다. 통계가 잠금 해제 값에 도달하면 도전 과제가 자동으로 잠금 해제됩니다.
  • Display Name - 클라이언트 알림 팝업이나 커뮤니티에 표시되는 도전 과제 이름입니다. 현지화 가능합니다.
  • Description - 커뮤니티에 표시되는 도전 과제에 대한 설명입니다. 현지화 가능합니다.
  • Set By - 도전 과제를 잠금 해제할 수 있는 사람을 설정합니다. 기본 설정은 클라이언트입니다. 자세한 내용은 게임 서버 통계 문서를 참조하세요.
  • Hidden - 참일 경우, ‘숨겨진’ 도전 과제는 달성하기 전까지 사용자의 커뮤니티 페이지에 전혀 표시되지 않습니다.
  • Achieved Icon - 도전 과제를 달성하면 표시되는 아이콘입니다.
  • Unachieved Icon - 도전 과제를 아직 달성하지 못했을 때 표시되는 아이콘입니다.

다음은 Steamworks API Example Application (SpaceWar)에 있는 도전 과제 목록입니다.
achievements_spacewar.png

사용 방법

게임 안에서 통계 및 도전 과제에 접근하기:

AVGRATE 통계 방식

독특하고 유용한 기능을 제공하는 이 통계 방식은 좀 더 자세한 설명이 필요합니다.

예를 들어, ‘시간당 획득 점수’와 같은 평균 통계를 추적하고자 하는 경우가 있습니다. 먼저 INT ‘TotalPoints’와 FLOAT ‘TotalPlayTimeHours’의 두 가지 통계를 가지고 점수를 시간으로 나눠 시간당 점수를 계산하는 방법이 있습니다.

이러한 방법의 단점은, 플레이 시간이 상당히 긴 플레이어의 경우 평균값이 변화하는 속도가 극도로 느리다는 것입니다. 사용자가 게임을 더 오래 플레이할수록 평균의 반응 수준은 더욱 떨어지게 됩니다. 사용자가 게임을 100시간 플레이한 경우 계산되는 평균은 50시간 플레이한 만큼 ‘지연’됩니다. 이 경우 사용자의 기술이 향상되어도, 시간당 점수는 기대하는 것만큼 높아지지 않습니다.

AVGRATE 통계 방식을 사용하면 평균에 ‘슬라이드식 창’ 효과를 구현할 수 있습니다. 예를 들어, 최근 몇 시간의 게임 플레이만을 활용하면 통계가 플레이어의 현재 숙련도를 더욱 정확하게 반영할 수 있습니다.

최근 20시간의 게임 플레이에 대한 값만 반영된 ‘시간당 점수’를 구현하는 AVGRATE 통계를 설정해 보겠습니다. 먼저 다음 작업이 필요합니다.
  • 주의: 해당 평균은 ‘시간당’ 평균이므로 이 통계와 관련된 모든 시간 매개변수의 단위는 ‘시간’이 됩니다. 이는 통계 자체의 Window 속성에 적용되며 아래 UpdateAvgRateStat에 전달되는 ‘dSessionLength’ 매개변수에도 적용됩니다.
  • ‘AvgPointsPerHour’라는 이름으로 AVGRATE 통계 하나와 Window 속성 20.0(‘시간’)을 생성합니다.
  • 게임 중 적절한 시점에 다음 매개변수와 함께 ISteamUserStats::UpdateAvgRateStat을 호출합니다.
    • pchName - ‘AvgPointsPerHour’
    • flCountThisSession - 최근 마지막으로 UpdateAvgRateStat을 호출한 이후 플레이어가 획득한 점수.
    • dSessionLength - 최근 마지막으로 UpdateAvgRateStat을 호출한 이후 플레이어가 플레이한 게임 시간. 단위는 통계의 Window 속성의 단위와 같아야 합니다. 여기서는 ‘시간’입니다.
  • 예를 들어, 플레이어가 지난 라운드에서 0.225시간(13.5분)을 플레이하고 77점을 획득했다면, SteamUserStats()->UpdateAvgRateStat( "AvgPointsPerHour", 77, 0.225 )가 됩니다.
위 예에서 Steam은 현재 라운드 평균을 시간당 342.2점으로 계산하고(77을 0.225로 나눔) 이 값을 이전 값과 함께 계산합니다. 그 결과는 플레이어가 지난 20시간 동안 플레이한 전체 평균을 반영합니다. 이 통계가 현재 사용자에게 처음으로 업데이트되는 통계인 경우 현재 값은 342.2가 됩니다.

해당 예시는 시간 단위로 ‘시간’을 사용했지만, 다른 시간 단위를 선택할 수도 있습니다. 선택한 단위는 ‘SessionLength’와 Window 속성에서 일관되게 사용해야 한다는 점을 기억해 주세요.

다른 사용자에 대한 통계 확보

ISteamUserStats::RequestUserStats를 사용해 다른 사용자에 대한 통계를 얻을 수 있습니다. 그런 다음 ISteamUserStats::GetUserStat, ISteamUserStats::GetUserAchievement, ISteamUserStats::GetUserAchievementAndUnlockTime을 사용해 해당 사용자의 데이터를 얻을 수 있습니다. 이 데이터는 해당 사용자가 새로운 통계를 업로드할 때 자동으로 업데이트되지 않으므로, 데이터를 새로고침하려면 ISteamUserStats::RequestUserStats를 다시 호출해야 합니다.

메모리 절약을 위해 ‘오래전에 사용한 항목’(URL) 캐시가 유지되고 다른 사용자의 통계는 언로드될 수 있습니다. 이 작업 중에는 ISteamUserStats::UserStatsUnloaded_t 콜백이 자동으로 전송됩니다. 콜백이 전송되고 나면 지정한 사용자의 통계는 ISteamUserStats::RequestUserStats를 다시 호출할 때까지 사용할 수 없게 됩니다

오프라인 모드

Steam은 오프라인 모드에서도 API를 정상적으로 사용할 수 있도록 통계 및 도전 과제의 로컬 캐시를 보관합니다. 달성하지 못한 통계는 사용자가 다음에 온라인으로 접속할 때를 대비하여 모두 저장됩니다. 하나 이상의 기기에서 수정 사항이 발생한 경우에는 Steam에서 자동으로 도전 과제를 병합하고 진행 상황이 높은 통계 세트를 선택합니다. Steam에서 통계 데이터의 로컬 캐시를 보관하므로 게임에서 데이터의 로컬 캐시를 디스크에 따로 보관할 필요가 없습니다. 이러한 캐시는 종종 충돌하기 때문에 이를 실행할 경우 사용자에게는 진행 상황이 이전 상태로 돌아간 것으로 보이므로 좌절감을 줄 수 있습니다.

게임 서버 통계

게임 서버에서는 ISteamGameServerStatsISteamUserStats와 매우 유사합니다. Steam 게임 서버 통계는 클라이언트와 같은 방법(위에서 설명)으로 사용자의 통계를 얻을 수 있습니다. 또한 "Set by"가 GS(게임 서버) 또는 Official GS로 설정된 경우에 한하여 통계 및 도전 과제에 대한 보상을 설정할 수도 있습니다. 공식 게임 서버가 게임 서버와 다른 점은 귀사가 직접 호스팅하고 통제하는 서버라는 것입니다. 공식 게임 서버를 사용해 통계를 설정하면 부정행위에 대비한 보안이 향상됩니다. 사용자가 자신의 게임 서버를 갖게 되면 자신의 게임 서버를 수정하거나 스푸핑할 수도 있기 때문입니다. 공식 게임 서버를 정의하려면 여기에 서버의 IP 범위를 입력하세요.

게임 서버가 설정하는 통계와 도전 과제는 클라이언트가 설정할 수 없습니다. 게임 서버는 현재 해당 서버에서 플레이하는 사용자의 통계와 도전 과제만 설정할 수 있습니다. 사용자가 서버를 떠나면 최종 통계를 잠깐 동안 설정할 수는 있지만 새로운 업로드는 거부됩니다. 이는 일관성을 유지하고 악의적인 게임 서버가 아무 때나 사용자의 통계를 설정하는 것을 막기 위한 것입니다. 이러한 제약 사항을 고려했을 때, 통계는 라운드가 끝나기 전에 설정하는 것이 중요합니다. 사용자가 게임을 종료할 때 바로 저장할 수 있도록 통계를 지속적으로 설정하세요.

클라이언트는 게임 서버의 통계가 변경되면 자동으로 업데이트됩니다. 하지만 클라이언트와 마찬가지로 서버가 로드한 다른 사용자의 통계는 자동으로 새로 고침 되지 않으면 만료될 수 있습니다.

통계 재설정

개발 단계에서 테스트를 위해 전체 계정이나 하나의 계정의 통계 및 도전 과제를 완전히 삭제해야 할 수도 있습니다. 계정의 통계를 삭제하려면 ISteamUserStats::ResetAllStatsbAchievementsToo를 호출해 true로 설정하고 도전 과제까지 삭제합니다. 호출 시 통계와 도전 과제를 반복하고 회사 메모리 안의 게임 상태를 재설정하세요. 모든 사용자의 통계와 도전 과제를 한 번에 완전히 삭제하는 방법은 없습니다. 그 이유는, 전체 삭제를 진행하더라도 이미 진행 중인 게임은 삭제 사실을 인지하지 못하고 메모리 값을 다시 작성하기 때문입니다. 다행히도 전체 삭제 시스템을 게임 안에 구축하는 간단한 방법이 따로 있습니다. 방법은 다음과 같습니다.
  • ‘Version’과 같은 이름으로 통계를 정의하세요.
  • 하드코딩된 통계 버전의 숫자를 게임에 삽입하세요.
  • 통계가 모두 로드되면 ‘Version’ 통계를 귀사의 하드코드 버전 숫자와 비교하세요.
  • 두 숫자가 서로 일치하지 않으면 ISteamUserStats::ResetAllStats를 호출하고 ‘Version’ 통계를 하드코딩된 숫자로 설정하도록 하세요.
이렇게 하면 전체 삭제를 원할 때마다 하드코딩된 통계 버전 숫자만 변경하면 됩니다. 전체 삭제는 사용자가 새 빌드를 설치할 때마다 실행됩니다.

통계 일관성

서로 연관된 통계가 어떻게 일관성을 잃을 수 있는지 생각해 보는 것이 가장 좋습니다. 예를 들어, ‘GamesWon’, ‘GamesLost’, ‘GamesPlayed’의 세 가지 통계가 있을 수 있습니다. 아무리 최선을 다한다 해도 통계 간의 불일치를 완전히 막을 수는 없습니다. 여기서는, 이긴 게임과 진 게임을 합한 수가 플레이한 총 게임 수와 일치하지 않을 수 있습니다. ‘GamesPlayed’ -’GamesWon’으로 계산하지 않고 ‘GamesLost’를 삭제해 문제를 해결한다면, 불일치가 발생하여 ‘GamesLost’가 음수가 될 수 있습니다. 이 경우, ‘GamesPlayed’ 통계를 버리고 ‘GamesWon’ + ‘GamesLost’로 계산하는 것이 좋습니다.

전체 통계

통계를 관리자 페이지에서 집계하도록 표시해, Steam이 모든 사용자의 통계 값에 대한 전체 합계를 보관하도록 할 수 있습니다. 전체 통계는 게임 내 경제의 총금액, 총 처치 수, 선호 무기, 선호 맵, 승률이 높은 팀에 대한 데이터를 얻는데 사용될 수 있습니다. 그러나 ‘MostKills’와 같은 통계에 사용해서는 안 됩니다. 여러 사용자의 MostKills 값을 더하는 것은 무의미하기 때문입니다. 통계는 사용자의 손에 달려있으므로 이 데이터는 조작이 가능합니다. 따라서 집계된 통계를 사용할 때에는 최소값과 최대값, 증가 전용(해당하는 경우), 최대 변경의 범위를 적절하게 설정하는 것이 중요합니다. 최대 변경은 집계된 통계에서 특별한 의미를 가집니다. 새로운 값이 업로드되어도, 변경되는 합계 값은 최대 변경 값을 초과하지 않습니다. 이러한 방법으로 부정 행위자가 전체 합계에 영향을 주는 행위에 제한을 가합니다.

전체 합계에 접근하려면 ISteamUserStats::RequestGlobalStats를 호출한 다음, 전체 통계별로 ISteamUserStats::GetGlobalStat를 호출합니다. 또한, ISteamUserStats::RequestGlobalStats를 호출하여 이력에서 특정 기간의 통계에 접근할 수도 있습니다. 이력은 통계의 일일 변화량을 나타낸 것입니다. 이력은 ISteamUserStats::GetGlobalStatHistory를 사용해 접근할 수 있습니다.

또한 클라이언트에 전체 도전 과제 완료 백분율을 요청할 수 있습니다. 그러려면 먼저 ISteamUserStats::RequestGlobalAchievementPercentages를 호출하세요. 그런 다음 ISteamUserStats::GetMostAchievedAchievementInfoISteamUserStats::GetNextMostAchievedAchievementInfo를 호출해 가장 많이 완료한 도전 과제에서 가장 적게 완료한 도전 과제 순으로 반복하세요. 또한, ISteamUserStats::GetAchievementAchievedPercent를 호출해 특정 도전 과제의 완료 백분율을 얻을 수 있습니다.

Steam 커뮤니티

게임이 출시되면 개별 도전 과제 및 전체 도전 과제 진행 상황에 대한 정보가 Steam 커뮤니티에 노출됩니다. 플레이어의 프로필에는 자신이 달성한 도전 과제와 아직 잠금 해제하지 않은 도전 과제를 볼 수 있는 페이지로 연결되는 링크가 표시됩니다.
참고: 귀사의 도전 과제는 귀사의 앱이 커뮤니티에 어딘가에 노출되기 전에는 표시되지 않습니다.

각 도전 과제는 Steamworks 컨트롤 패널의 설정에 따라 적절한 아이콘과 이름, 설명과 함께 표시됩니다. 도전 과제 이름과 설명이 사용자가 선택한 언어로 현지화된 경우에는 해당 언어로 표시됩니다.

이 페이지의 링크와 게임의 Steam 메인 페이지에 있는 링크를 사용하면 게임의 전체 도전 과제 통계 모음으로 이동할 수 있습니다. 전체 도전 과제 통계 모음은 해당 게임을 플레이하는 사용자의 몇 퍼센트가 각 도전 과제를 달성했는지 가장 흔한 도전 과제부터 가장 희귀한 도전 과제까지 순서대로 보여줍니다. 플레이어 입장에서는 재미있는 기능이고, 개발자 입장에서는 게임의 도전 과제가 달성하기 너무 쉽거나 어렵지는 않은지 파악하는 자료로서 중요한 역할을 합니다. 관련 정보는 판매 및 활성화 보고서 사이트에서도 찾으실 수 있습니다.

다른 질문이 있으신가요?

통계 및 도전 과제 토론 게시판에서 질문해 주세요.