配置游戏中心
Google Play Games
Google Play Console 配置
Apple Game Center
XCode 配置
查阅 XCode配置GameKit 中的以下两个章节
排行榜
提交分数
根据排行榜设置的榜单数值类型,填写的数值也有不同的规则:
- 整数:设置为整数,输入 1000,最终显示也为 1000
- 小数:设置为2位小数,12.55 则需要输入 1255
- 时间:单位:毫秒,12000 表示 12 秒
- 货币:对实际货币值 x 1000000,实际 $12.25,则需要传入 12250000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private fun submitScore( leaderboardId: String, score: Long, extra: String? = null ) { Athana.getInstance().gamingService.submitScore( leaderboardId = leaderboardId, score = score, extra = extra, listener = object : GamingRequestListener<Boolean> { override fun onResponse(result: Boolean) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| private void submitScore( String leaderboardId, long score, @Nullable String extra ) { Athana.getInstance().getGamingService().submitScore( leaderboardId, score, extra, new GamingRequestListener<Boolean>() { @Override public void onResponse(Boolean result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
查询分数
获取当前玩家在指定排行榜中的得分。
LeaderboardPlayerScope 枚举值:
ALL - 所有玩家
FRIENDS - 好友排行榜(需要先获取好友列表权限)
LeaderboardTimeSpan 枚举值:
TODAY - 日榜
WEEK - 周榜
ALL_TIME - 总榜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private fun getScore( leaderboardId: String, scope: LeaderboardPlayerScope, timeScope: LeaderboardTimeSpan ) { Athana.getInstance().gamingService.getScore( leaderboardId = leaderboardId, scope = scope, timeScope = timeScope, listener = object : GamingRequestListener<ScoreData?> { override fun onResponse(result: ScoreData?) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| private void getScore( String leaderboardId, LeaderboardPlayerScope scope, LeaderboardTimeSpan timeScope ) { Athana.getInstance().getGamingService().getScore( leaderboardId, scope, timeScope, new GamingRequestListener<ScoreData>() { @Override public void onResponse(@Nullable ScoreData result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
跳转至排行榜界面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| private fun openLeaderboardUI( leaderboardId: String, scope: LeaderboardPlayerScope?, timeScope: LeaderboardTimeSpan? ) { Athana.getInstance().gamingService.openLeaderboardUI( leaderboardId = leaderboardId, scope = scope, timeScope = timeScope, listener = object : GamingRequestListener<Boolean> { override fun onResponse(result: Boolean) { }
override fun onError(error: Throwable?) { } } ) }
private fun openLeaderboardUI() { Athana.getInstance().gamingService.openLeaderboardUI( listener = object : GamingRequestListener<Boolean> { override fun onResponse(result: Boolean) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| private void openLeaderboardUI( String leaderboardId, @Nullable LeaderboardPlayerScope scope, @Nullable LeaderboardTimeSpan timeScope ) { Athana.getInstance().getGamingService().openLeaderboardUI( leaderboardId, scope, timeScope, new GamingRequestListener<Boolean>() { @Override public void onResponse(Boolean result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
private void openLeaderboardUI() { Athana.getInstance().getGamingService().openLeaderboardUI( null, null, null, new GamingRequestListener<Boolean>() { @Override public void onResponse(Boolean result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
获取排行榜信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| private fun getAllLeaderboardInfo() { Athana.getInstance().gamingService.getLeaderboardInfo( leaderboardId = null, forceReload = false, listener = object : GamingRequestListener<List<LeaderboardInfo>> { override fun onResponse(result: List<LeaderboardInfo>) { }
override fun onError(error: Throwable?) { } } ) }
private fun getLeaderboardInfo(leaderboardId: String) { Athana.getInstance().gamingService.getLeaderboardInfo( leaderboardId = leaderboardId, forceReload = false, listener = object : GamingRequestListener<List<LeaderboardInfo>> { override fun onResponse(result: List<LeaderboardInfo>) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| private void getAllLeaderboardInfo() { Athana.getInstance().getGamingService().getLeaderboardInfo( null, false, new GamingRequestListener<List<LeaderboardInfo>>() { @Override public void onResponse(List<LeaderboardInfo> result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
private void getLeaderboardInfo(String leaderboardId) { Athana.getInstance().getGamingService().getLeaderboardInfo( leaderboardId, false, new GamingRequestListener<List<LeaderboardInfo>>() { @Override public void onResponse(List<LeaderboardInfo> result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
LeaderboardInfo 参数说明:
| 参数名 |
类型 |
说明 |
| leaderboardId |
String |
排行榜 ID |
| name |
String |
排行榜名称 |
| imageUrl |
String? |
排行榜图标 URL |
获取排行榜分数数据
分页加载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| private fun loadLeaderboardData( leaderboardId: String, scope: LeaderboardPlayerScope, timeScope: LeaderboardTimeSpan, pageSize: Int, userCenter: Boolean = false ) { Athana.getInstance().gamingService.loadLeaderboardData( leaderboardId = leaderboardId, scope = scope, timeScope = timeScope, pageSize = pageSize, userCenter = userCenter, listener = object : GamingRequestListener<ScoreList> { override fun onResponse(result: ScoreList) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| private void loadLeaderboardData( String leaderboardId, LeaderboardPlayerScope scope, LeaderboardTimeSpan timeScope, int pageSize, boolean userCenter ) { Athana.getInstance().getGamingService().loadLeaderboardData( leaderboardId, scope, timeScope, pageSize, userCenter, new GamingRequestListener<ScoreList>() { @Override public void onResponse(ScoreList result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
ScoreData 参数说明:
| 参数名 |
类型 |
说明 |
| rank |
Long |
名次 |
| score |
Long |
原始数值 |
| displayScore |
String |
格式化的分数 |
| player |
PlayerProfile |
玩家信息 |
| extraInfo |
ScoreExtraInfo |
额外信息 |
加载更多
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private fun loadMoreLeaderboardData( leaderboardId: String, pageSize: Int, pageDirection: PageDirection ) { Athana.getInstance().gamingService.loadMoreLeaderboardData( leaderboardId = leaderboardId, pageSize = pageSize, pageDirection = pageDirection, listener = object : GamingRequestListener<ScoreList> { override fun onResponse(result: ScoreList) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| private void loadMoreLeaderboardData( String leaderboardId, int pageSize, PageDirection pageDirection ) { Athana.getInstance().getGamingService().loadMoreLeaderboardData( leaderboardId, pageSize, pageDirection, new GamingRequestListener<ScoreList>() { @Override public void onResponse(ScoreList result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
释放引用
在不需要使用排行榜数据时调用,释放资源。
1 2 3 4
| private fun releaseLeaderboardData() { Athana.getInstance().gamingService.leaderboardDataRelease() }
|
1 2 3 4
| private void releaseLeaderboardData() { Athana.getInstance().getGamingService().leaderboardDataRelease(); }
|
成就
解锁成就
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| private fun unlockAchievement(achievementId: String) { Athana.getInstance().gamingService.unlockAchievement( achievementId = achievementId, listener = object : GamingRequestListener<Boolean> { override fun onResponse(result: Boolean) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private void unlockAchievement(String achievementId) { Athana.getInstance().getGamingService().unlockAchievement( achievementId, new GamingRequestListener<Boolean>() { @Override public void onResponse(Boolean result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
更新分步成就
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| private fun updateAchievementProgress( achievementId: String, progress: Int ) { Athana.getInstance().gamingService.updateAchievementProgress( achievementId = achievementId, progress = progress, listener = object : GamingRequestListener<Boolean> { override fun onResponse(result: Boolean) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private void updateAchievementProgress( String achievementId, int progress ) { Athana.getInstance().getGamingService().updateAchievementProgress( achievementId, progress, new GamingRequestListener<Boolean>() { @Override public void onResponse(Boolean result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
跳转至成就界面
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private fun openAchievementUI() { Athana.getInstance().gamingService.openAchievementUI( listener = object : GamingRequestListener<Boolean> { override fun onResponse(result: Boolean) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| private void openAchievementUI() { Athana.getInstance().getGamingService().openAchievementUI( new GamingRequestListener<Boolean>() { @Override public void onResponse(Boolean result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
获取成就信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| private fun getAchievementData(forceReload: Boolean = false) { Athana.getInstance().gamingService.getAchievementData( forceReload = forceReload, listener = object : GamingRequestListener<List<Achievement>> { override fun onResponse(result: List<Achievement>) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private void getAchievementData(boolean forceReload) { Athana.getInstance().getGamingService().getAchievementData( forceReload, new GamingRequestListener<List<Achievement>>() { @Override public void onResponse(List<Achievement> result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
Achievement 参数说明:
| 参数名 |
类型 |
说明 |
| achievementId |
String |
成就 ID |
| title |
String |
成就名称 |
| description |
String |
成就描述 |
| state |
AchievementState |
成就状态:HIDDEN - 隐藏,REVEALED - 已揭示,UNLOCKED - 已解锁 |
| type |
AchievementType |
成就类型:STANDARD - 标准,INCREMENTAL - 增量 |
| progress |
Double |
当前进度(增量成就) |
| extraInfo |
AchievementExtraInfo? |
额外信息 |
好友
请求访问好友列表权限
在获取好友列表或查询好友排行榜之前,需要先申请好友列表访问权限。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private fun requestFriendListPermission() { Athana.getInstance().gamingService.requestFriendListPermission( listener = object : GamingRequestListener<Boolean> { override fun onResponse(result: Boolean) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| private void requestFriendListPermission() { Athana.getInstance().getGamingService().requestFriendListPermission( new GamingRequestListener<Boolean>() { @Override public void onResponse(Boolean result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
获取好友列表
加载好友列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private fun loadFriends( pageSize: Int, forceReload: Boolean = false ) { Athana.getInstance().gamingService.loadFriends( pageSize = pageSize, forceReload = forceReload, listener = object : GamingRequestListener<FriendList> { override fun onResponse(result: FriendList) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| private void loadFriends( int pageSize, boolean forceReload ) { Athana.getInstance().getGamingService().loadFriends( pageSize, forceReload, new GamingRequestListener<FriendList>() { @Override public void onResponse(FriendList result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
加载更多好友列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| private fun loadMoreFriends(pageSize: Int) { Athana.getInstance().gamingService.loadMoreFriends( pageSize = pageSize, listener = object : GamingRequestListener<FriendList> { override fun onResponse(result: FriendList) { }
override fun onError(error: Throwable?) { } } ) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private void loadMoreFriends(int pageSize) { Athana.getInstance().getGamingService().loadMoreFriends( pageSize, new GamingRequestListener<FriendList>() { @Override public void onResponse(FriendList result) { }
@Override public void onError(@Nullable Throwable error) { } } ); }
|
FriendList 参数说明:
| 参数名 |
类型 |
说明 |
| friends |
List |
好友列表 |
| hasMore |
Boolean |
是否还有更多数据 |
跳转至玩家资料界面
1 2 3 4
| private fun openPlayerProfileUI(playerId: String) { Athana.getInstance().gamingService.openPlayerProfileUI(playerId) }
|
1 2 3 4
| private void openPlayerProfileUI(String playerId) { Athana.getInstance().getGamingService().openPlayerProfileUI(playerId); }
|
PlayerProfile 参数说明:
| 参数名 |
类型 |
说明 |
| playerId |
String |
玩家 ID,如果返回空字符,表示该玩家不允许访问其信息 |
| playerName |
String |
玩家昵称 |
| avatarUrl |
String? |
玩家头像 URL |