부가 기능
인증에서는 다음과 같은 부가 기능을 제공합니다.
생년월일 확인 요청¶
AuthV4.checkAgeGate는 사용자에게 생년월일 정보를 입력할 수 있는 팝업을 노출합니다. 사용자는 팝업의 연/월/일 항목에서 본인 생년월일을 선택할 수 있습니다. 사용자가 입력을 완료하면 AuthV4.checkAgeGate는 그 값(yyyy-MM-dd 포맷)을 콜백으로 반환합니다.
Warning
사용자가 입력한 생년월일 정보가 정확한지 Hive SDK는 검증하지 않습니다.
Info
Hive SDK에 설정한 언어값에 따라 팝업 표시 언어가 바뀝니다. 또 언어값에 따라 연/월/일 순서가 바뀌어 노출될 수 있습니다.
취소 버튼 노출 제어¶
AuthV4.checkAgeGate 호출 시 useCloseButton 설정에 따라 취소 버튼 노출 여부를 결정할 수 있습니다. useCloseButton=false로 메서드를 호출하면 취소 버튼을 노출하지 않으며, 이 경우 사용자가 생년월일을 선택하기 전에 사용자는 팝업을 닫을 수도 없고 다른 화면으로 넘어갈 수도 없습니다.
예제 코드¶
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
bool useCloseButton = true; // or 'false'. (취소 버튼 사용 여부)
AuthV4::checkAgeGate (useCloseButton, [=](ResultAPI const & result, std::string dateOfBirth) {
if (!result.isSuccess()) {
// 실패 또는 취소
return;
}
else {
// 성공
// dateOfBirth 생년월일 데이터 반환 (yyyy-MM-dd 형태)
}
});
import com.hive.AuthV4
import com.hive.ResultAPI
var useCloseButton = true; // or 'false'. (취소 버튼 사용 여부)
AuthV4.checkAgeGate(useCloseButton, object : AuthV4.AuthV4AgeGateListener {
override fun onAuthV4AgeGate(result: ResultAPI, dateOfBirth: String?) {
if (!result.isSuccess) {
// 실패 또는 취소
return
}
else {
// 성공
// dateOfBirth 생년월일 데이터 반환 (yyyy-MM-dd 형태)
}
}
})
#import <HIVEService/HIVEService-Swift.h>
BOOL useCloseButton = YES; // or 'NO'. (취소 버튼 사용 여부)
[HIVEAuthV4 checkAgeGate:useCloseButton handler: ^(HIVEResultAPI *result, NSString *dateOfBirth) {
if (!result.isSuccess()) {
// 실패 또는 취소
return;
}
else {
// 성공
// dateOfBirth 생년월일 데이터 반환 (yyyy-MM-dd 형태)
}
}];
Facebook 친구 목록 가져오기¶
getProviderFriendsList()는 해당 게임을 하는 Facebook 친구의 PlayerID를 제공합니다. 게임을 하지만 Facebook 연동 이력이 없는 친구는 목록에 나타나지 않으며 게임 연동 이력은 있지만 현재 Facebook이 연동되어 있지 않은 경우 PlayerID -1을 리턴합니다.
Warning
2018년 5월 기준으로 Facebook 정책이 변경됨에 따라 기본 권한 항목이 변경되었습니다. Facebook 친구 목록 가져오기 기능을 계속 사용하려면 user_friends 권한 승인 요청이 필요합니다. Facebook 앱 검수 방법 확인하기
API Reference: hive.AuthV4.getProviderFriendsList
using hive;
AuthV4.ProviderType providerType = AuthV4.ProviderType.FACEBOOK;
AuthV4.getProviderFriendsList (providerType, (ResultAPI result, AuthV4.ProviderType providerType, Dictionary<String, Int64> providerUserIdList) => {
if (!result.isSuccess()) {
return;
}
if (providerUserIdList != null) {
foreach (KeyValuePair<String, Int64> providerUserId in providerUserIdList ) {
// providerUserId: providerUserId.Key
// playerId: providerUserId.Value
}
}
});
#include "HiveAuthV4.h"
EHiveProviderType TargetProviderType = EHiveProviderType::FACEBOOK;
FHiveAuthV4::GetProviderFriendsList(TargetProviderType,
FHiveAuthV4OnGetProviderFriendsListDelegate::CreateLambda([this](const FHiveResultAPI& Result, const EHiveProviderType& ProviderType, const ProviderFriendsMap& ProviderUserIdList) {
// (alias) using ProviderFriendsMap = TMap<FString, int64>;
if (!Result.IsSuccess()) {
return;
}
for (const auto& ProviderUserIdEntry : ProviderUserIdList) {
// ProviderUserId: ProviderUserIdEntry.Key;
// Player Id: ProviderUserIdEntry.Value;
}
}));
API Reference: AuthV4::getProviderFriendsList
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
ProviderType providerType = ProviderType::FACEBOOK;
AuthV4::getProviderFriendsList (providerType, [=](ResultAPI const & result, ProviderType providerType, map<string,PlayerID> providerUserIdList) {
if (!result.isSuccess()) {
return;
}
if (providerUserIdList != null) {
for(auto i = providerUserIdList.begin() ; i != providerUserIdList.end(); i++)
{
// providerUserId: ( i->first).c_str()
// playerId: i->second
}
}
});
API Reference: com.hive.AuthV4.getProviderFriendsList
import com.hive.AuthV4
import com.hive.ResultAPI
val providerType = AuthV4.ProviderType.FACEBOOK
AuthV4.getProviderFriendsList(providerType, object : AuthV4.AuthV4ProviderFriendsListener {
override fun onGetProviderFriendsList(result: ResultAPI, providerType: AuthV4.ProviderType, providerUserIdList: Map<String, Long>?) {
if (!result.isSuccess) {
return
}
providerUserIdList?.forEach {
// providerUserId: it.key
// playerId: it.value
}
}
})
API Reference: com.hive.AuthV4.getProviderFriendsList
import com.hive.AuthV4;
import com.hive.ResultAPI;
AuthV4.ProviderType type = AuthV4.ProviderType.FACEBOOK;
AuthV4.INSTANCE.getProviderFriendsList(type, (result, providerType, providerUserIdList) -> {
if (!result.isSuccess()) {
return;
}
if (providerUserIdList != null) {
for (Map.Entry<String, Long> entry : providerUserIdList.entrySet()) {
// providerUserId: entry.getKey();
// playerId: entry.getValue();
}
}
});
API Reference: AuthV4Interface.getProviderFriendsList
import HIVEService
AuthV4Interface.getProviderFriendsList(.Facebook) { result, retProviderType, providerUserIdList in
if !result.isSuccess() {
return
}
if let providerUserIdList = providerUserIdList {
for (key in providerUserIdList.keys) {
// providerUserId: key
// playerId: providerUserIdList[key]
}
}
}
API Reference: HIVEAuthV4:getProviderFriendsList
#import <HIVEService/HIVEService-Swift.h>
[HIVEAuthV4 getProviderFriendsList: HIVEProviderTypeFACEBOOK handler: ^(HIVEResultAPI *result, HIVEProviderType retProviderType, NSDictionary<NSString *,NSNumber *> *providerUserIdList) {
if (!result.isSuccess()) {
return;
}
if (providerUserIdList != nil) {
for (NSString *key in providerUserIdList) {
// providerUserId: key
// playerId: [[providerUserIdList objectForKey:key] longlongValue];
}
}
}];
OS 권한 다시 요청하기¶
AndroidManifest.xml 파일에는 게임에 필요 권한 목록이 정리되어 있습니다. 이 중 일부 권한을 해당 API의 String 리스트로 전달하여 사용해보세요. 사용자가 특정 권한을 수락했거나 거절했는지 확인할 수 있습니다. 사용자가 거절한 권한 중 Dangerous permission에 해당하는 권한이 있다면 OS 권한 동의 팝업으로 사용자에게 다시 노출합니다. 그 외 항목은 디바이스 설정 상태에 따라 자동으로 수락 또는 거절 처리됩니다. 권한을 잘못 입력하거나 오타가 있을 경우 AndroidManifest.xml 파일에 선언하지 않은 권한으로 간주하여 거절 처리합니다.
이 기능은 Android 6.0 (API level 23) 이상 버전에서 동작합니다. Android API level이 23 미만이거나 iOS일 경우에는 미지원 ResultAPI를 전달합니다.
Note
본 내용은 Android 전용 기능입니다.
예제 코드¶
API Reference: PlatformHelper .requestUserPermissions
String[] requestArray = {"android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.BLUETOOTH", "android.permission.READ_CONTACTS"};
List<String> requests = new List<String>(requestArray);
PlatformHelper.requestUserPermissions( requests, (ResultAPI result, String[] granted, String[] denied) => {
if (result.code == ResultAPI.Code.PlatformHelperOSNotSupported) {
//Android only
}
if (result.code == ResultAPI.Code.PlatformHelperOSVersionNotSupported) {
//Android OS version not supported.
}
if (granted != null && granted.Length > 0) {
foreach (String name in granted) {
// List of permissions accepted among requests
}
}
if (denied != null && denied.Length > 0) {
foreach (String name denied) {
// List of permissions denied among requests
}
}
});
#include "HivePlatformHelper.h"
TArray<FString> Requests;
Requests.Add(TEXT("android.permission.WRITE_EXTERNAL_STORAGE"));
Requests.Add(TEXT("android.permission.READ_CONTACTS"));
FHivePlatformHelper::RequestUserPermissions(Requests, FHivePlatformHelperOnUserPermissionsDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TArray<FString>& GrantedRequests, const TArray<FString>& DeniedRequests) {
switch(Result.Code) {
case FHiveResultAPI::ECode::Success: {
if (GrantedRequests.Num() > 0) {
// requests 중 수락한 권한 목락
}
if (DeniedRequests.Num() > 0) {
// requests 중 거절한 권한 목락
}
}
break;
case FHiveResultAPI::ECode::PlatformHelperOSVersionNotSupported:
// Android OS version not supported.
break;
default:
// 기타 예외 상황
break;
}
}));
API Reference: PlatformHelper ::requestUserPermissions
string requestArray[] = {"android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.BLUETOOTH", "android.permission.READ_CONTACTS"};
vector<string> requests(begin(requestArray), end(requestArray));
PlatformHelper::requestUserPermissions(requests, [=](ResultAPI const & result, vector<string> const & granted, vector<string> const & denied) {
if (result.code == hive::ResultAPI::PlatformHelperOSNotSupported) {
//Android only
}
if (result.code == hive::ResultAPI::PlatformHelperOSVersionNotSupported) {
//Android OS version not supported.
}
if (!granted.empty()) {
for (string name : granted) {
// List of permissions accepted among requests
}
}
if (!denied.empty()) {
for (string name : denied) {
// List of permissions denied among requests
}
}
});
API Reference: PlatformHelper.requestUserPermissions
import com.hive.PlatformHelper
import com.hive.ResultAPI
val requests = arrayListOf(
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.BLUETOOTH",
"android.permission.READ_CONTACTS"
)
PlatformHelper.requestUserPermissions(requests, object : PlatformHelper.RequestUserPermissionsListener {
override fun onRequestUserPermissions(result: ResultAPI, granted: List<String>, denied: List<String>) {
when (result.code) {
ResultAPI.Code.Success -> {
if (granted.isNotEmpty()) {
// List of permissions accepted among requests
}
if (denied.isNotEmpty()) {
// List of permissions denied among requests
}
}
ResultAPI.Code.PlatformHelperOSVersionNotSupported -> {
//Android OS version not supported.
}
else -> {
// other exception situations
}
}
}
})
API Reference: PlatformHelper .INSTANCE.requestUserPermissions
import com.hive.PlatformHelper;
import com.hive.ResultAPI;
List<String> requests = Arrays.asList(
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.BLUETOOTH",
"android.permission.READ_CONTACTS");
PlatformHelper.INSTANCE.requestUserPermissions(requests, (result, granted, denied) -> {
switch (result.getCode()) {
case Success:
if (!granted.isEmpty()) {
// List of permissions accepted among requests
}
if (!denied.isEmpty()) {
// List of permissions denied among requests
}
break;
case PlatformHelperOSVersionNotSupported:
//Android OS version not supported.
break;
default:
// other exception situations
break;
}
});
기기 관리 이용하기¶
기기 관리 는 하이브 콘솔에서의 설정에 따라 로그인 시 자동으로 동작합니다. 로그인 후 게임에서는 AuthV4 클래스의 showDeviceManagement() 메서드를 호출하여 사용자에게 기기 관리 목록을 보여줍니다. 기기 관리를 사용하는 게임은 기기 인증 실패로 인해 로그인이 해제되면 Result API의 AuthV4NotRegisteredDevice 코드를 처리하여 자동으로 재로그인을 시도하거나 로그아웃해야 합니다. 기기 관리 에 대한 자세한 내용은 운영가이드인 기기 관리 소개를 참고하세요.
API Reference: AuthV4.showDeviceManagement
API Reference: AuthV4 ::showDeviceManagement
API Reference: AuthV4.showDeviceManagement
API Reference: AuthV4.INSTANCE .showDeviceManagement
API Reference: AuthV4Interface .showDeviceManagement
API Reference: HIVEAuthV4 showDeviceManagement
Google Play 게임즈 업적 및 리더보드¶
Google 피처드 선정을 목적으로 개발한다면 Google Play Games의 업적과 리더보드 기능을 적용해야 합니다.
사용자가 Google Play로 로그인을 하면 Play Games Services(PGS)에 자동 로그인되어 업적과 리더보드를 사용할 수 있습니다. 관련 기능에 대한 자세한 설명은 Google Play Games 서비스 가이드를 참고하세요.
Note
AuthV4Helper 클래스를 사용할 때
- 사용자가 앱을 실행 후 Google Play Games로 묵시적 로그인 시도 중 로그인을 거절하면, 앱은 이를 기억하고 더 이상 묵시적 로그인을 시도하지 않습니다. 플레이어 세션이 유지되는 상태에서 자동 로그인이 가능하더라도 묵시적 로그인이 거절된 상태를 계속 기억합니다.
- Google Play로 로그인하지 않은 사용자가 업적을 달성해도 그 결과는 Google Play Games로 전송되지 않습니다.
이 내용은 Google Play Games 서비스 가이드를 준수합니다.
PlayerID 전달¶
Google Play 게임즈에 PlayerID를 요청하려면 ProviderGoogle 클래스의 getGooglePlayerId() 메서드를 호출해야 합니다. 이 메서드를 호출하면 Google Play 게임즈의 PlayerID뿐 아니라 유효성을 검증하는 AuthCode도 함께 전달됩니다.
API Reference: hive.ProviderGoogle.getGooglePlayerId
API Reference: ProviderGoogle::getGooglePlayerId
API Reference: com.hive.ProviderGoogle.getGooglePlayerId
업적¶
하이브 플랫폼을 이용해 Google Play 게임즈의 업적(Achievement) 기능을 사용하기 위해서는 ProviderGoogle 클래스를 사용하면 됩니다.
Google Play 게임즈의 숨겨진 업적 공개¶
Google Play 게임즈의 숨겨진 업적 공개 기능을 사용하기 위해서는 achievementsReveal() 메서드를 호출하세요. achievementsReveal() 사용 시 업적이 0%로 공개만 될 뿐 달성되지는 않습니다.
다음은 예제 코드입니다.
API Reference: hive.ProviderGoogle.achievementsReveal
API Reference: ProviderGoogle::achievementsReveal
API Reference: ProviderGoogle.achievementsReveal
import com.hive.ProviderGoogle
import com.hive.ResultAPI
//Achievement ID
val achievementId = "abcdef123456"
ProviderGoogle.achievementsReveal(achievementId, object : ProviderGoogle.GoogleAchievementsListener {
override fun onAchievementsResult(resultAPI: ResultAPI) {
if (resultAPI.isSuccess) {
// call successful
}
}
})
API Reference: ProviderGoogle .INSTANCE.achievementsReveal
Google Play 게임즈의 업적 달성 완료 요청¶
Google Play 게임즈의 업적 달성 완료 요청 기능을 사용하기 위해서는 achievementsUnlock() 메서드를 호출하세요. achievementsUnlock() 사용 시 업적의 공개 여부와 상관없이 업적이 100%로 달성됩니다.
다음은 예제 코드입니다.
API Reference: ProviderGoogle.achievementsUnlock
API Reference: ProviderGoogle::achievementsUnlock
API Reference: ProviderGoogle.achievementsUnlock
import com.hive.ProviderGoogle
import com.hive.ResultAPI
//Achievement ID
val achievementId = "abcdef123456"
ProviderGoogle.achievementsUnlock(achievementId, object : ProviderGoogle.GoogleAchievementsListener {
override fun onAchievementsResult(resultAPI: ResultAPI) {
if (resultAPI.isSuccess) {
// call successful
}
}
})
API Reference: ProviderGoogle .INSTANCE.achievementsUnlock
Google Play 게임즈의 업적 수치 증가 요청¶
Google Play 게임즈의 업적 수치 증가 요청 기능을 사용하기 위해서는 업적 수치를 파라미터로 설정하여 achievementsIncrement() 메서드를 호출하세요. 업적 수치는 해당 API가 호출되었을 시 설정된 value 값의 합산이며 총 합산이 Max가 될 경우 자동으로 업적이 달성됩니다.
다음은 예제 코드입니다.
API Reference: hive.ProviderGoogle.achievementsIncrement
#include "HiveProviderGoogle.h"
// 업적 ID
FString AchievementId = TEXT("abcdef123456");
// 업적 수치
int32 Value = 1;
FHiveProviderGoogle::AchievementsIncrement(AchievementId, Value, FHiveProviderGoogleOnAchievementsDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: ProviderGoogle::achievementsIncrement
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
//Achievement ID
string achievementId = "abcdef123456";
// Achievement numbers
int value = 1;
ProviderGoogle::achievementsIncrement(achievementId, value, [=](ResultAPI const & result) {
if(result.isSuccess()){
// call successful
}
});
API Reference: ProviderGoogle.achievementsIncrement
import com.hive.ProviderGoogle
import com.hive.ResultAPI
//Achievement ID
val achievementId = "abcdef123456"
// Achievement numbers
val value = 1
ProviderGoogle.achievementsIncrement(achievementId, value, object : ProviderGoogle.GoogleAchievementsListener {
override fun onAchievementsResult(resultAPI: ResultAPI) {
if (resultAPI.isSuccess) {
// call successful
}
}
})
API Reference: ProviderGoogle .INSTANCE.achievementsIncrement
Google Play 게임즈의 업적 목록 요청 (Helper)¶
Note
Hive SDK 4.7.0부터 기기에 로그인된 계정과 PlayerID에 연동된 계정을 더 쉽게 비교할 수 있도록 Helper가 제공됩니다. 연동된 계정이 다를 경우에 대한 처리는 기기에 로그인된 IdP 계정 확인을 참고하세요.
Google Play 게임즈의 업적 목록을 요청하기 위해서는 showAchievements() 메서드를 호출하세요.
다음은 예제 코드입니다.
API Reference: AuthV4.Helper.showAchievements
using hive;
AuthV4.Helper.showAchievements ((ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
switch (result.code) {
case ResultAPI.Code.Success:
// Deliver Success with achievement indication
break;
case ResultAPI.Code.AuthV4ConflictPlayer:
// account conflict
break;
case ResultAPI.Code.AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
#include "HiveAuthV4.h"
FHiveAuthV4::Helper::ShowAchievements(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
switch (Result.Code) {
case FHiveResultAPI::ECode::Success:
// 업적 표시와 함께 Success 전달
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// 계정 충돌
break;
case FHiveResultAPI::ECode::AuthV4GoogleLogout:
// TODO:
// Google Play 로그아웃 후 게임 로그아웃 실행
// 게임 재실행은 개발 스튜디오에서 처리해야함
break;
default:
// 기타 예외 상황
break;
}
}));
API Reference: AuthV4 ::Helper::showAchievements
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
AuthV4::Helper::showAchievements([=](ResultAPI const & result, shared_ptr playerInfo) {
switch (result.code) {
case ResultAPI::Success:
// Deliver Success with achievement indication
break;
case ResultAPI::AuthV4ConflictPlayer:
// account conflict
break;
case ResultAPI::AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
API Reference: AuthV4.Helper.showAchievements
import com.hive.AuthV4
import com.hive.ResultAPI
AuthV4.Helper.showAchievements(object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
when (result.code) {
ResultAPI.Code.Success -> {
// Deliver Success with achievement indication
}
ResultAPI.Code.AuthV4ConflictPlayer -> {
// account conflict
}
ResultAPI.Code.AuthV4GoogleLogout -> {
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
}
else -> {
// other exception situations
}
}
}
})
API Reference: AuthV4.Helper.INSTANCE.showAchievements
import com.hive.AuthV4;
import com.hive.ResultAPI;
AuthV4.Helper.INSTANCE.showAchievements((result, playerInfo) -> {
switch (result.getCode()) {
case Success:
// Deliver Success with achievement indication
break;
case AuthV4ConflictPlayer:
// account conflict
break;
case AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
Warning
Play Games Services 설정에서 로그아웃하는 경우, 로그아웃을 호출한 후 콜백으로 ResultAPI.Code.AuthV4GoogleLogout 에러코드가 전달됩니다. 로그아웃이 완료된 상태이므로 게임 내에서 이를 알리는 팝업을 노출하고 게임 타이틀로 이동합니다.
Google Play 게임의 업적 목록 요청 (Auth v4)¶
Google Play 게임의 업적 목록을 요청하기 위해서는 showAchievements() 메서드를 호출하세요.
다음은 예제 코드입니다.
API Reference: ProviderGoogle .showAchievements
using hive;
ProviderGoogle.showAchievements((ResultAPI result) => {
switch (result.code) {
case ResultAPI.Code.Success:
// Deliver Success with achievement indication
break;
case ResultAPI.Code.AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
#include "HiveProviderGoogle.h"
FHiveProviderGoogle::ShowAchievements(FHiveProviderGoogleOnLeaderboardsDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
case FHiveResultAPI::ECode::Success:
// 업적 표시와 함께 Success 전달
break;
case FHiveResultAPI::ECode::AuthV4GoogleLogout:
// TODO:
// Google Play 로그아웃 후 게임 로그아웃 실행
// 게임 재실행은 개발 스튜디오에서 처리해야함
break;
default:
// 기타 예외 상황
break;
}));
API Reference: ProviderGoogle ::showAchievements
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
ProviderGoogle::showAchievements([=](ResultAPI const & result) {
switch (result.code) {
case ResultAPI::Success:
// Deliver Success with achievement indication
break;
case ResultAPI::AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
API Reference: ProviderGoogle.showAchievements
import com.hive.ProviderGoogle
import com.hive.ResultAPI
ProviderGoogle.showAchievements(object : ProviderGoogle.GoogleAchievementsListener {
override fun onAchievementsResult(resultAPI: ResultAPI) {
when(resultAPI.code) {
ResultAPI.Code.Success -> {
// Deliver Success with achievement indication
}
ResultAPI.Code.AuthV4GoogleLogout -> {
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
}
else -> {
// other exception situations
}
}
}
})
API Reference: ProviderGoogle.INSTANCE.showAchievements
import com.hive.ProviderGoogle;
import com.hive.ResultAPI;
ProviderGoogle.INSTANCE.showAchievements(resultAPI -> {
switch (resultAPI.getCode()) {
case Success:
// Deliver Success with achievement indication
break;
case AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
Warning
Play Games Services 설정에서 로그아웃하는 경우 콜백으로 ResultAPI.Code.AuthV4GoogleLogout 에러코드가 전달됩니다. 이 에러가 전달되면 게임 내 로그아웃 버튼을 눌렀을 때와 동일하게 처리해야 합니다.
리더보드¶
하이브 플랫폼을 이용해 Google Play 게임의 리더보드 (Leaderboard) 기능을 사용하기 위해서는 ProviderGoogle 클래스를 사용하면 됩니다.
Google Play 게임의 리더보드 점수 갱신 요청¶
Google Play 게임의 리더보드 점수 갱신 요청을 하기 위해서는 leaderboardsSubmitScore() 메서드를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive.ProviderGoogle.leaderboardsSubmitScore
#include "HiveProviderGoogle.h"
// 리더보드 ID
FString LeaderboardId = TEXT("12345abcde");
// 리더보드 점수 수치
int64 Score = 100;
FHiveProviderGoogle::LeaderboardsSubmitScore(LeaderboardId, Score, FHiveProviderGoogleOnLeaderboardsDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: ProviderGoogle::leaderboardsSubmitScore
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
// Leaderboard ID
string leaderboardId = "12345abcde";
// Leaderboard score number
long score = 100;
ProviderGoogle::leaderboardsSubmitScore(leaderboardId, score, [=](ResultAPI const & result) {
if (result.isSuccess()) {
// API call successful
}
});
API Reference: ProviderGoogle.leaderboardsSubmitScore
import com.hive.ProviderGoogle
import com.hive.ResultAPI
// Leaderboard ID
val leaderboardId = "12345abcde"
// Leaderboard score number
val score = 100L
ProviderGoogle.leaderboardsSubmitScore(leaderboardId, score, object : ProviderGoogle.GoogleLeaderboardsListener {
override fun onLeaderboardsResult(resultAPI: ResultAPI) {
if (resultAPI.isSuccess) {
// API call successful
}
}
})
API Reference: com.hive.ProviderGoogle.leaderboardsSubmitScore
import com.hive.ProviderGoogle;
import com.hive.ResultAPI;
// Leaderboard ID
String leaderboardId = "12345abcde";
// Leaderboard score number
long score = 100;
ProviderGoogle.INSTANCE.leaderboardsSubmitScore(leaderboardId, score, resultAPI -> {
if (resultAPI.isSuccess()) {
// API call successful
}
});
Google Play 게임의 리더보드 목록 요청 (Helper)¶
Google Play 게임의 리더보드 목록을 요청하기 위해서는 showLeaderboards() 메서드를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive.AuthV4.Helper.showLeaderboard
using hive;
AuthV4.Helper.showLeaderboard ((ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
switch (result.code) {
case ResultAPI.Code.Success:
// Deliver Success with leaderboard display
break;
case ResultAPI.Code.AuthV4ConflictPlayer:
// account conflict
break;
case ResultAPI.CodeAuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
#include "HiveAuthV4.h"
FHiveAuthV4::Helper::ShowLeaderboard(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
case FHiveResultAPI::ECode::Success:
// 업적 표시와 함께 Success 전달
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// 계정 충돌
break;
case FHiveResultAPI::ECode::AuthV4GoogleLogout:
// TODO:
// Google Play 로그아웃 후 게임 로그아웃 실행
// 게임 재실행은 개발 스튜디오에서 처리해야함
break;
default:
// 기타 예외 상황
break;
}));
API Reference: com.hive.AuthV4.Helper.showLeaderboard
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
AuthV4::Helper::showLeaderboard([=](ResultAPI const & result, shared_ptr playerInfo) {
switch (result.code) {
case ResultAPI::Success:
// Deliver Success with leaderboard display
break;
case ResultAPI::AuthV4ConflictPlayer:
// account conflict
break;
case ResultAPI::AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
break;
}
});
API Reference: Helper.showLeaderboard
import com.hive.AuthV4
import com.hive.ResultAPI
AuthV4.Helper.showLeaderboard(object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
when (result.code) {
ResultAPI.Code.Success -> {
// Deliver Success with leaderboard display
}
ResultAPI.Code.AuthV4ConflictPlayer -> {
// account conflict
}
ResultAPI.Code.AuthV4GoogleLogout -> {
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
}
else -> {
// other exception situations
}
}
}
})
API Reference: AuthV4.Helper.INSTANCE.showLeaderboard
import com.hive.AuthV4;
import com.hive.ResultAPI;
AuthV4.Helper.INSTANCE.showLeaderboard((result, playerInfo) -> {
switch (result.getCode()) {
case Success:
// Deliver Success with leaderboard display
break;
case AuthV4ConflictPlayer:
// account conflict
break;
case AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
Warning
Play Games Services 설정에서 로그아웃하는 경우, 로그아웃을 호출한 후 콜백으로 ResultAPI.Code.AuthV4GoogleLogout 에러코드가 전달됩니다. 로그아웃이 완료된 상태이므로 게임 내에서 이를 알리는 팝업을 노출하고 게임 타이틀로 이동합니다.
Google Play 게임의 리더보드 목록 요청 (Auth v4)¶
Google Play 게임의 리더보드 목록을 요청하기 위해서는 showLeaderboards() 메서드를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive.ProviderGoogle.showLeaderboards
using hive;
ProviderGoogle.showLeaderboards(onLeaderboardsResult, (ResultAPI result) => {
switch (result.code) {
case ResultAPI.Code.Success:
// Deliver Success with leaderboard display
break;
case ResultAPI.CodeAuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
#include "HiveProviderGoogle.h"
FHiveProviderGoogle::ShowLeaderboard(FHiveProviderGoogleOnLeaderboardsDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
case FHiveResultAPI::ECode::Success:
// 업적 표시와 함께 Success 전달
break;
case FHiveResultAPI::ECode::AuthV4GoogleLogout:
// TODO:
// Google Play 로그아웃 후 게임 로그아웃 실행
// 게임 재실행은 개발 스튜디오에서 처리해야함
break;
default:
// 기타 예외 상황
break;
}));
API Reference: ProviderGoogle::showLeaderboards
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
ProviderGoogle::showLeaderboard([=](ResultAPI const & result) {
switch (result.code) {
case ResultAPI::Success:
// Deliver Success with leaderboard display
break;
case ResultAPI::AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
API Reference: ProviderGoogle.showLeaderboards
import com.hive.ProviderGoogle
import com.hive.ResultAPI
ProviderGoogle.showLeaderboards(object : ProviderGoogle.GoogleLeaderboardsListener {
override fun onLeaderboardsResult(resultAPI: ResultAPI) {
when(resultAPI.code) {
ResultAPI.Code.Success -> {
// Deliver Success with leaderboard display
}
ResultAPI.Code.AuthV4GoogleLogout -> {
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
}
else -> {
// other exception situations
}
}
}
})
API Reference: com.hive.ProviderGoogle.showLeaderboards
import com.hive.ProviderGoogle;
import com.hive.ResultAPI;
ProviderGoogle.INSTANCE.showLeaderboards(resultAPI -> {
switch (resultAPI.getCode()) {
case Success:
// Deliver Success with leaderboard display
break;
case AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
Warning
Play Games Services 설정에서 로그아웃하는 경우 콜백으로 ResultAPI.Code.AuthV4GoogleLogout 에러코드가 전달됩니다. 이 에러가 전달되면 게임 내 로그아웃 버튼을 눌렀을 때와 동일하게 처리해야 합니다.
Google Play Games 게임 통계¶
Google Level Up 프로그램 참여를 목적으로 개발한다면 Google Play Games의 게임 통계 기능을 적용해야 합니다.
Google Play Games의 게임 통계(Game Stats)는 사용자의 플레이 기록을 이벤트로 수집해 게이머 프로필에 통계로 노출하는 기능입니다. 앱이 통계 항목을 직접 정의하며, 누적 합계나 최고 기록 같은 집계 방식을 Google Play Console에서 설정합니다.
Hive 플랫폼을 이용해 게임 통계 기능을 사용하기 위해서는 AuthV4.Helper 클래스를 사용하면 됩니다. 관련 기능에 대한 자세한 설명은 Google Play Games 게임 통계를 참조하세요.
게임 통계는 Hive SDK 26.7.0부터 지원합니다. Android 전용이며 iOS는 지원하지 않습니다. 게임 통계를 사용하기 위해서는 Android minSdk 24 이상이어야 합니다.
Caution
게임 통계는 Play Games Services 인증을 전제로 하며, Hive 계정 연동 여부와는 무관합니다. 사용자가 Google Play로 로그인하지 않았거나 묵시적 로그인을 거절한 상태에서는 API가 성공을 반환하더라도 통계가 수집되지 않습니다.
사전 준비¶
게임 통계를 사용하려면 Google Play Console에 이벤트를 만들고 통계를 설정해야 합니다. 이벤트 만들기는 앱이 어떤 플레이 기록을 보낼지 선언하는 것이고, 통계 설정은 그렇게 모은 기록을 게이머 프로필에 어떤 통계로 보여 줄지 정의하는 것입니다.
이벤트 만들기¶
게시되지 않은 새 게임의 이벤트를 만들려면 PlayerGameEvent.csv 이벤트용 CSV 파일을 만들어야 합니다.
관련하여 보다 자세한 설명은 이벤트용 CSV 파일 가이드라인을 참조하세요.
PlayerGameEvent.csv에는 앱이 전송할 이벤트 이름과 속성을 선언합니다. 속성 타입은 STRING, INT64, DOUBLE, BOOL 네 가지입니다.
progressUpdate는 Google Play Games가 진행도 전용으로 미리 정해 둔 예약 이벤트이며, 속성으로 currentProgress만 사용합니다.
파일 구성 예시는 아래 이벤트와 속성 선언을 참조하세요.
통계 설정¶
통계를 설정하기 위해서는 RepetitiveStatsConfig.csv 파일과 ProgressionStatConfig.csv 을 반드시 포함한 통계용 ZIP 파일을 업로드해야 합니다. StatLocalizations.csv 파일은 사용자 화면에 표시될 통계 이름과 설명을 여러 언어로 번역(Localization)하기 위한 파일이며 선택 사항입니다.
RepetitiveStatsConfig.csv 파일에는 사용자가 반복해서 수행하는 행위을 집계하기 위한 반복 통계 항목을 정의합니다. 반복 통계는 SUM, MAX, MIN, COUNT 집계 방식을 지원하며 특정 속성 값을 조건으로 하는 필터를 적용할 수 있습니다.
파일 구성 예시는 아래 반복 통계 정의를 참조하세요.
ProgressionStatConfig.csv에는 사용자가 앱을 얼마나 진행했는지 보여 주는 진행 통계를 정의합니다. Google Play Games의 게임 진행도 기록 요청을 사용하여 진행 통계를 기록할 수 있습니다.
파일 구성 예시는 아래 진행 통계 정의를 참조하세요.
작성한 CSV 파일과 통계 아이콘은 ZIP으로 묶어 Google Play Console에 업로드합니다. 통계마다 필요한 아이콘의 규격과 ZIP 구성 규칙은 통계용 ZIP 파일 가이드라인을 참조하세요.
설정 예시¶
앞의 두 단계에서 생성한 이벤트와 통계가 게이머 프로필에 어떻게 표시되는지 아래 예시로 확인하세요.
예시는 엔드리스 러닝 게임입니다. 플레이어는 캐릭터를 선택해 달리고, 한 판이 끝나면 어떤 캐릭터로 얼마나 달렸는지, 코인을 몇 개 모았는지, 신기록인지가 정해집니다. 이 네 가지를 한 판이 끝날 때마다 run_finished 이벤트 하나에 담아 전송합니다. 여기에 한 판의 결과가 아니라 앱을 얼마나 진행했는지를 보여 주는 Run Level을 더해 통계 다섯 개를 구성했습니다.
엔드리스 러닝 장르의 게임을 예시로 설명합니다. 플레이어가 캐릭터를 선택해 진행한 한 라운드가 종료되면, 세션 데이터 4종과 누적 진행도 데이터 1종을 합쳐 총 5개의 통계를 단일 run_finished 이벤트에 담아 전송합니다.
- 라운드 결과 통계 (4종): 선택한 캐릭터, 이동 거리, 획득 코인 수, 신기록 달성 여부
- 계정 진행도 통계 (1종): 앱의 전체 누적 진행 상태를 나타내는
Run Level
이벤트와 속성 선언¶
PlayerGameEvent.csv에 전송할 이벤트 이름과 속성을 선언합니다. 이벤트는 20개까지, 이벤트마다 속성은 20개까지 선언할 수 있습니다.
Event Name,Property Name,Property Type
progressUpdate,currentProgress,INT64
run_finished,runner_id,STRING
run_finished,is_new_record,BOOL
run_finished,coins_collected,INT64
run_finished,distance_meters,DOUBLE
반복 통계 정의¶
RepetitiveStatsConfig.csv에 사용자가 반복해서 수행하는 행동을 집계하는 통계를 정의합니다. Stat Display Name 열의 값이 게이머 프로필에 표시되는 통계 이름이 됩니다.
Stat Id,Event Name,Event Property Name,Aggregation Type,Stat Display Name,Stat Description,Filter Property,Filter Operator,Filter Value,Is Competitive,Min limit,Max limit,Icon File Name,Good value direction,Unit
best_distance,run_finished,distance_meters,MAX,Best Run Distance,The farthest distance the player has run in a single run.,,,,true,0,100000,stat_best_distance.png,INCREASING,METER
total_coins,run_finished,coins_collected,SUM,Total Run Coins,Total number of coins the player has collected across all runs.,,,,false,,,stat_total_coins.png,INCREASING,
record_runs,run_finished,is_new_record,COUNT,New Record Runs,Number of runs in which the player set a new personal record.,is_new_record,=,TRUE,false,,,stat_record_runs.png,INCREASING,
runner_count,run_finished,runner_id,COUNT,Ninja Runs,Number of runs completed with the ninja character.,runner_id,=,runner_ninja,false,,,stat_runner_count.png,INCREASING,
Aggregation Type은 동일한 이벤트가 누적 발생할 때 데이터를 하나의 대표값으로 산출하는 방식이며 SUM, MAX, MIN, COUNT를 지원합니다.
- 적용 예시: 최고 거리는
MAX, 코인 합계에SUM, 발생 횟수는COUNT를 적용합니다.
필터는 Filter Property, Filter Operator, Filter Value 3개 열로 구성되며, 해당 조건을 충족하는 이벤트만 집계 대상에 포함합니다. 필터를 적용하지 않을 때는 3개 열을 모두 비워 둡니다.
- 동일 이벤트 분기 예시:
record_runs와runner_count는 동일한run_finished이벤트를 기반으로 수집되더라도, 설정된 필터 조건이 다르면 서로 별개의 통계 항목으로 각각 집계됩니다.
Note
Is Competitive가 true인 통계는 Min limit과 Max limit이 필요합니다. 위 예시에서는 best_distance에 0 ~ 100000 범위를 지정했습니다.
진행 통계 정의¶
ProgressionStatConfig.csv 파일에는 사용자가 앱을 얼마나 진행했는지 보여 주는 통계를 정의합니다. 진행 통계는 게이머 프로필에서 첫 번째 통계로 표시됩니다.
Stat Id,Event Property Name,Stat Display Name,Stat Description,Icon File Name,Good value direction,Unit
player_level,currentProgress,Run Level,Players accumulate experience by finishing runs and level up.,stat_player_level.png,INCREASING,
진행 통계는 반복 통계와 달리 이벤트 이름 열과 집계 열이 존재하지 않습니다. 이는 진행 통계는 예약 이벤트 progressUpdate를 고정으로 사용하며, 마지막으로 전달된 값을 그대로 표출하는 방식이기 때문입니다.
progressUpdate 예약 이벤트 별도 사용 사유¶
Run Level과 같이 앱의 진행 수준을 나타내는 지표는 단일 라운드의 결과가 아닌 유저의 현재 상태(Current State)를 의미합니다. 이러한 진행도 데이터는 Google Play Games가 사전 정의한 전용 예약 이벤트인 progressUpdate를 통해 전송되며, Hive SDK에서는 gameStatsRecordProgress() 메서드를 호출하여 기록합니다.
진행도는 누적 집계 대상이 아니므로 별도의 연산 과정(SUM, MAX 등)을 거치지 않습니다. 동일한 지표를 여러 번 전달하더라도 합산되지 않으며, 가장 최근에 전송된 최신값으로 업데이트되어 표시됩니다.
ZIP 파일 구성¶
반복 통계와 진행 통계 CSV 파일, 그리고 통계마다 필요한 아이콘을 ZIP으로 묶어 업로드합니다. 위 예시에 필요한 ZIP 구성은 아래와 같습니다.
RepetitiveStatsConfig.csv
ProgressionStatConfig.csv
StatLocalizations.csv # 선택 사항
stat_best_distance.png
stat_total_coins.png
stat_record_runs.png
stat_runner_count.png
stat_player_level.png
아이콘은 512 x 512 px 크기의 PNG 또는 JPEG 이미지여야 하며, Icon File Name 열에 입력한 파일명과 일치해야 합니다. 모든 설정 파일은 ZIP 파일 최상위 경로에 위치해야 하며, 하위 디렉터리는 지원하지 않습니다. 통계 지표는 2개의 CSV 파일을 합산하여 최대 50개까지 정의할 수 있습니다.
Warning
PlayerGameEvent.csv는 ZIP에 포함하지 않습니다. 이벤트는 Google Play Console의 이벤트 설정에서 CSV 파일로 먼저 등록하고, 통계는 통계 설정에서 ZIP 파일로 등록합니다.
게시된 게임 통계는 삭제할 수 없으므로 통계 구성은 게시 전에 확정하세요.
게임 통계 기록¶
전송할 이벤트는 게임 통계 이벤트 클래스로 만듭니다. 클래스 이름은 엔진에 따라 다르며, Unity와 C++, Android에서는 AuthV4.GameStatsEvent를, Unreal Engine에서는 FHiveGameStatsEvent를 사용합니다. 생성자에 Google Play Console에 선언한 이벤트 이름을 넣고, 속성 타입에 맞는 addProperty() 메서드로 속성을 채웁니다. 속성의 이름과 타입을 선언하는 방법에 대한 자세한 설명은 이벤트용 CSV 파일 가이드라인을 참조하세요.
이번 절에서 설명하는 세 메서드는 이벤트를 기기의 버퍼에 기록하기만 합니다. 실제 전송은 Google Play Games의 게임 통계 이벤트 업로드 요청에서 설명하는 gameStatsRequestEventsUpload()를 호출할 때 이루어집니다.
Caution
속성의 이름과 타입은 Google Play Console에 선언한 값과 반드시 일치해야 합니다. 일치하지 않을 경우 해당 이벤트가 통계에 반영되지 않습니다.
Google Play Games의 게임 통계 이벤트 기록 요청¶
게임 통계 이벤트 한 건을 기록하기 위해서는 gameStatsRecordEvent() 메서드를 호출하세요.
아래는 예제 코드입니다. 사전 준비에서 선언한 run_finished 이벤트를 그대로 사용합니다. 이벤트 이름과 속성 이름은 CSV에 선언한 값을 그대로 쓰고, 속성 값은 앱이 플레이 결과로 채우는 값입니다.
API Reference: hive.AuthV4.Helper.gameStatsRecordEvent
using hive;
// Google Play Console에 선언한 이벤트 이름
AuthV4.GameStatsEvent gameStatsEvent = new AuthV4.GameStatsEvent("run_finished")
.addProperty("runner_id", "runner_ninja") // STRING
.addProperty("is_new_record", true) // BOOL
.addProperty("coins_collected", 10L) // INT64
.addProperty("distance_meters", 1350.2); // DOUBLE
AuthV4.Helper.gameStatsRecordEvent(gameStatsEvent, (ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
if (result.isSuccess()) {
// call successful
}
});
#include "HiveAuthV4.h"
// Google Play Console에 선언한 이벤트 이름
FHiveGameStatsEvent GameStatsEvent(TEXT("run_finished"));
GameStatsEvent.AddProperty(TEXT("runner_id"), FString(TEXT("runner_ninja"))) // STRING
.AddProperty(TEXT("is_new_record"), true) // BOOL
.AddProperty(TEXT("coins_collected"), 10) // INT64
.AddProperty(TEXT("distance_meters"), 1350.2); // DOUBLE
FHiveAuthV4::Helper::GameStatsRecordEvent(GameStatsEvent, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: AuthV4::Helper::gameStatsRecordEvent
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
// Google Play Console에 선언한 이벤트 이름
GameStatsEvent gameStatsEvent("run_finished");
gameStatsEvent.addProperty("runner_id", "runner_ninja") // STRING
.addProperty("is_new_record", true) // BOOL
.addProperty("coins_collected", (long long)10) // INT64
.addProperty("distance_meters", 1350.2); // DOUBLE
AuthV4::Helper::gameStatsRecordEvent(gameStatsEvent, [=](ResultAPI const & result, shared_ptr<PlayerInfo> playerInfo) {
if (result.isSuccess()) {
// call successful
}
});
API Reference: AuthV4.Helper.gameStatsRecordEvent
import com.hive.AuthV4
import com.hive.ResultAPI
// Google Play Console에 선언한 이벤트 이름
val gameStatsEvent = AuthV4.GameStatsEvent("run_finished")
.addProperty("runner_id", "runner_ninja") // STRING
.addProperty("is_new_record", true) // BOOL
.addProperty("coins_collected", 10L) // INT64
.addProperty("distance_meters", 1350.2) // DOUBLE
AuthV4.Helper.gameStatsRecordEvent(gameStatsEvent, object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// call successful
}
}
})
API Reference: AuthV4.Helper.INSTANCE.gameStatsRecordEvent
import com.hive.AuthV4;
import com.hive.ResultAPI;
// Google Play Console에 선언한 이벤트 이름
AuthV4.GameStatsEvent gameStatsEvent = new AuthV4.GameStatsEvent("run_finished")
.addProperty("runner_id", "runner_ninja") // STRING
.addProperty("is_new_record", true) // BOOL
.addProperty("coins_collected", 10L) // INT64
.addProperty("distance_meters", 1350.2); // DOUBLE
AuthV4.Helper.INSTANCE.gameStatsRecordEvent(gameStatsEvent, (result, playerInfo) -> {
if (result.isSuccess()) {
// call successful
}
});
Google Play Games의 게임 통계 이벤트 여러 건 기록 요청¶
여러 건의 게임 통계 이벤트를 한 번에 기록하기 위해서는 gameStatsRecordEvents() 메서드를 호출하세요. 이벤트 목록에는 같은 이벤트를 여러 건 담을 수도 있고 서로 다른 이벤트를 섞어 담을 수도 있으며, 선언된 속성 중 일부만 채워 보낼 수도 있습니다.
아래는 예제 코드입니다. 같은 run_finished 이벤트를 두 건 담으면서 속성은 runner_id와 coins_collected만 채우는 경우를 보여 줍니다.
API Reference: hive.AuthV4.Helper.gameStatsRecordEvents
using hive;
List<AuthV4.GameStatsEvent> gameStatsEvents = new List<AuthV4.GameStatsEvent>();
gameStatsEvents.Add(new AuthV4.GameStatsEvent("run_finished")
.addProperty("runner_id", "runner_ninja")
.addProperty("coins_collected", 2L));
gameStatsEvents.Add(new AuthV4.GameStatsEvent("run_finished")
.addProperty("runner_id", "runner_default")
.addProperty("coins_collected", 5L));
AuthV4.Helper.gameStatsRecordEvents(gameStatsEvents, (ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
if (result.isSuccess()) {
// call successful
}
});
#include "HiveAuthV4.h"
FHiveGameStatsEvent First(TEXT("run_finished"));
First.AddProperty(TEXT("runner_id"), FString(TEXT("runner_ninja")))
.AddProperty(TEXT("coins_collected"), 2);
FHiveGameStatsEvent Second(TEXT("run_finished"));
Second.AddProperty(TEXT("runner_id"), FString(TEXT("runner_default")))
.AddProperty(TEXT("coins_collected"), 5);
TArray<FHiveGameStatsEvent> GameStatsEvents;
GameStatsEvents.Add(First);
GameStatsEvents.Add(Second);
FHiveAuthV4::Helper::GameStatsRecordEvents(GameStatsEvents, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: AuthV4::Helper::gameStatsRecordEvents
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
GameStatsEvent first("run_finished");
first.addProperty("runner_id", "runner_ninja")
.addProperty("coins_collected", (long long)2);
GameStatsEvent second("run_finished");
second.addProperty("runner_id", "runner_default")
.addProperty("coins_collected", (long long)5);
vector<GameStatsEvent> gameStatsEvents;
gameStatsEvents.push_back(first);
gameStatsEvents.push_back(second);
AuthV4::Helper::gameStatsRecordEvents(gameStatsEvents, [=](ResultAPI const & result, shared_ptr<PlayerInfo> playerInfo) {
if (result.isSuccess()) {
// call successful
}
});
API Reference: AuthV4.Helper.gameStatsRecordEvents
import com.hive.AuthV4
import com.hive.ResultAPI
val gameStatsEvents = listOf(
AuthV4.GameStatsEvent("run_finished")
.addProperty("runner_id", "runner_ninja")
.addProperty("coins_collected", 2L),
AuthV4.GameStatsEvent("run_finished")
.addProperty("runner_id", "runner_default")
.addProperty("coins_collected", 5L)
)
AuthV4.Helper.gameStatsRecordEvents(gameStatsEvents, object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// call successful
}
}
})
API Reference: AuthV4.Helper.INSTANCE.gameStatsRecordEvents
import com.hive.AuthV4;
import com.hive.ResultAPI;
List<AuthV4.GameStatsEvent> gameStatsEvents = new ArrayList<>();
gameStatsEvents.add(new AuthV4.GameStatsEvent("run_finished")
.addProperty("runner_id", "runner_ninja")
.addProperty("coins_collected", 2L));
gameStatsEvents.add(new AuthV4.GameStatsEvent("run_finished")
.addProperty("runner_id", "runner_default")
.addProperty("coins_collected", 5L));
AuthV4.Helper.INSTANCE.gameStatsRecordEvents(gameStatsEvents, (result, playerInfo) -> {
if (result.isSuccess()) {
// call successful
}
});
Google Play Games의 게임 진행도 기록 요청¶
사용자의 진행도를 기록하기 위해서는 gameStatsRecordProgress() 메서드를 호출하세요. 이 메서드로 보낸 값은 예약 이벤트 progressUpdate로 전송되어 ProgressionStatConfig.csv에 정의한 진행 통계에 반영됩니다.
진행도는 누적값이 아니라 현재 값입니다. 값을 세 번 보내도 합산되지 않고 마지막에 보낸 값이 표시됩니다. 앱 시작 시점에 항상 현재 진행도를 전송하는 것을 권장합니다.
Caution
Google Play Console에서 currentProgress를 INT64 또는 STRING으로 선언할 수 있습니다. 선언한 타입과 다르게 보내면 해당 이벤트가 폐기되어 통계에 반영되지 않으므로, 문자열로 선언한 경우에만 문자열 값을 받는 gameStatsRecordProgress()를 사용하세요. 문자열 값은 랭크 티어처럼 숫자로 표현하기 어려운 진행 수준을 기록할 때 쓰며, 문자열끼리의 순서를 정하는 기준은 공개되어 있지 않으므로 가능하면 숫자를 사용하세요.
아래는 예제 코드입니다.
API Reference: hive.AuthV4.Helper.gameStatsRecordProgress
#include "HiveAuthV4.h"
// 플레이어의 현재 진행 수준
int64 CurrentProgress = 5;
FHiveAuthV4::Helper::GameStatsRecordProgress(CurrentProgress, FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: AuthV4::Helper::gameStatsRecordProgress
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
// 플레이어의 현재 진행 수준
long long currentProgress = 5;
AuthV4::Helper::gameStatsRecordProgress(currentProgress, [=](ResultAPI const & result, shared_ptr<PlayerInfo> playerInfo) {
if (result.isSuccess()) {
// call successful
}
});
API Reference: AuthV4.Helper.gameStatsRecordProgress
import com.hive.AuthV4
import com.hive.ResultAPI
// 플레이어의 현재 진행 수준
val currentProgress = 5L
AuthV4.Helper.gameStatsRecordProgress(currentProgress, object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// call successful
}
}
})
API Reference: AuthV4.Helper.INSTANCE.gameStatsRecordProgress
Google Play Games의 게임 통계 이벤트 업로드 요청¶
기기의 버퍼에 쌓인 게임 통계 이벤트의 업로드를 요청하기 위해서는 gameStatsRequestEventsUpload() 메서드를 호출하세요.
Caution
gameStatsRecordEvent(), gameStatsRecordEvents(), gameStatsRecordProgress()는 이벤트를 기기의 버퍼에 기록할 뿐 전송하지는 않습니다. gameStatsRequestEventsUpload()를 호출해야 실제로 Google 서버로 전송됩니다. 통계가 수집되지 않을 때 가장 먼저 확인해야 할 부분입니다.
아래는 예제 코드입니다.
API Reference: hive.AuthV4.Helper.gameStatsRequestEventsUpload
API Reference: AuthV4::Helper::gameStatsRequestEventsUpload
API Reference: AuthV4.Helper.gameStatsRequestEventsUpload
API Reference: AuthV4.Helper.INSTANCE.gameStatsRequestEventsUpload
이벤트가 정상적으로 업로드되면 Google Play 스토어 앱의 내 페이지 탭에서 게이머 프로필을 열어 게임 통계를 확인하세요.
업로드 후 노출까지 시간이 걸리므로 즉시 확인되지 않는 것은 정상입니다. 통계가 노출되지 않을 때는 아래 순서로 확인하세요.
gameStatsRequestEventsUpload()를 호출했는지 확인합니다.- Google Play 로그인 상태를 확인합니다.
- CSV에 선언한 이벤트명과 속성명 및 타입이 코드에서 쓴 값과 일치하는지 확인합니다.
- 터미널 설정을 통해 기기에서 로그 메세지를 확인합니다. 'Successfully submitted GameStats event' 와 같은 메세지가 출력되면 전송 성공입니다.
Apple Game Center 게임 업적 및 리더보드¶
Apple 피쳐드 선정을 위해서는 Apple Game Center의 업적과 리더보드 기능 적용이 필요합니다.
하이브 플랫폼이 제공하는 Apple Game Center의 업적과 리더보드 기능은 사용자 인증 상태와는 무관합니다. 즉, Apple Game Center의 업적과 리더보드 기능을 이용하는 데 사용된 Apple Game Center 계정이 하이브 플랫폼에 로그인된 계정에 연동되어 있지 않거나 실제로 연동된 계정과 다를 수 있습니다.
Apple Game Center의 기능에 대한 자세한 설명은 Apple Game Center 가이드를 참고하세요.
Note
- iOS 엔터프라이즈 빌드에서는 Apple Game Center를 지원하지 않습니다.
- 업적 (Achievement)
- 리더보드 (Leaderboard)
업적 (Achievement)¶
하이브 플랫폼을 이용해 Apple Game Center의 업적(Achievement) 기능을 사용하기 위해서는 ProviderApple 클래스를 사용하면 됩니다.
Game Center 업적 목록 요청¶
Apple Game Center의 업적 목록 요청 기능을 사용하기 위해서는 loadAchievements() 함수를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive.ProviderApple.loadAchievements
// Request achievement list to Provider Apple
// using hive
// Callback handler managing the request for achievement list to Provider Apple
public void onLoadAchievements(ResultAPI result, List achievementList) {
Logger.log("ProviderTestView.onLoadAchievements() Callback\nresult = " + result.toString() + "\n");
if (result.isSuccess() != true)
return;
}
// Request achievement list to Provider Apple
ProviderApple.loadAchievements(onLoadAchievements);
API Reference: ProviderApple::loadAchievements
// Request achievement list to Provider Apple
ProviderApple::loadAchievements([=](ResultAPI const & result,std::vector<ProviderAppleAchievement>; const & achievements) {
// Result callback
cout<<"ProviderApple::loadAchievements() Callback"<<endl<<result.toString()<<endl;
if (result.isSuccess() != true)
return;
});
API Reference: HIVEProviderApple::showAchievements:
API Reference: HIVEProviderApple::showAchievements:
// Request achievement list to Provider Apple
[HIVEProviderApple loadAchievements:^(HIVEResultAPI <i>result, NSArray<HIVEProviderAppleAchievement </i>>; *achievements) {
Loggerd(@"HIVEProviderApple.loadAchievements:\nresult = %@\nachievements = %@", result, achievements);
if (result.isSuccess) {
}
else {
}
}];
Game Center 업적 전송 요청¶
Apple Game Center의 업적 전송 요청 기능을 사용하기 위해서는 업적 달성률과 업적 성공 시 상단 배너 노출 여부를 파라미터로 설정하여 reportAchievement() 함수를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive .ProviderApple.reportAchievement
using hive;
//Achievement achieved %. Achievement completed at 100
String achievementPercent = "100";
// Whether to display the top banner when an achievement is successful. default false
Boolean isShow = true;
//Achievement Id
String achievementId = "com.hivesdk.achievement.10hit";
ProviderApple.reportAchievement(achievementPercent, isShow, achievementId, (ResultAPI result) => {
if (result.isSuccess()) {
// call successful
}
});
#include "HiveProviderApple.h"
// 업적 성취 %. 100일 경우 달성 완료
FString Percent = TEXT("100");
// 업적 성공 시 상단 배너 노출 여부. default false
bool bIsShow = true;
// 업적 Id
FString AchievementId = TEXT("com.hivesdk.achievement.10hit");
FHiveProviderApple::ReportAchievement(Percent, bIsShow, AchievementId, FHiveProviderAppleOnReportAchievement::CreateLambda([this](const FHiveResultAPI& Result) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: ProviderApple ::reportAchievement
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
//Achievement achieved %. Achievement completed at 100
string achievementPercent = "100";
// Whether to display the top banner when an achievement is successful. default false
bool isShow = true;
//Achievement Id
string achievementId = "com.hivesdk.achievement.10hit";
ProviderApple::reportAchievement(achievementPercent, isShow, achievementId, [=](ResultAPI const & result) {
if (result.isSuccess()) {
// call successful
}
});
API Reference: ProviderApple.reportAchievement
import HIVEService
//Achievement achieved %. Achievement completed at 100
letachievementPercent = "100"
// Whether to display the top banner when an achievement is successful. default false
let isShow = true
//Achievement Id
let achievementId = "com.hivesdk.achievement.10hit"
ProviderApple.reportAchievement(achievementPercent, showsCompletionBanner: isShow, achievementIdentifier: achievementId) { result in
if result.isSuccess() {
// call successful
}
}
API Reference: HIVEProviderApple reportAchievement
#import <HIVEService/HIVEService-Swift.h>
//Achievement achieved %. Achievement complete when 100
NSString *achievementPercent = @"100";
// Whether to display the top banner when an achievement is successful. default NO
BOOL isShow = YES;
//Achievement Id
NSString *achievementId = @"com.hivesdk.achievement.10hit";
[HIVEProviderApple reportAchievement: achievementPercent showsCompletionBanner: isShow achievementIdentifier: achievementId handler: ^(HIVEResultAPI *result) {
if ([result isSuccess]) {
// call successful
}
}];
Game Center 업적 UI 요청(Helper)¶
Note
- Hive SDK 4.7.0부터 기기에 로그인된 계정과 PlayerID에 연동된 계정을 더 쉽게 비교할 수 있도록 Helper가 제공됩니다. 연동된 계정이 다를 경우에 대한 처리는 기기에 로그인된 IdP 계정 확인을 참고하세요.
Apple Game Center의 업적 UI를 요청하기 위해서는 showAchievements() 함수를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive.AuthV4.Helper.showAchievements
using hive;
AuthV4.Helper.showAchievements ((ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
switch (result.code) {
case ResultAPI.Code.Success:
// Deliver Success with achievement indication
break;
case ResultAPI.Code.AuthV4ConflictPlayer:
// account conflict
break;
case ResultAPI.Code.AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
#include "HiveAuthV4.h"
FHiveAuthV4::Helper::ShowAchievements(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
switch (Result.Code) {
case FHiveResultAPI::ECode::Success:
// 업적 표시와 함께 Success 전달
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// 계정 충돌
break;
default:
// 기타 예외 상황
break;
}
}));
API Reference: AuthV4 ::Helper::showAchievements
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
AuthV4::Helper::showAchievements([=](ResultAPI const & result, shared_ptr playerInfo) {
switch (result.code) {
case ResultAPI::Success:
// Deliver Success with achievement indication
break;
case ResultAPI::AuthV4ConflictPlayer:
// account conflict
break;
case ResultAPI::AuthV4GoogleLogout:
//TODO:
// After logging out of Google Play, log out of the game
// Relaunching the game must be handled by the development studio
break;
default:
// other exception situations
break;
}
});
API Reference: AuthV4Interface .helper().showAchievements
// If the currently logged in Hive account is not connected to GameCenter
// Automatically attempts to connect to GameCenter
import HIVEService
AuthV4Interface.helper().showAchievements() { result, playerInfo in
switch result.getCode() {
case .success:
// Deliver Success with achievement indication
case .authV4ConflitPlayer:
// account conflict
default:
break
}
}
API Reference: [ HIVEAuthV4 helper] showAchievements
// If the currently logged in Hive account is not connected to GameCenter
// Automatically attempts to connect to GameCenter
#import <HIVEService/HIVEService-Swift.h>
[[HIVEAuthV4 helper] showAchievements: ^(HIVEResultAPI <i>result, HIVEPlayerInfo </i>playerInfo) {
switch ([result getCode]) {
case HIVEResultAPICodeSuccess:
// Deliver Success with achievement indication
break;
case HIVEResultAPICodeAuthV4ConflictPlayer:
// account conflict
break;
default:
// other exception situations
break;
}
}];
Game Center 업적 UI 요청¶
Apple Game Center의 업적 UI를 요청하기 위해서는 showAchievements() 함수를 호출하세요.
다음은 예제 코드입니다.
API Reference: ProviderApple.showAchievements
API Reference: ProviderApple::showAchievements
API Reference: ProviderApple.showAchievements
API Reference: HIVEProviderApple showAchievements
Game Center 업적 초기화¶
Apple Game Center의 업적 초기화를 요청하기 위해서는 resetAchievements() 함수를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive.ProviderApple.resetAchievements
API Reference: ProviderApple ::resetAchievements
API Reference: resetAchievements(_:)
API Reference: HIVEProviderApple showAchievements
리더보드 (Leaderboard)¶
하이브 플랫폼을 이용해 Apple Game Center의 리더보드 (Leaderboard) 기능을 사용하기 위해서는 ProviderApple 클래스를 사용하면 됩니다.
Game Center 리더보드 정보 전송¶
Apple Game Center에 리더보드 정보 전송을 위해서는 reportScore() 함수를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive .ProviderApple.reportScore
#include "HiveProviderApple.h"
FString PlayerScore = TEXT("1234");
FString LeaderBoardId = TEXT("com.hivesdk.leaderboard.10hit");
FHiveProviderApple::ReportScore(PlayerScore, LeaderBoardId, FHiveProviderAppleOnReportLeaderboard::CreateLambda([this](const FHiveResultAPI& Result) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: ProviderApple ::reportScore
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
string playerScore = "1234";
string leaderBoardId = "com.hivesdk.leaderboard.10hit";
ProviderApple::reportScore(playerScore, leaderBoardId, [=](ResultAPI const & result) {
if (result.isSuccess()) {
// call successful
}
});
API Reference: HIVEProviderApple ::reportScore:leaderboardIdentifier:handler:
#import <HIVEService/HIVEService-Swift.h>
NSString *playerScore = @"1234";
NSString *leaderBoardId = "com.hivesdk.leaderboard.10hit";
[HIVEProviderApple reportScore: playerScore leaderboardIdentifier: leaderBoardId handler: ^(HIVEResultAPI *result) {
if ([result isSuccess]) {
// call successful
}
}];
Game Center 리더보드 UI 요청(Helper)¶
Apple Game Center에 리더보드 UI 요청을 위해서는 showLeaderboard() 함수를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive .AuthV4.Helper.showLeaderboard
// If the currently logged in Hive account is not connected to GameCenter
// Automatically attempts to connect to GameCenter
using hive;
AuthV4.Helper.showLeaderboard((ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
switch (result.code) {
case ResultAPI.Code.Success:
// Deliver Success with leaderboard display
break;
case ResultAPI.Code.AuthV4ConflictPlayer:
// account conflict
break;
default:
// other exception situations
break;
}
});
#include "HiveAuthV4.h"
FHiveAuthV4::Helper::ShowLeaderboard(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
case FHiveResultAPI::ECode::Success:
// 업적 표시와 함께 Success 전달
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// 계정 충돌
break;
default:
// 기타 예외 상황
break;
}));
API Reference: AuthV4 ::Helper::showLeaderboard
// If the currently logged in Hive account is not connected to GameCenter
// Automatically attempts to connect to GameCenter
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
AuthV4::Helper::showLeaderboard([=](ResultAPI const & result, shared_ptr<PlayerInfo> playerInfo) {
switch (result.code) {
case ResultAPI::Success:
// Deliver Success with leaderboard display
break;
case ResultAPI::AuthV4ConflictPlayer:
// account conflict
break;
default:
break;
}
});
API Reference: showLeaderboard
// If the currently logged in Hive account is not connected to GameCenter
// Automatically attempts to connect to GameCenter
import HIVEService
AuthV4Interface.helper().showLeaderboard() { result, playerInfo in
switch result.getCode() {
case .success:
// Deliver Success with leaderboard display
case .authV4ConflictPlayer:
// account conflict
default:
break
}
}
API Reference: HIVEProviderApple ::showLeaderboard:
// If the currently logged in Hive account is not connected to GameCenter
// Automatically attempts to connect to GameCenter
#import <HIVEService/HIVEService-Swift.h>
[[HIVEAuthV4 helper] showLeaderboard: ^(HIVEResultAPI <i>result, HIVEPlayerInfo </i>playerInfo) {
switch ([result getCode]) {
case HIVEResultAPICodeSuccess:
// Deliver Success with leaderboard display
break;
case HIVEResultAPICodeAuthV4ConflictPlayer:
// account conflict
break;
default:
// other exception situations
break;
}
}];
Game Center 리더보드 UI 요청¶
Apple Game Center에 리더보드 UI 요청을 위해서는 showLeaderboard() 함수를 호출하세요.
다음은 예제 코드입니다.
API Reference: hive .ProviderApple.showLeaderboard
API Reference: ProviderApple ::showLeaderboard
API Reference: showLeaderboard(_:)
API Reference: HIVEProviderApple ::showLeaderboard:
사진첩 포스팅¶
게임에서 기기의 사진첩을 호출하고, 페이스북에 사진을 게시할 수 있습니다. 다음은 예제 코드입니다.
API Reference: SocialV4. sharePhoto
API Reference: SocialV4::sharePhoto
API Reference: SocialV4.sharePhoto
API Reference: SocialV4.INSTANCE. sharePhoto
API Reference: SocialV4Interface.sharePhoto
API Reference: HIVESocialV4 sharePhoto
커뮤니티 로그인을 통한 PC 게임 자동 로그인¶
커뮤니티 웹사이트에서 PC로 플레이 버튼을 클릭하면 크로스플레이 런처를 통해 PC 게임이 실행됩니다.
이 때, PC 게임은 커뮤니티의 '로그인 토큰값'을 이용하여 자동 로그인됩니다.
Warning
커뮤니티 로그인을 통한 PC 게임 자동 로그인 기능은 Hive SDK v4 Windows 24.0.0 이상에서만 동작합니다.
스팀 묵시적 로그인 (Unity Windows)¶
Hive SDK v4 Unity Windows 24.2.0부터 스팀 묵시적 로그인을 지원합니다.
Hive SDK v4 Unity Windows 24.2.0 이상에서 스팀 묵시적 로그인 사용 시 제약 사항은 아래와 같습니다.
AuthV4.Helper.signIn메소드를 반드시 사용해야 하며AuthV4.signIn(AUTO,...)메소드는 사용할 수 없습니다.- 사용자는 게임 설치 후 반드시 최초로 한 번 스팀 묵시적 로그인을 수행해야 합니다.
- 사용자가 게임 앱 삭제 시, SDK 설정 데이터를 저장한
propFolder폴더를 제거하도록 구현해야 합니다.





