成就系统开发指南
本文介绍如何在游戏中加入成就系统。TDS 推出的成就系统模块,是基于内建账户系统(TDSUser)的,具体请阅读 内建账户 > 开发指南。
环境要求
- Unity
- Android
- iOS
- UE4
- Unity 2019.4 或更高版本
- iOS 11 或更高版本,Xcode 版本 14.1 或更高版本
- Android 5.0(API level 21)或更高版本
Android 5.0(API level 21)或更高版本
iOS 11 或更高版本,Xcode 版本 14.1 或更高版本
- 安装 UE 4.26 及以上版本
- iOS 12 或更高版本
- Android 5.0(API level 21)或更高版本
- macOS 10.14.0 或更高版本
- Windows 7 或更高版本
支持平台:Android / iOS / Windows / macOS
权限说明
- Unity
- Android
- iOS
- UE4
该模块需要如下权限:
| 权限 | 使用目的 | 权限申请时机 |
|---|---|---|
| 网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
集成前准备
- 参考 准备工作 创建应用、开启成就服务、绑定 API 域名;
SDK 获取
由于成就服务依赖内建账户,所以集成游戏成就服务所需 SDK 依赖库需要在内建账户依赖库的基础上,在 下载页 获得 TapSDK,另外添加 TapAchievement 模块:
- Unity
- Android
- iOS
- UE4
SDK 可以通过 Unity Package Manager 导入或手动导入,二者任选其一。请根据项目需要选择。
方法一:使用 Unity Package Manager
从 3.29.1 版本开始, SDK 修改 JSON 解析库为 Newtonsoft-json,如果当前工程已接入该依赖库,则不需额外处理,否则需在 Packages/manifest.json 添加如下依赖:
"com.unity.nuget.newtonsoft-json":"3.2.1"
NPMJS 安装
从 3.25.0 版本开始,TapSDK 支持了 NPMJS 安装,优势是只需要配置版本号,并且支持嵌套依赖。
在项目的 Packages/manifest.json 文件中添加以下依赖:
"dependencies":{
"com.taptap.tds.achievement":"3.29.4",
"com.taptap.tds.login":"3.29.4",
"com.taptap.tds.common":"3.29.4",
"com.taptap.tds.bootstrap":"3.29.4",
}
但需要注意的是,要在 Packages/manifest.json 中 dependencies 同级下声明 scopedRegistries:
"scopedRegistries": [
{
"name": "NPMJS",
"url": "https://registry.npmjs.org/",
"scopes": ["com.tapsdk", "com.taptap", "com.leancloud"]
}
]
GitHub 安装
在项目的 Packages/manifest.json 文件中添加以下依赖:
"dependencies":{
"com.taptap.tds.login":"https://github.com/TapTap/TapLogin-Unity.git#3.29.4",
"com.taptap.tds.common":"https://github.com/TapTap/TapCommon-Unity.git#3.29.4",
"com.taptap.tds.bootstrap":"https://github.com/TapTap/TapBootstrap-Unity.git#3.29.4",
"com.taptap.tds.achievement":"https://github.com/TapTap/TapAchievement-Unity.git#3.29.4",
"com.leancloud.realtime":"https://github.com/leancloud/csharp-sdk-upm.git#realtime-2.3.0",
"com.leancloud.storage":"https://github.com/leancloud/csharp-sdk-upm.git#storage-2.3.0",
}
在 Unity 顶部菜单中选择 Window > Package Manager 可查看已经安装在项目中的包。
方法二:手动导入
-
在 下载页 找到 TapSDK Unity 下载地址,下载
TapSDK-UnityPackage.zip。 -
在 Unity 项目中依次转到 Assets > Import Packages > Custom Packages,从解压后的
TapSDK-UnityPackage.zip中,选择希望在游戏中使用的 TapSDK 包导入,其中:
TapTap_Bootstrap.unitypackageTapSDK 启动器,必选。TapTap_Common.unitypackageTapSDK 基础库,必选。TapTap_Login.unitypackageTapTap 登录库,必选。TapTap_Achievement.unitypackageTapTap 成就库,必选。
- 如果当前项目已集成
Newtonsoft.Json依赖,则忽略该步骤,否则在NuGet.orgNewtonsoft.Json 页面中通过点击右侧 「Download package」 下载库文件,并将下载的文件后缀从.nupkg修改为.zip,同时解压该文件并复制内部的Newtonsoft.Json.dll文件拷贝到工程Assets的Plugins目录下,另外为了避免导出 IL2CPP 平台时删除必要数据,需在Assets目录下创建link.xml文件(如果已有该文件,则 添加如下内容),其内容如下:
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all" />
</assembly>
</linker>
repositories{
flatDir {
dirs 'libs'
}
}
dependencies {
...
implementation (name:'TapAchievement_3.29.4', ext:'aar') // TapTap 成就系统
}
// 成就系统
TapAchievementResource.bundle
TapAchievementSDK.framework
PublicDependencyModuleNames.AddRange(new string[] {
// 添加 TapTap 成就系统
"TapAchievement",
});
SDK 初始化
参考内建账户的初始化方法,初始化内建账户服务会同步初始化游戏成就服务;
模块基础设置
- Unity
- Android
- iOS
- UE4
PC 平台的成就详情界面会显示游戏名称和游戏 Icon。(下图中:左上角图片为应用图标,「人类跌落梦境」为应用名称)

默认情况下,SDK 会以应用的名字和图标来显示,如果需要自定义名字和图标,可以通过以下接口:
TapAchievement.SetApplicationName(string applicationName)
TapAchievement.SetApplicationIcon(Texture2D applicationIcon)
Android 不需要设置
iOS 不需要设置
UE4 的 SDK 需要设置应用的名称和图标,用于在成就详情页面显示。
(下图中:左上角图片为应用图标,「人类跌落梦境」为应用名称)

FTapAchievementsPtr AchievementInterface = FTapAchievementModule::GetAchievementInterface();
FText ProjectName = /** 你的应用名称 */
UTexture2D* ProjectTexture = /** 你的应用图标 */
AchievementInterface->SetApplicationName(ProjectName);
AchievementInterface->SetApplicationIcon(ProjectTexture);
注册监听回调
成就 SDK 中包含多个监听回调,分别会在初始化数据成功、初始化数据失败以及成就进度更新时被调用,请特别注意初始化数据成功的回调,这是成就 SDK 正常使用的前提,初始化数据失败时请提示用户或者在合适的时候重新初始化数据。
- Unity
- Android
- iOS
- UE4
使用前提
使用 TapTap.Achievement 前提是必须依赖 TapTap.Bootstrap 库。
命名空间
using TapTap.Achievement;
注册监听回调:
TapAchievement.RegisterCallback(IAchievementCallback callback);
private class AchievementCallback:IAchievementCallback
{
public void OnAchievementSDKInitSuccess()
{
// 成就 SDK 初始化成功
}
public void OnAchievementSDKInitFail(TapError errorCode)
{
if (errorCode != null)
{
// 初始化失败
}
}
public void OnAchievementStatusUpdate(TapAchievementBean bean, TapError errorCode)
{
if (errorCode != null)
{
// 成就状态更新失败
return;
}
if (bean != null)
{
// 成就状态更新成功
}
}
}
TapAchievement.registerCallback(new AchievementCallback() {
@Override
public void onAchievementSDKInitSuccess() {
// 数据加载成功
}
@Override
public void onAchievementSDKInitFail(AchievementException exception) {
// 数据加载失败,请重试
}
@Override
public void onAchievementStatusUpdate(TapAchievementBean item, AchievementException exception) {
if (exception != null) {
// 成就更新失败
return;
}
if (item != null) {
// item 更新成功
}
}
});
[TapAchievement registerCallBack:self];
- (void)onAchievementSDKInitSuccess {
// 数据加载成功
}
// 初始化失败
- (void)onAchievementSDKInitFail:(nullable NSError *)error {
// 数据加载失败,请重试
}
// 成就状态改变
- (void)onAchievementStatusUpdate:(nullable TapAchievementModel *)achievement failure:(nullable NSError *)error {
if (error) {
// 成就更新失败
} else {
// achievement 更新成功
}
}
FTapAchievementsPtr AchievementInterface = FTapAchievementModule::GetAchievementInterface();
AchievementInterface->OnAchievementStatusUpdate.AddLambda([](const FAchievementDescTap* Desc, const FAchievementTap* Achievement, const TSharedPtr<FTUError>& Error)
{
if (Desc && Achievement)
{
//成就更新成功
}
else if(Error)
{
//成就更新失败
}
});