本模块功能自运营 SDK 3.13.0
开始提供
游戏使用成就系统提供的 API,记录并上报玩家在游戏中的活动,并在个人事迹中展示活动及其成果
在正式接入成就系统前,接入方需要确认以下流程已完善:
向 SDK 开发人员提交游戏 Game Key,和 APK 签名的 sha256摘要,SDK
对接人员会协助填写,
并将最后得到的公钥给游戏开发,游戏应妥善保管此参数
如何获取公钥参考:获取 Android 应用签名证书指纹
对于单个成就,游戏应提供以下信息给 SDK 对接人员:
内容 | 定义 | 说明 |
---|---|---|
成就名称 | 成就名称 | 后台需要上传,仅作为成就ID对应的名称记录 |
成就标识 | 成就唯一标识 | 通过标识返回对应成就的数据(仅限数字+英文,最多100个字符) |
达成条件 | 完成成就所需分数 | 仅限数值类型,支持从0-100,000,000 |
是否隐藏 | 记录是否为隐藏成就 | 供游戏方做成就分类,获取成就列表时带有该字段,1为是,0为否 |
为方便接入方提交信息,可以按照 4399 SDK 成就系统配置模板 填写成就配置
在调用本服务相关接口前,游戏应先调用下面前置接口:
Achievement.init
,初始化公钥,在使用成就系统其他接口前,应调用此接口进行初始化
/**
* 服务初始化
*
* @param publicKey 接口公钥,完成游戏服务配置得到
*/
public static void init(String publicKey)
调用示例:
.init(String publicKey); Achievement
Achievement.initRole
,在成就系统中初始化角色信息,要获取个人成就数据,需要先对角色进行成就系统初始化
/**
* 初始化角色信息
*
* @param serverId 区服id,没有则传字符串0
* @param roleId 游戏角色id,没有则传字符串0
* @param listener 回调对象
*/
public static void initRole(String serverId,String roleId,@NonNull OpeDataListener<Void> listener);
调用示例:
String serverId = "4399";
String roleId = "520";
<Void> listener = new OpeDataListener<Void>() {
OpeDataListener@Override
public void onFinished(int code, @Nullable String message, @Nullable Void unused) {
// code:状态码,为0表示成功
}
};
.initRole(serverId, roleId, listener); Achievement
可调用Achievement.isRoleInit
接口判断是否初始化成功,示例代码:
if (!Achievement.isRoleInit(serverId, roleId)) {
//需要进行初始化
String serverId = "4399";
String roleId = "520";
<Void> listener = new OpeDataListener<Void>() {
OpeDataListener@Override
public void onFinished(int code, @Nullable String message, @Nullable Void unused) {
//code:状态码,为0表示成功
}
};
.initRole(String server, String role, listener);
Achievement}
Achievement.getAchievementList
,获取游戏成就列表。调用结果通过回调的方式返回给调用者
/**
* 获取角色成就列表
*
* @param serverId 区服id,没有则传字符串0
* @param roleId 游戏角色id,没有则传字符串0
* @param listener 回调对象
*/
public static void getAchievementList(String serverId,String roleId,
@NonNull OpeDataListener<List<AchievementDetail>>listener);
接口返回的角色成就列表,通过接口OpeDataListener<List<AchievementDetail>>
接口返回
OpeDataListener
,通用泛型回调接口,接入方调用方法后通过接口方法接收并处理调用结果
AchievementDetail
,角色成就数据模型,里面包含了游戏所定义的成就列表信息
两个类的具体信息在本文档后文的 API
详情部分,接口示例中涉及的其他类也是如此
调用示例:
String serverId = "4399";
String roleId = "520";
<List<AchievementDetail>> listener = new OpeDataListener<List<AchievementDetail>>() {
OpeDataListener@Override
public void onFinished(int code, @Nullable String message, @Nullable List<AchievementDetail> data) {
//code : 状态码,data : 成就数据
if (data != null) {
//获取成就列表
List<AchievementDetail> mAchievementList = data;
}
}
};
.getAchievementList(serverId, roleId, listener); Achievement
Achievement.updateAchievement
,更新角色成就,当用户达成特定条件,使用此接口更新成就
/**
* 更新角色成就
*
* @param serverId 区服id,没有则传字符串0
* @param roleId 游戏角色id,没有则传字符串0
* @param mode 更新模式,枚举变量,详情参考 UpdateMode 说明
* @param id 应与目标成就在后台配置一致
* @param step 需要更新的成就步数,一般是正整数
* 当更新模式巍峨 UpdateMode.UPDATE_MAX时传固定值 -1
* @param listener 回调对象
(String serverId, String roleId,
public static void updateAchievement, String id, int step,
UpdateMode mode@NonNull OpeDataListener<Void> listener);
调用示例:
.UpdateMode updateMode = Achievement.UpdateMode.UPDATE_ADD;
AchievementString serverId = "4399";
String roleId = "520";
String achvId = "成就id1";
int step = 1;
<Void> opeDataListener = new OpeDataListener<Void>() {
OpeDataListener@Override
public void onFinished(int code, @Nullable String message, @Nullable Void unused) {
}
};
.updateAchievement(serverId, roleId, updateMode, achvId, step,opeDataListener); Achievement
UpdateMode
更新模式,类详情可参考附录,此处结合示例说明用法
UPDATE_ADD
,UPDATE_SET
,UPDATE_MAX
;
UPDATE_ADD
:步进式进度增加,如原本是0,加1后变成1,再加1则变成2UPDATE_SET
:阶段式进度增加,如需要特定三个条件完成成就,重复完成一个条件,进度不会累加,UPDATE_MAX
:直接达成成就Achievement.getGameAchievement
,获取游戏所有成就列表,某些情况下,可能需要此接口获取游戏的所有成就列表
/**
* 获取本游戏成就列表
*
* @param listener 回调对象
*/
public static void getGameAchievement(@NonNull OpeDataListener<List<AchievementDetail>>listener);
示例代码:
.getGameAchievement(new OpeDataListener<List<AchievementDetail>>() {
Achievement@Override
public void onFinished(int code, @Nullable String message, @Nullable List<AchievementDetail> data) {
if (code == 0 && data != null) {
//获取成就列表
List<AchievementDetail> mAchievementList = data;
}
}
});
/**
* 数据监听器
*/
public interface OpeDataListener<T> {
/**
* @param code 0为请求成功,并返回数据, 其他code均为失败,失败时数据可能为空
* @param message 说明文案
* @param data 返回数据
*/
void onFinished(int code, @Nullable String message, @Nullable T data);
}
status | 含义 |
---|---|
0 | 成功 |
1 | 取消 |
2 | 处理中,可能是延迟 |
3 | 失败,可从message中了解更多信息 |
4 | 接口返回超时 |
5 | 未知结果,作为保留字段 |
101 | 参数不全 |
110 | 游戏未配置 |
112 | 加密错误 |
113 | 数据JSON类型错误 |
114 | 数据参数错误 |
115 | 证书签名错误 |
116 | 登录状态错误 |
117 | 数据参数不全 |
118 | 数据成就ID错误 |
119 | 数据步数错误 |
121 | 该成就已完成 |
122 | 维护中 |
123 | 已被列入黑名单 |
126 | 已初始化 |
描述成就的数据模型
/** 成就详情 */
public class AchievementDetail implements Serializable {
/** 成就名称. */
public String name;
/** 成就Id. */
public String id;
/** 成就总步数. */
public int totalStepCounted;
/** 是否隐藏. */
public boolean isHide;
/** 成就稀有度 */
public RarityStatistics rarityStatistics;
/** 个人成就详情 */
public PersonalAchieve personalAchieve;
/** 成就稀有度 */
public static class RarityStatistics implements Serializable {
/** 已完成人数 */
public int countCompleted;
/** 参与完成成就总人数 */
public int countAll;
}
/** 个人成就详情 */
public static class PersonalAchieve implements Serializable {
/**
* 成就达成时间
* 格式:yyyy/MM/dd HH:mm:ss
* 举例 :
* 未达成 0
* 已达成 1960/01/01 00:00:00
*/
public String achieveTime;
/** 成就当前进度 */
public String currentSteps;
}
}
更新成就的模式
public class Achievement {
/**
* 更新成就的模式
*/
public enum UpdateMode {
/* 累加,将数值加到旧值上 */
,
UPDATE_ADD/* 覆盖,用新值覆盖旧值 */
,
UPDATE_SET/* 设为最大值 */
UPDATE_MAX}
}