05
15

⚠️이 글은 공부한 내용을 정리한 글입니다.

 

썸네일

 

 


구현 개요

 

게임 스탯(통계) 및 업적 정의 도전 과제는 플랫폼마다 다르다.

그래도 공통점이 Steamworks 파트너 사이트의 앱 관리 페이지에서 설정된다는 것이다.

 

스팀웍스로 게임에서 저장할 수 있는 데이터는 세 가지 유형이 있다.

  • INT - A 32-bit (signed) integer (e.g. number of games played)
  • FLOAT - A 32-bit floating point value (e.g. number of miles driven)
  • AVGRATE - A moving average. See: The AVGRATE stat type

int, float, avgrate 이렇게 세가지가 있다.

 

avgrate는 average가 아니다. Average Rate의 줄임말이다.

 

┏AVGRATE가 뭐임?

더보기

AVGRATE라는 것이 눈에 띄는데 쉽게 설명하면 Steam에서 자동으로 평균을 내는 스탯이다.

 

예시로 "시급"같은 평균 스탯을 만든다고 생각해보자.

 

 시급을 구하기 위해서 다음과 같은 접근 방식을 생각해볼 수 있다.

INT로 선언된 "TotalMoney" 및 FLOAT "TotalPlayTimeHours"의 두 가지 스탯을 가지고

시간별로 돈를 나누어 시간당 버는 돈을 얻는 것이다.

 

이렇게 구하면 단점은 플레이어가 너무 많은 플레이 시간이 쌓이면 계산한 평균이 늦게 변경된다는 것이다.

그러니깐 사용자가 게임을 많이 할 수록 평균은 덜 반응한다.

사용자가 게임을 100시간 동안 플레이했다면 계산된 평균은 그보다 약 50시간 "지연"된다.

 

그러면  20시간의 게임 플레이만 값에 영향을 미치는 "시간당 급여",

즉 "시급"을 만들기 위해서 AVGRATE 스탯을 설정해 보자.

 

1. "AvgMoneyPerHour"라는 AVGRATE 통계와 20.0의 Window 속성을 생성한다.(단위는 시간, hour)

2. 게임 중 적절한 지점에 ISteamUserStats::UpdateAvgRateStat를 호출한다.

이 때 매개변수는 아래와 같이 들어가면 된다.

pchName - "AvgMoneyPerHour"

flCountThisSession - UpdateAvgRateStat를 마지막으로 호출한 이후 플레이어가 획득한 돈

dSessionLength - UpdateAvgRateStat에 대한 마지막 호출 이후의 게임 시간,

단위는 통계의 Window 속성에 있는 단위와 같아야 하므로 "시간(hour)"으로 해둔다.

 

참고 : 평균은 "시간당"이므로 관련된 모든 매개변수의 시간 단위는 "시간(hour)"으로 통일 해준다.

스탯 자체의 Window 속성과 아래 UpdateAvgRateStat에 전달된 "dSessionLength" 매개변수도 통일해야함.

 

예를 들어 플레이어가 0.225시간(13.5분) 동안 77원을 얻었다면

SteamUserStats()->UpdateAvgRateStat( "AvgMoneyPerHour", 77, 0.225 )로 해주면 된다.

 

위의 예에서 Steam은 현재 라운드에서 얻은 시간당 평균 77 ÷ 0.225해서 얻은 342.2를 이전 값과 더한다.

결과적으로 플레이어의 지금까지 20시간 플레이타임에 대한 총 평균을 반영한다.

만약 현재 사용자의 스탯(통계)이 처음 업데이트된 경우 현재 값은 342.2이 되는 셈.

 

이 예에서는 시간 단위로 "시간"을 사용하지만 원하는 시간 단위를 사용할 수 있습니다. 

Window 속성뿐만 아니라 "dSessionLength"의 기준으로 단위 통일해야하는 것만 명심하면 됨.

 

조금 있다가 Steamworks 파트너 웹사이트에서 스탯을 만들어 볼건데 거기서 이런것들을 할 수 있다. ↓

1. 초기 통계 및 업적 정의

2. 중간에 추가할 통계 및 업적 추가

3. 업적 이름, 설명 및 아이콘 업데이트

4. 통계 매개변수 및 제약 조건 업데이트(최대/최소 값, 이동 평균 창 크기 등)

 


Steamworks 파트너 웹사이트에서 관리

 

개요를 살펴봤으니 이제 관리 사이트를 알아보자

 

클릭해서 확대하세요

 

사이트 UI가 너무 어지러워서 하나하나 천천히 살펴보면서 정리해보았다.

 


01 스탯(통계) 부분

 

사이트에 가보면 알 수 있는데 스탯(통계)에는 다음과 같은 속성이 있다.

왼쪽부터 쭉 순서대로 보면

ID - 각 스탯(통계)에 대해 자동으로 생성된 숫자 ID
Type - 이 Stat의 유형, INT, FLOAT 또는 AVGRATE
API Name - API로 이 스탯에 접근할 때 쓰는 문자열이름 (네이밍은 자바 상수 느낌? ex) STATS_MONEY)
Set By - 스탯을 수정할 수 있는 사람을 설정한다. 기본값은 클라이언트다.

더 자세히는 ->  Game Server Stats.
Increment Only - 체크 설정하면 이 스탯(통계)은 시간이 지남에 따라 값이 증가만 되는지 정해짐
Max Change - 값 설정하면 스탯 값이 하나의 SetStat 호출에서 다음 호출로 변경되는 양의 제한을 설정함.
Min Value - 값이 설정된 경우 이 스탯(통계)이 취할 수 있는 최소 숫자 value가 정해짐  

기본적으로 최솟값은 기본 숫자 유형(INT_MIN 또는 -FLT_MAX)의 최솟값이다.
Max Value - 값이 설정된 경우 이 스탯(통계)이 취할 수 있는 최대 숫자 value가 정해짐

기본적으로 최댓값은 기본 숫자 유형(INT_MAX 또는 FLT_MAX)의 최댓값이다.
Default Value - 값이 설정된 경우 이 통계가 새 사용자에 대해 초기에 설정되는 기본값이다. 

설정하지 않으면 기본값은 0이다.
Aggregated - 체크 설정하면 Steam이 이 스탯에 대한 전체 합계를 유지한다.

더 자세히는 ->  Global Stats

Display Name - 앱에 표시될 때 이 통계의 이름 설정

 

⚠️만약에 위에서 Type을 AVGRATE로 설정하면 약간의 차이가 있다.

Window - 데이터를 평균화하는 데 사용되는 "sliding window"의 크기다.

그리고 당연히 Increment Only, Aggregated  옵션도 체크가 안된다.

 


02 업적(도전 과제) 부분

 

업적 탭에는 다음과 같은 속성이 있다.

이미지는 256 x 256으로 만들어서 넣어봄

ID - 각 업적에 대해 자동으로 생성된 숫자 ID입니다.
API Name - API로 이 스탯에 접근할 때 쓰는 문자열이름. (네이밍은 자바 상수 느낌? ex) ACHIEVE_1)
Progress Stat - 이 업적에 대한 커뮤니티의 진행률 표시줄로 사용되는 스탯(통계)을 지정한다.

스탯(통계)이 잠금 해제 값에 도달하면 업적도 자동으로 잠금 해제된다.
Display Name - 업적의 이름은 클라이언트 알림 팝업과 커뮤니티에 표시된다. 현지화 가능하다.
Description - 커뮤니티에 표시할 때 이 업적에 대한 설명 부분이다. 역시나 현지화 가능하다.
Set By - 업적을 잠금 해제할 수 있는 사람을 설정한다. 기본값은 클라이언트다.

더 자세히는 ->  Game Server Stats.
Hidden? - true인 경우 "숨겨진" 업적은 달성할 때까지 사용자의 커뮤니티 페이지에 표시되지 않는다.
Achieved Icon - 달성했을 때 표시되는 아이콘
Unachieved Icon - 아직 달성되지 않았을 때 표시되는 아이콘

 

업적 아이콘은 256x256픽셀 JPG 이미지가 제일 잘 나온다고 한다.

64x64만큼 작아도 되지만 더 큰 크기를 사용하는 것이 좋다.

획득한 아이콘은 다채로운 색상을 권장하고 달성되지 않은 아이콘은 회색조여야 한다.

또한 기본적으로 처음에 100개의 업적으로 제한된다.

 

 

 

COMMENT