成就系统开发指南
本文介绍如何在游戏中加入成就系统。
集成前准备
- 参考 开发者中心配置 创建应用、配置包名与签名证书
- 参考 成就系统功能介绍开通成就系统服务
- 参考集成指南(Unity、Android、iOS)完成对应平台或引擎的基础接入
- 成就模块依赖于 TapTap 登录模块,开发者接入前应先完成 TapTap 登录的接入
权限说明
- Android
该模块需要如下权限:
| 权限 | 使用目的 | 权限申请时机 |
|---|---|---|
| 网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
| 网络状态权限 | 用于检查网络连接状态(如 Wi-Fi 或移动数据是否可用) | 用户首次使用该功能时会申请权限 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
SDK 获取
- Unity
- Android
- iOS
远程依赖
NPMJS 方式:在 Packages/manifest.json 中添加:
"dependencies":{
"com.taptap.sdk.core":"4.9.3",
"com.taptap.sdk.login":"4.9.3",
"com.taptap.sdk.achievement":"4.9.3"
}
GitHub 方式:在 Packages/manifest.json 中添加:
"dependencies":{
"com.taptap.sdk.core":"https://github.com/taptap/tapsdk-unity-dist.git?path=/Core#4.9.3",
"com.taptap.sdk.login":"https://github.com/taptap/tapsdk-unity-dist.git?path=/Login#4.9.3",
"com.taptap.sdk.achievement":"https://github.com/taptap/tapsdk-unity-dist.git?path=/Achievement#4.9.3"
}
本地文件导入
在 下载页 下载并导入以下 unitypackage 文件:
TapSDK_Core.unitypackage(TapTapSDK 核心模块,必选)TapSDK_Login.unitypackage(TapTapSDK 登录模块,必选)TapSDK_Achievement.unitypackage(TapTapSDK 成就模块,必选)
在 app module 的 build.gradle 中添加对应依赖:
dependencies {
implementation 'com.taptap.sdk:tap-core:4.9.3'
implementation 'com.taptap.sdk:tap-login:4.9.3'
implementation 'com.taptap.sdk:tap-achievement:4.9.3'
}
远程依赖
- 在工程 Podfile 文件中对应模块下添加依赖:
pod 'TapTapSDK/Achievement', '~> 4.9.3'
- 执行
Pod install下载对应依赖文件
本地文件依赖
成就系统依赖于初始化和 TapTap 登录模块,使用本地文件方式添加依赖时,需先参考集成指南 和 TapTap 登录添加对应本地文件依赖项。
- 在下载页下载如下文件:
TapTapAchievementSDK成就依赖库TapTapAchievementResource.bundle成就资源文件
- 在工程中添加
framework静态库,注意添加时选择 Embed 方式为 Do Not Embed,导入bundle资源文件
初始化额外配置
在调用业务接口前,开发者需先调用初始化接口完成应用信息的配置,示例如下:
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.Core;
using TapSDK.Achievement;
// 核心配置 详细参数见 [TapTapSDK]
TapTapSdkOptions coreOptions = new new TapTapSdkOptions
{
// 客户端 ID,开发者后台获取
clientId = clientId,
// 客户端令牌,开发者后台获取
clientToken = clientToken
};
// 成就配置
TapTapAchievementOptions achievementOptions = new TapTapAchievementOptions
{
// 成就达成时 SDK 是否需要展示一个气泡弹窗提示
enableToast = true
};
// 其他模块配置项
TapTapSdkBaseOptions[] otherOptions = new TapTapSdkBaseOptions[]
{
achievementOptions
};
// TapSDK 初始化
TapTapSDK.Init(coreOptions, otherOptions);
import com.taptap.sdk.achievement.options.TapTapAchievementOptions;
import com.taptap.sdk.core.TapTapRegion;
import com.taptap.sdk.core.TapTapSdk;
import com.taptap.sdk.core.TapTapSdkOptions;
TapTapSdkOptions tapSdkOptions = new TapTapSdkOptions(
"clientId", // 游戏 Client ID
"clientToken", // 游戏 Client Token
TapTapRegion.CN // 游戏可玩区域: [TapTapRegion.CN]=国内 [TapTapRegion.GLOBAL]=海外
);
// 可选配置 成就模块
TapTapAchievementOptions tapAchievementOptions = new TapTapAchievementOptions(
true // 解锁 成就弹出 Toast 提示,默认 true
);
// 初始化 TapSDK
TapTapSdk.init(context, tapSdkOptions, tapAchievementOptions);
import com.taptap.sdk.core.TapTapSdk
import com.taptap.sdk.core.TapTapSdkOptions
import com.taptap.sdk.achievement.options.TapTapAchievementOptions
import com.taptap.sdk.core.TapTapRegion
TapTapSdk.init(
context = context,
sdkOptions = TapTapSdkOptions(
clientId = "clientId", // 游戏 Client ID
clientToken = "clientToken", // 游戏 Client Token
region = TapTapRegion.CN // 游戏可玩区域: [TapTapRegion.CN]=国内 [TapTapRegion.GLOBAL]=海外
),
options = arrayOf(
TapTapAchievementOptions(
// 成就达成时 SDK 是否需要展示一个气泡弹窗提示
enableToast = true
)
)
)
import TapTapAchievementSDK
import TapTapCoreSDK
// 核心配置
let coreOptions = TapTapSdkOptions()
coreOptions.clientId = "your_client_id" // 必须,开发者中心对应 Client ID
coreOptions.clientToken = "your_client_token" // 必须,开发者中心对应 Client Token
// 成就配置
let achievementOptions = TapTapAchievementOptions()
// 成就达成时 SDK 是否需要展示一个气泡弹窗提示
achievementOptions.enableToast = true
// 其他模块配置项
let otherOptions = [achievementOptions]
// TapSDK 初始化
TapTapSDK.initWith(coreOptions, otherOptions: otherOptions)
#import "TapTapCoreSDK/TapTapSDK.h"
#import "TapTapAchievementSDK/TapTapAchievementSDK-Swift.h"
// 核心配置项
TapTapSdkOptions *options = [[TapTapSdkOptions alloc] init];
options.clientId = @"your_clientId"; // 必须,开发者中心对应 Client ID
options.clientToken = @"your_client_token"; // 必须,开发 者中心对应 Client Token
// 成就配置
TapTapAchievementOptions *achievementOptions = [[TapTapAchievementOptions alloc] init];
// 成就达成时 SDK 是否需要展示一个气泡弹窗提示
achievementOptions.enableToast = YES;
// 其他模块配置项
NSArray *otherOptions = @[achievementOptions];
// TapSDK 初始化
[TapTapSDK initWithOptions:options otherOptions:otherOptions];
注册监听回调
成就 SDK 中包含多个监听回调,分别会在初始化数据成功、初始化数据失败以及成就进度更新时被调用。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.Achievement;
AchievementCallback callback = new AchievementCallback();
TapTapAchievement.RegisterCallBack(callback);
TapTapAchievement.UnRegisterCallBack(callback);
class AchievementCallback : ITapAchievementCallback
{
public AchievementCallback(){}
public void OnAchievementSuccess(int code, TapAchievementResult result)
{
// 成就状态更新成功
// code 70001 解锁成就成功
// code 70002 增加步长成功
// result 成就数据详情
}
public void OnAchievementFailure(string achievementId, int errorCode, string errorMsg)
{
// 成就状态更新失败或其他错误
// achievementId 触发失败的成就 ID, 如果调用的是 [ShowAchievements] 接口,则为 "" 空字符串。
// errorCode 错误码
// errorMsg 错误描述
}
}
成就常量定义:
namespace TapSDK.Achievement
{
public class TapTapAchievementConstants
{
// 未初始化
public static readonly int NOT_INITIALIZED = 80000;
// 区域不支持
public static readonly int REGION_NOT_SUPPORTED = 80001;
// 当前未登录,需要登录
public static readonly int NOT_LOGGED = 80002;
// 当前登录失效,需要重新登录
public static readonly int ACCESS_DENIED = 80010;
// 无效参数
public static readonly int INVALID_REQUEST = 80020;
// 网络异常
public static readonly int NETWORK_ERROR = 80030;
// 未知错误,如:代理导致网络错误
public static readonly int UNKNOWN_ERROR = 80100;
// unlock解锁成就成功
public static readonly int UNLOCK_SUCCESS = 70001;
// 增加步长成功
public static readonly int INCREMENT_SUCCESS = 70002;
}
}
import com.taptap.sdk.achievement.TapAchievementCallback;
import com.taptap.sdk.achievement.TapTapAchievement;
import com.taptap.sdk.achievement.TapTapAchievementResult;
TapAchievementCallback callback = new TapAchievementCallback(){
@Override
public void onAchievementSuccess(int code, @Nullable TapTapAchievementResult result) {
// 成就状态更新成功
}
@Override
public void onAchievementFailure(@NonNull String achievementId, int errorCode, @NonNull String errorMessage) {
// 成就状态更新失败
}
};
TapTapAchievement.registerCallback(callback);
TapTapAchievement.unregisterCallback(callback);
import com.taptap.sdk.achievement.TapTapAchievement
import com.taptap.sdk.achievement.TapAchievementCallback
import com.taptap.sdk.achievement.TapTapAchievementResult
val callback = object : TapAchievementCallback {
override fun onAchievementSuccess(code: Int, result: TapTapAchievementResult?) {
// 成就状态更新成功
}
override fun onAchievementFailure(achievementId: String, errorCode: Int, errorMessage: String) {
// 成就状态更新失败
}
}
TapTapAchievement.registerCallback(callback = callback)
TapTapAchievement.unregisterCallback(callback)
import TapTapAchievementSDK
class CallbackImpl: NSObject, TapTapAchievementCallback {
override init() {}
// 成就状态更新成功
func onAchievementSuccess(code: Int, result: TapTapAchievementResult) {
// code 70001 解锁成就成功
// code 70002 增加步长成功
// result 成就数据详情
}
// 成就状态更新失败或其他错误
func onAchievementFailure(achievementId: String, errorCode: Int, errorMsg: String) {
// achievementId 触发失败的成就 ID, 如果调用的是 [ShowAchievements] 接口,则为 "" 空字符串。
// errorCode 错误码
// errorMsg 错误描述
}
}
let callback = CallbackImpl()
TapTapAchievement.registerCallback(callback: callback)
// 不需要接收回调时调用接口移除之前设置的回调对象
TapTapAchievement.unregisterCallback(callback: callback)
成就常量定义:
public class TapAchievementCallbackCode: NSObject {
// 解锁成就成功,包括步长达到阈值解锁和直接解锁
public static let UNLOCK_SUCCESS = 70001
// 增加步长成功
public static let INCREMENT_SUCCESS = 70002
// 上报失败,未初始化
public static let NOT_INITIALIZED = 80000
// 区域不支持
public static let REGION_NOT_SUPPORTED = 80001
// 上报失败,未登录
public static let NOT_LOGGED = 80002
// 认证信息无效
public static let ACCESS_DENIED = 80010
// 无效请求
public static let INVALID_REQUEST = 80020
// 网络异常
public static let NETWORK_ERROR = 80030
// 未知异常
public static let UNKNOWN_ERROR = 80100
}
#import "TapTapAchievementSDK/TapTapAchievementSDK-Swift.h"
@interface GameMainController () <TapTapAchievementCallback>
@end
@implementation GameMainController
- (void)handleAchievemntCallback {
//注册回调
[TapTapAchievement registerCallbackWithCallback:self];
// 不需要接收回调时调用接口移除之前设置的回调对象
[TapTapAchievement unregisterCallbackWithCallback:self];
}
- (void)onAchievementFailureWithAchievementId:(NSString * _Nonnull)achievementId errorCode:(NSInteger)errorCode errorMsg:(NSString * _Nonnull)errorMsg {
// achievementId 触发失败的成就 ID, 如果调用的是 [ShowAchievements] 接口,则为 "" 空字符串。
// errorCode 错误码
// errorMsg 错误描述
}
- (void)onAchievementSuccessWithCode:(NSInteger)code result:(TapTapAchievementResult * _Nonnull)result {
// code 70001 解锁成就成功
// code 70002 增加步长成功
// result 成就数据详情
}
成功数据详情
TapAchievementResult
| 字段 | 含义 |
|---|---|
achievementId | 成就id |
achievementName | 成就名称 |
achievementType | 成就类型,分为普通成就(TapAchievementType.NORMAL)、白金成就(TapAchievementType.PLATINUM) |
currentSteps | 当前成就进度,如果不是分步式成就该值为 0 |