請求確認出生日期¶
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 格式)
}
}
})
帶入 Facebook 朋友列表¶
getProviderFriendsList() 方法提供在同一遊戲中用戶 Facebook 朋友的 PlayerID。那些不使用 Facebook 同步的玩家不在好友列表中,而那些之前已同步的玩家返回 -1 作為 PlayerID。
Warning
Facebook 修訂了政策,該政策解釋了 2018 年 5 月對平台 API 的基本訪問權限項目。從此以後,要使用 Facebook /user/friends API,您需要 user_friends 權限。
查看 Facebook 應用程式審核指南
API 參考: 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 參考: 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 參考: 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 參考: 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 參考: AuthV4Interface.getProviderFriendsList
import HIVEService
AuthV4Interface.getProviderFriendsList(.Facebook) { result, retProviderType, providerUserIdList in
if !result.isSuccess() {
return
}
如果 let providerUserIdList = providerUserIdList {
for (key in providerUserIdList.keys) {
// providerUserId: key
// playerId: providerUserIdList[key]
}
}
}
API 參考: 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];
}
}
}];
回應 COPPA¶
《兒童在線隱私保護法》(COPPA)是美國的一項聯邦法律,旨在保護13歲以下兒童的在線隱私。為了響應COPPA,Hive 平台發布了 Hive SDK v4.10.0,包括 getAgeGateU13() API,以查詢用戶是否在13歲以下。如果玩家年齡在13歲以下,該API將返回 true。
範例代碼¶
API 參考: AuthV4.getAgeGateU13
API 參考: AuthV4 ::getAgeGateU13
API 參考: AuthV4.getAgeGateU13
API 參考: AuthV4.INSTANCE.getAgeGateU13
API 參考: AuthV4Interface.getAgeGateU13
API 參考: HIVEAuthV4 getAgeGateU13
有什麼變化¶
如果 ageGateU13() 返回 true,則實現以下內容。
- iOS
- 當呼叫
AuthV4.setup()或Auth.initialize()時,推播通知的協議請求彈出視窗未顯示。 - 推播 API 尚未實作。
- 當呼叫
- Android
- 當顯示退出彈出視窗時,更多遊戲 按鈕未顯示。
- 無法接收遠端推播,且推播 API 尚未實作。
檢查GDPR適用國家中16歲以下用戶的服務條款協議¶
從 Hive SDK v4 24.2.0 開始,您可以使用 Configuration.getAgeGateU16Agree() 方法來確定在受 GDPR(一般數據保護條例)影響的國家中,16 歲以下的用戶是否已同意條款。如果返回的值為 true,則表示 16 歲以下的用戶已同意條款;如果為 false,則表示他們未同意。當使用第三方庫時,如果您需要根據用戶是否在 16 歲以下來限制應用功能,您可以利用 Configuration.getAgeGateU16Agree() 方法。
檢查法定監護人同意¶
從 Hive SDK v4 24.3.0 開始,如果應用程式使用法定監護人同意確認條款,您可以通過調用Configuration.getLegalGuardianConsentAgree()方法來檢索應用使用者是否已獲得法定監護人同意。如果值為true,則表示已給予同意。
重新請求操作系統權限¶
遊戲所需的訪問權限列表在 AndroidManifest.xml 文件中組織。嘗試將一些權限作為相關 API 的字符串列表發送並使用它們。您可以檢查用戶是否選擇了特定權限。如果某些危險權限被拒絕,請確保顯示請求再次訪問操作系統的彈出窗口。其他權限根據用戶設備上的設置自動選擇或取消選擇。如果您輸入錯誤的權限或錯誤的單詞,系統會將其視為未在 AndroidManifest.xml 文件中聲明的權限,並且不允許訪問這些權限。
Android 6.0 (API 等級 23) 支援此功能。如果操作系統是 iOS 或 Android API 等級早於 23,則 ResultAPI 會顯示為不支援。
Note
此功能僅適用於 Android。
範例代碼¶
API 參考: 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
}
if (result.code == ResultAPI.Code.PlatformHelperOSVersionNotSupported) {
//Android OS版本不支持。
}
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) {
// List of permissions accepted among requests
}
if (DeniedRequests.Num() > 0) {
// List of permissions denied among requests
}
}
break;
case FHiveResultAPI::ECode::PlatformHelperOSVersionNotSupported:
// Android OS version not supported.
break;
default:
// Other exceptions
break;
}
}));
API 參考: 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版本不支持。
}
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 參考: 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 參考: 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;
}
});
使用設備管理服務¶
設備管理服務會根據 Hive 控制台上的設置在登錄時自動實現。登錄後,遊戲會調用AuthV4類的showDeviceManagement()方法並向用戶顯示設備管理列表。
當因設備驗證失敗而取消登錄時,具有設備管理服務的遊戲應該處理Result API的AuthV4NotRegisteredDevice代碼,以嘗試再次靜默登錄或執行登出。 有關設備管理服務的更多信息,請參閱操作指南:設備管理服務介紹。
API 參考: AuthV4.showDeviceManagement
null FHiveAuthV4::ShowDeviceManagement(FHiveAuthV4OnShowDeviceManagementDelegate::CreateLambda(this { if (Result.IsSuccess()) { // Closed after exposing the device management UI } })); ```
API 參考: AuthV4 ::showDeviceManagement
API 參考: AuthV4.showDeviceManagement
API 參考: HIVEAuthV4 showDeviceManagement
Google Play 遊戲成就與排行榜¶
要讓您的遊戲在 Google Play 遊戲中被推薦,您需要實現 Google Play 遊戲的成就和排行榜功能。
當用戶使用 Google Play 登入時,將自動登入 Play Games Services (PGS),並可以使用成就和排行榜功能。有關相關功能的詳細資訊,請參閱 Google Play Games Services 指南。
Note
使用 AuthV4Helper 類別時
- 如果用戶在啟動應用程式後,在嘗試隱式登入 Google Play 遊戲時拒絕了登入,應用程式將記住此狀態,不再嘗試隱式登入。即使在維持玩家工作階段期間可以自動登入,應用程式也會繼續記住隱式登入被拒絕的狀態。
- 如果未登入 Google Play 的用戶完成了成就,結果將不會發送到 Google Play 遊戲。
此內容符合 Google Play Games Services 指南。
發送玩家ID¶
如果您需要向 Google Play 游戏请求 PlayerID,请在 ProviderGoogle 类中实现 getGooglePlayerId() 方法。通过实现此方法,它会发送 PlayerID 以及 AuthCode,以验证会话密钥。
null
API 參考: ProviderGoogle::getGooglePlayerId
// 從 Google Play 遊戲請求 playerID。
ProviderGoogle::getGooglePlayerId([=](ResultAPI const &result, std::string const &googlePlayerId, std::string const &authCode) {
if (result.isSuccess())
{
// API 呼叫成功。
}
});
成就¶
實作 ProviderGoogle 類別以透過 Hive SDK 使用 Google Play 遊戲的 Achievement 功能。
請求揭示隱藏成就¶
要向当前登录的玩家揭示隐藏成就,请调用 achievementsReveal() 方法。它不会产生任何效果,但会揭示0%的成就。 以下是示例代码。
API 參考: ProviderGoogle.achievementsReveal
import com.hive.ProviderGoogle
import com.hive.ResultAPI
//成就 ID
val achievementId = "abcdef123456"
ProviderGoogle.achievementsReveal(achievementId, object : ProviderGoogle.GoogleAchievementsListener {
override fun onAchievementsResult(resultAPI: ResultAPI) {
if (resultAPI.isSuccess) {
// 调用成功
}
}
})
解鎖成就的請求¶
要解鎖當前登入玩家的成就,請調用 achievementsUnlock() 方法。此方法將標記 100% 的成就,無論其狀態如何;隱藏或不隱藏。以下是示例代碼。
API 參考: ProviderGoogle.achievementsUnlock
import com.hive.ProviderGoogle
import com.hive.ResultAPI
//成就 ID
val achievementId = "abcdef123456"
ProviderGoogle.achievementsUnlock(achievementId, object : ProviderGoogle.GoogleAchievementsListener {
override fun onAchievementsResult(resultAPI: ResultAPI) {
if (resultAPI.isSuccess) {
// 调用成功
}
}
})
請求增加成就¶
要使用请求功能来增加成就,请将成就值设置为参数,然后调用 achievementsIncrement() 方法。成就值是调用相应 API 时设置的值的总和,当总和达到最大值时,成就会自动完成。
以下是示例代码。
#include "HiveProviderGoogle.h"
//成就 ID
FString AchievementId = TEXT("abcdef123456");
// 成就數字
int32 Value = 1;
FHiveProviderGoogle::AchievementsIncrement(AchievementId, Value, FHiveProviderGoogleOnAchievementsDelegate::CreateLambda([this](const FHiveResultAPI& Result) {
if (Result.IsSuccess()) {
// call successful
}
}));
API 參考: ProviderGoogle.achievementsIncrement
import com.hive.ProviderGoogle
import com.hive.ResultAPI
//成就 ID
val achievementId = "abcdef123456"
// 成就數字
val value = 1
ProviderGoogle.achievementsIncrement(achievementId, value, object : ProviderGoogle.GoogleAchievementsListener {
override fun onAchievementsResult(resultAPI: ResultAPI) {
if (resultAPI.isSuccess) {
// 呼叫成功
}
}
})
請求顯示成就列表 (助手)¶
Note
SDK 4.7.0 提供了 Helper,它可以輕鬆比較用戶設備上的已登入帳戶和 PlayerID 同步的帳戶。如果兩個帳戶不相同,請參考 IdP Sync 頁面來處理此情況。
呼叫 showAchievements() 方法以請求 Google Play 遊戲的成就列表。
以下是示例代码。
API 参考: 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:
// 帳戶衝突
break;
case ResultAPI.Code.AuthV4GoogleLogout:
//TODO:
// 登出 Google Play 後,登出遊戲
// 重新啟動遊戲必須由開發工作室處理
break;
default:
// 其他異常情況
break;
}
});
#include "HiveAuthV4.h"
FHiveAuthV4::Helper::ShowAchievements(FHiveAuthV4HelperDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TOptional<FHivePlayerInfo>& PlayerInfo) {
switch (Result.Code) {
case FHiveResultAPI::ECode::Success:
// 交付成功并显示成就指示
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// 帐户冲突
break;
case FHiveResultAPI::ECode::AuthV4GoogleLogout:
// TODO:
// 从Google Play注销后,注销游戏
// 重新启动游戏必须由开发工作室处理
break;
default:
// 其他异常情况
break;
}
}));
API 參考: 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 參考: 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 -> {
// 帳戶衝突
}
ResultAPI.Code.AuthV4GoogleLogout -> {
//TODO:
// 登出 Google Play 後,登出遊戲
// 重新啟動遊戲必須由開發工作室處理
}
else -> {
// 其他異常情況
}
}
}
})
API 參考: 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:
// 帳戶衝突
break;
case AuthV4GoogleLogout:
//TODO:
// 登出 Google Play 後,登出遊戲
// 重新啟動遊戲必須由開發工作室處理
break;
default:
// 其他異常情況
break;
}
});
Warning
如果用戶從 Play 遊戲服務的設置畫面登出,玩家帳戶將被登出,並且錯誤代碼 ResultAPI.Code.AuthV4GoogleLogout 將作為回調發送。當登出完成後,將顯示登出彈出窗口,並將顯示更改為遊戲標題。
請求顯示成就列表 (Auth v4)¶
呼叫 showAchievements() 方法以請求 Google Play 遊戲的成就列表。
以下是示範代碼。
API 參考: 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:
// 顯示成就並傳遞成功
break;
case FHiveResultAPI::ECode::AuthV4GoogleLogout:
// TODO:
// 在Google Play登出後執行遊戲登出
// 遊戲重新啟動需由開發工作室處理
break;
default:
// 其他例外情況
break;
}));
API 參考: 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 參考: 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 參考: 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 的錯誤代碼。一旦發送此錯誤,請確保按照點擊遊戲中的登出按鈕時的流程進行編碼。
排行榜¶
實現 ProviderGoogle 類別,以通過 Hive SDK 使用 Google Play 遊戲的 Leaderboard 功能。
排行榜分數更新¶
呼叫 leaderboardsSubmitScore() 方法以請求 Google Play 遊戲的排行榜分數更新。
以下是示例代碼。
#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 call successful
}
}));
API 參考: ProviderGoogle::leaderboardsSubmitScore
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
// Leaderboard ID
string leaderboardId = "12345abcde";
// 排行榜分數
long score = 100;
ProviderGoogle::leaderboardsSubmitScore(leaderboardId, score, [=](ResultAPI const & result) {
if (result.isSuccess()) {
// API call successful
}
});
API 參考: ProviderGoogle.leaderboardsSubmitScore
import com.hive.ProviderGoogle
import com.hive.ResultAPI
// 排行榜 ID
val leaderboardId = "12345abcde"
// 排行榜分數
val score = 100L
ProviderGoogle.leaderboardsSubmitScore(leaderboardId, score, object : ProviderGoogle.GoogleLeaderboardsListener {
override fun onLeaderboardsResult(resultAPI: ResultAPI) {
if (resultAPI.isSuccess) {
// API 呼叫成功
}
}
})
請求顯示排行榜列表(助手)¶
呼叫 showLeaderboards() 方法以請求 Google Play 遊戲的排行榜列表。
以下是範例代碼。
API 參考: 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:
// Deliver Success with leaderboard display
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// 帳戶衝突
break;
case FHiveResultAPI::ECode::AuthV4GoogleLogout:
// TODO:
// 登出 Google Play 後,登出遊戲
// 重新啟動遊戲必須由開發工作室處理
break;
default:
// 其他例外情況
break;
}));
API 參考: 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 參考: 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 -> {
// 交付成功並顯示排行榜
}
ResultAPI.Code.AuthV4ConflictPlayer -> {
// 帳戶衝突
}
ResultAPI.Code.AuthV4GoogleLogout -> {
//TODO:
// 登出 Google Play 後,登出遊戲
// 重新啟動遊戲必須由開發工作室處理
}
else -> {
// 其他異常情況
}
}
}
})
API 參考: 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 的错误代码。注销完成后,将弹出注销窗口,显示更改为游戏标题。
請求顯示排行榜列表 (Auth v4)¶
呼叫 showLeaderboards() 方法以請求 Google Play 遊戲的排行榜列表。
以下是示例代码。
API 參考: 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:
// Deliver Success with leaderboard display
break;
case FHiveResultAPI::ECode::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 參考: 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 參考: 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 參考: 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
如果用戶從遊戲服務的設置屏幕登出,將作為回調發送名為 ResultAPI.Code.AuthV4GoogleLogout 的錯誤代碼。一旦發送此錯誤,請確保按照點擊遊戲中的登出按鈕時的流程進行編碼。
Google Play 遊戲 遊戲統計{ #google-play-game-stats }¶
如果您的開發目的是為了參與 Google Level Up 計劃,則必須套用 Google Play Games 的遊戲統計功能。
Google Play 遊戲的遊戲統計資料是一項功能,可收集使用者的遊戲歷史記錄作為事件,並將其顯示為玩家個人資料的統計資料。您的應用程式定義自己的統計數據,並在 Google Play Console 中設定計數方法,例如運行總計或最高值。
要使用 Hive 平台的遊戲統計功能,您可以使用AuthV4.Helper類別。相關功能的詳細說明,請參閱 Google Play Games 遊戲統計。
從 Hive SDK 26.7.0 開始支援遊戲統計。僅限Android,不支援iOS。要使用遊戲統計數據,需要 Android minSdk 24 或更高版本。
Caution
遊戲統計數據是根據 [Play 遊戲服務] (#google-play-games) 驗證,並且與您的 Hive 帳戶是否連結無關。如果使用者未登入Google Play或拒絕隱含登入,即使API回傳成功,也不會收集任何統計資料。
準備工作{ #game-stats-prepare }¶
要使用遊戲統計數據,您需要在 Google Play 管理中心建立事件並設定統計數據。建立事件聲明應用程式將發送哪些遊戲記錄,設定統計資料定義收集的記錄將在玩家個人資料中顯示哪些統計資料。
建立事件¶
要為新的、未發布的遊戲建立事件,您需要為PlayerGameEvent.csv事件建立 CSV 檔案。
有關更詳細的說明,請參閱事件的 CSV 檔案指南。
PlayerGameEvent.csv中宣告應用程式要傳送的事件名稱和屬性。屬性類型有 STRING、INT64、DOUBLE、BOOL 四種。
progressUpdate是 Google Play Games 預先定義的進度專用保留事件,僅使用 currentProgress 作為屬性。
檔案配置範例請參考下方事件和屬性宣告。
統計設置¶
要設定統計資訊,必須上傳包含 RepetitiveStatsConfig.csv 和 ProgressionStatConfig.csv 的統計資訊 ZIP 檔案。StatLocalizations.csv 檔案是選用檔案,用於將顯示在使用者畫面上的統計名稱和說明翻譯(本地化)為多種語言。
RepetitiveStatsConfig.csv 檔案中定義用於彙總使用者重複執行行為的重複統計項目。重複統計支援 SUM、MAX、MIN、COUNT 彙總方式,並可套用以特定屬性值為條件的篩選器。
檔案配置範例請參考下方重複統計定義。
ProgressionStatConfig.csv中定義顯示使用者在應用程式中進度的進度統計。可以使用請求 Google Play 遊戲記錄遊戲進度來記錄進度統計。
檔案配置範例請參考下方進度統計定義。
將編寫好的 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 三個欄組成,僅將符合該條件的事件納入彙總對象。不套用篩選器時,請將三個欄全部留空。
- 同一事件分支範例:即使
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 檔案的頂層路徑,不支援子目錄。統計指標可在兩個 CSV 檔案合計最多定義 50 個。
Warning
不要將 PlayerGameEvent.csv 包含在 ZIP 中。事件需要先在 Google Play Console 的事件設定中以 CSV 檔案註冊,統計則在統計設定中以 ZIP 檔案註冊。
已發布的遊戲統計無法刪除,因此請在發布前確定統計配置。
遊戲統計記錄{ #game-stats-record }¶
要傳送的事件是使用遊戲統計事件類別建立的。類別名稱依引擎的不同而不同; Unity、C++ 和 Android 使用AuthV4.GameStatsEvent,虛幻引擎使用FHiveGameStatsEvent。將 Google Play Console 中宣告的事件名稱輸入到建構函式中,並使用適合屬性類型的addProperty()方法填入屬性。有關如何宣告屬性名稱和類型的詳細說明,請參閱事件的 CSV 檔案指南。
本節中描述的三種方法只是將事件寫入裝置的緩衝區。當您按照請求從 Google Play 遊戲上傳遊戲統計事件 中所述調用gameStatsRequestEventsUpload()時,實際傳輸就會發生。
Caution
屬性的名稱和類型必須與 Google Play Console 中聲明的值相符。如果存在不匹配,該事件將不會反映在統計中。
要求記錄來自 Google Play 遊戲的遊戲統計事件¶
若要記錄單一遊戲統計事件,請呼叫gameStatsRecordEvent()方法。
下面是範例程式碼。按原樣使用預先準備中聲明的run_finished事件。事件名稱和屬性名稱使用CSV中聲明的值,屬性值是應用程式以播放結果填充的值。
API Reference: hive.AuthV4.Helper.gameStatsRecordEvent
```cs 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
}
});
```
```c++
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
```cpp
include ¶
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
```kt 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
```java 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
}
});
```c++
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
FHiveAuthV4::Helper::GameStatsRecordEvents(GameStatsEvents, FHiveAuthV4HelperDelegate::CreateLambda(this { 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 遊戲的遊戲進度{ #game-stats-progress }¶
若要記錄使用者的進度,請呼叫gameStatsRecordProgress()方法。傳送至此方法的值將傳送至計劃事件progressUpdate並反映在ProgressionStatConfig.csv中定義的進度統計中。
進度是當前值,而不是累積值。即使您發送一個值三次,它也不會累加,並且會顯示最後發送的值。我們建議您始終在應用程式啟動時發送當前進度。
Caution
您可以在 Google Play 管理中心中將currentProgress宣告為INT64或STRING。如果發送的類型與聲明的類型不同,則該事件將被丟棄並且不會反映在統計資料中,因此請使用gameStatsRecordProgress(),它僅在聲明為字串時接收字串值。字串值用於記錄難以用數字表達的進度級別,例如rank tier。確定字串順序的標準不是公開的,因此請盡可能使用數字。
下面是範例程式碼。
API Reference: hive.AuthV4.Helper.gameStatsRecordProgress
```cs using hive;
// 玩家當下進度 long currentProgress = 5L;
AuthV4.Helper.gameStatsRecordProgress(currentProgress, (ResultAPI result, AuthV4.PlayerInfo playerInfo) => {
if (result.isSuccess()) {
// call successful
}
});
```
```c++
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
```cpp
include ¶
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
```kt 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
```java import com.hive.AuthV4; import com.hive.ResultAPI;
// 玩家當下進度 long currentProgress = 5L;
AuthV4.Helper.INSTANCE.gameStatsRecordProgress(currentProgress, (result, playerInfo) -> {
if (result.isSuccess()) {
// call successful
}
});
```
請求從 Google Play Games{ #game-stats-upload }上傳遊戲統計事件¶
若要要求上傳儲存在裝置緩衝區中的遊戲統計事件,請呼叫gameStatsRequestEventsUpload()方法。
Caution
gameStatsRecordEvent()、gameStatsRecordEvents()和gameStatsRecordProgress()僅將事件寫入裝置的緩衝區,而不會傳送它們。 您需要呼叫gameStatsRequestEventsUpload()才能將其實際傳送到 Google 伺服器。這是未收集統計資料時首先要檢查的事情。
下面是範例程式碼。
API Reference: hive.AuthV4.Helper.gameStatsRequestEventsUpload
// API呼叫成功 } })); ```
API Reference: AuthV4::Helper::gameStatsRequestEventsUpload
API Reference: AuthV4.Helper.gameStatsRequestEventsUpload
API Reference: AuthV4.Helper.INSTANCE.gameStatsRequestEventsUpload
成功上傳活動後,請在 Google Play 商店應用程式中的我的頁面的標籤中開啟您的玩家個人資料,檢查您的遊戲統計資料。
上傳後需要一段時間才能顯示,因此無法立即確認屬於正常現象。如果未顯示統計訊息,請按以下順序檢查。
-
確保您已撥打
gameStatsRequestEventsUpload()。 -
檢查您的 Google Play 登入狀態。
-
檢查CSV 中聲明的事件名稱、屬性名稱和類型是否與程式碼中寫入的值相符。
-
透過終端設定查看設備上的日誌資訊。如果出現「GameStats event 提交成功」等提示,則表示傳輸成功。
蘋果遊戲中心遊戲成就和排行榜¶
要讓您的遊戲在 Apple Game Center 上被推薦,您需要申請 Apple Game Center 的成就和排行榜功能。
無論用戶的身份驗證狀態如何,Apple Game Center 的兩個功能是由 Hive SDK 提供的。也就是說,成就和排行榜使用 Apple Game Center 帳戶,但成就和排行榜使用 Apple Game Center 帳戶,但該帳戶可能未與 Hive 帳戶鏈接或與玩家當前登錄的 Hive 帳戶不同。
有關 Apple 遊戲中心功能的更多資訊,請參閱 Apple 遊戲中心指南。
Note
iOS Enterprise 不支持 Apple Game Center。
成就¶
實現 ProviderApple 類別,以通過 Hive SDK 使用 Apple Game Center 的成就功能。
請求成就列表¶
要加载成就列表,请调用loadAchievements()方法。
以下是示例代码。
API 參考: hive.ProviderApple.loadAchievements
// Request achievement list to Provider Apple
// using hive
// 回调处理程序管理对 Apple 提供者的成就列表请求
public void onLoadAchievements(ResultAPI result, List achievementList) {
Logger.log("ProviderTestView.onLoadAchievements() 回调\nresult = " + result.toString() + "\n");
if (result.isSuccess() != true)
return;
}
// 請求成就列表給供應商 Apple
ProviderApple.loadAchievements(onLoadAchievements);
API 參考: 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;
});
請求報告成就¶
要報告成就,請調用 reportAchievement() 方法,並將參數設置為 成就率 和 成功成就的通知橫幅曝光。
以下是範例代碼。
API 參考: hive .ProviderApple.reportAchievement
using hive;
//成就達成 %. 成就完成於 100
String achievementPercent = "100";
// 成就成功時是否顯示頂部橫幅。默認為 false
Boolean isShow = true;
//成就 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");
// 成就成功時是否顯示頂部橫幅。默認為 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 call successful
}
}));
API 參考: ProviderApple ::reportAchievement
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
//成就達成 %. 成就完成於 100
string achievementPercent = "100";
// 成就成功時是否顯示頂部橫幅。 默認為 false
bool isShow = true;
//成就 ID
string achievementId = "com.hivesdk.achievement.10hit";
ProviderApple::reportAchievement(achievementPercent, isShow, achievementId, [=](ResultAPI const & result) {
if (result.isSuccess()) {
// call successful
}
});
API 參考: ProviderApple.reportAchievement
import HIVEService
//成就達成 %. 成就完成於 100
let achievementPercent = "100"
// 成就成功時是否顯示頂部橫幅。 默認為 false
let isShow = true
//成就 ID
let achievementId = "com.hivesdk.achievement.10hit"
ProviderApple.reportAchievement(achievementPercent, showsCompletionBanner: isShow, achievementIdentifier: achievementId) { result in
if result.isSuccess() {
// call successful
}
}
API 參考: HIVEProviderApple reportAchievement
#import <HIVEService/HIVEService-Swift.h>
//成就達成 %. 當達到 100 時完成成就
NSString *achievementPercent = @"100";
// 成就成功時是否顯示頂部橫幅。 默認為 NO
BOOL isShow = YES;
// 成就 ID
NSString *achievementId = @"com.hivesdk.achievement.10hit";
[HIVEProviderApple reportAchievement: achievementPercent showsCompletionBanner: isShow achievementIdentifier: achievementId handler: ^(HIVEResultAPI *result) {
if ([result isSuccess]) {
// call successful
}
}];
請求顯示成就 UI (助手)¶
Note
SDK 4.7.0 提供了 Helper,可以輕鬆比較用戶設備上的已登入帳戶和 PlayerID 同步的帳戶。如果兩個帳戶不相同,請參考 IdP Sync 頁面來處理此情況。
要顯示成就 UI,請調用 showAchievements() 方法。
以下是示例代码。
API 參考: 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:
// Deliver Success with achievement indication
break;
case FHiveResultAPI::ECode::AuthV4ConflictPlayer:
// account conflict
break;
default:
// other exception situations
break;
}
}));
API 參考: 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 參考: [ HIVEAuthV4 helper] showAchievements
// 如果當前登錄的 Hive 帳戶未連接到 GameCenter
// 自動嘗試連接到 GameCenter
#import <HIVEService/HIVEService-Swift.h>
[[HIVEAuthV4 helper] showAchievements: ^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
switch ([result getCode]) {
case HIVEResultAPICodeSuccess:
// Deliver Success with achievement indication
break;
case HIVEResultAPICodeAuthV4ConflictPlayer:
// account conflict
break;
default:
// other exception situations
break;
}
}];
請求顯示成就 UI¶
要顯示成就 UI,請調用 showAchievements() 方法。
以下是範例程式碼。
API 參考: ProviderApple.showAchievements
API 參考: ProviderApple::showAchievements
API 參考: ProviderApple.showAchievements
重置成就的請求¶
要重置成就,请实现 resetAchievements() 方法。
以下是示例代码。
排行榜¶
實現 ProviderApple 類別,以通過 Hive SDK 使用 Leaderboard 功能的 Apple Game Center。
請求報告排行榜分數¶
要將排行榜分數報告給 Apple Game Center,請調用 reportScore() 方法。
以下是示範代碼。
API 參考: 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 call successful
}
}));
API 參考: 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 參考: 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
}
}];
請求顯示排行榜 UI (助手)¶
要顯示排行榜 UI,請調用 showLeaderboard() 方法。
以下是範例代碼。
API 參考: hive .AuthV4.Helper.showLeaderboard
// 如果當前登錄的 Hive 帳戶未連接到 GameCenter
// 自動嘗試連接到 GameCenter
使用 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;
}
});
API 參考: AuthV4 ::Helper::showLeaderboard
// 如果當前登錄的 Hive 帳戶未連接到 GameCenter
// 自動嘗試連接到 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 參考: showLeaderboard
API 參考: HIVEProviderApple ::showLeaderboard:
// 如果當前登錄的 Hive 帳戶未連接到 GameCenter
// 自動嘗試連接到 GameCenter
#import <HIVEService/HIVEService-Swift.h>
[[HIVEAuthV4 helper] showLeaderboard: ^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
switch ([result getCode]) {
case HIVEResultAPICodeSuccess:
// Deliver Success with leaderboard display
break;
case HIVEResultAPICodeAuthV4ConflictPlayer:
// account conflict
break;
default:
// other exception situations
break;
}
}];
請求顯示排行榜界面¶
要顯示排行榜 UI,請調用 showLeaderboard() 方法。
以下是示例代码。
在社交媒體上分享照片¶
用戶可以通過遊戲從設備的相冊導入照片,在 Facebook 上分享和發佈照片。以下是示例代碼:
API 參考: SocialV4. sharePhoto
API 參考: SocialV4::sharePhoto
API 參考: SocialV4.sharePhoto
API 參考: SocialV4.INSTANCE. sharePhoto
API 參考: SocialV4Interface.sharePhoto
API 參考: HIVESocialV4 sharePhoto
使用社群登入自動登入PC遊戲¶
當您在社區網站上點擊「在 PC 上播放」按鈕時,PC 遊戲將通過 Crossplay Launcher 啟動。
此時,PC遊戲使用社區的「登錄令牌值」自動登錄。
Warning
自動登入到電腦遊戲的社群登入 功能僅在 Hive SDK v4 24.0.0 及以上的 Windows 版本上運作。
Steam 隱式登入 (Unity Windows)¶
Hive SDK v4 Unity Windows 24.2.0 支援 Steam 隱式登入。
使用 SDK v4 Unity Windows 24.2.0 或更高版本的 Steam 隱式登錄時,請注意以下限制:
- 您必須使用
AuthV4.Helper.signIn方法;不能使用AuthV4.signIn(AUTO,...)方法。 - 安裝遊戲應用程式後,使用者必須至少執行一次 Steam 隱式登錄。
- 當使用者卸載應用程式時,您必須實現刪除存儲 SDK 配置數據的
propFolder文件夾。





