排行榜
在游戏页面上,您可以显示个性化排行榜(排名表),展示最佳玩家的成绩以及已授权用户在排名中的位置。
要使排行榜请求正常工作,请满足以下条件:
注意
如果开发人员控制台中没有Technical leaderboard name字段中相应名称的排行榜,请求将返回404错误。
初始化
要调用排行榜方法,请直接访问 ysdk.leaderboards。
注意
使用 ysdk.getLeaderboards() 方法初始化 lb 对象的方式已弃用。
旧方法
1const ysdk = await YaGames.init();
2
3const lb = await ysdk.getLeaderboards();
4
5// 排行榜方法调用的新旧方式对应关系:
6// lb.getLeaderboardDescription() → ysdk.leaderboards.getDescription()
7// lb.setLeaderboardScore() → ysdk.leaderboards.setScore()
8// lb.getLeaderboardPlayerEntry() → ysdk.leaderboards.getPlayerEntry()
9// lb.getLeaderboardEntries() → ysdk.leaderboards.getEntries()
排行榜描述
要按名称获取排行榜描述,请使用 ysdk.leaderboards.getDescription() 方法。
方法签名:
1interface ILeaderboardDescription {
2 appID: string;
3 default: boolean;
4 description: {
5 invert_sort_order: boolean;
6 score_format: {
7 options: {
8 decimal_offset: number;
9 };
10 type: 'numeric' | 'time';
11 };
12 sort_order: string;
13 };
14 name: string;
15 title: Record<Locale, string>;
16}
17
18function getDescription(
19 leaderboardName: string
20): Promise<ILeaderboardDescription> {}
接受排行榜技术名称 leaderboardName 作为唯一参数。返回包含排行榜描述的对象,包括以下字段:
|
参数 |
类型 |
描述 |
|
|
|
应用程序标识符。 |
|
|
|
如果为 |
|
|
|
排序方向:
|
|
|
|
字符串格式的排序方向:
|
|
|
|
分数的小数部分大小。例如,当 |
|
|
|
排行榜结果类型。可用值: |
|
|
|
在控制台的 Technical leaderboard name 字段中指定的排行榜名称。 |
|
|
|
本地化名称列表。可用的语言代码列在 语言与域名 页面上。 |
示例
1const ysdk = await YaGames.init();
2
3const lb = await ysdk.leaderboards.getDescription('leaderboard2021');
4
5console.log(lb);
新成绩
注意
该请求仅适用于已授权用户。如何检查授权状态并调用登录对话框,请参见用户登录部分。
在发送请求之前,使用 ysdk.isAvailableMethod('leaderboards.setScore') 检查方法的可用性。该方法返回 Promise<Boolean>。
为了确保所有用户的成绩都能保存,无论是否授权,建议在应用程序代码中自行实现自定义排行榜。技术选择不受限制。
要为玩家设置新成绩,请使用 ysdk.leaderboards.setScore() 方法。
方法签名:
1function setScore(
2 leaderboardName: string,
3 score: number,
4 extraData?: string
5): Promise<void> {}
接受三个参数:
|
参数 |
类型 |
描述 |
|
|
|
在控制台的 Technical leaderboard name 字段中指定的排行榜名称。 |
|
|
|
结果值。不能为负数,最大值仅受 JavaScript 逻辑限制。如果排行榜类型为 |
|
|
|
用户描述。可选参数。 |
备注
请求发送频率不能超过每秒 1 次,否则将被拒绝并返回错误。
示例
1const ysdk = await YaGames.init();
2
3await ysdk.leaderboards.setScore('leaderboard2021', 120);
4
5await ysdk.leaderboards.setScore('leaderboard2021', 120, 'My favourite player!');
获取排名
注意
该请求仅适用于已授权用户。如何检查授权状态并调用登录对话框,请参见用户登录部分。
在发送请求之前,使用 ysdk.isAvailableMethod('leaderboards.getPlayerEntry') 检查方法的可用性。该方法返回 Promise<Boolean>。
为了确保所有用户的成绩都能保存,无论是否授权,建议在应用程序代码中自行实现自定义排行榜。技术选择不受限制。
要获取用户排名,请使用 ysdk.leaderboards.getPlayerEntry() 方法。
方法签名:
1interface ILeaderboardEntry {
2 extraData: string;
3 rank: number;
4 score: number;
5 player: {
6 publicName: string;
7 uniqueID: string;
8 getAvatarSrc: (size?: 'small' | 'medium' | 'large') => string;
9 getAvatarSrcSet: (size?: 'small' | 'medium' | 'large') => string;
10 }
11}
12
13function getPlayerEntry(
14 leaderboardName: string
15): Promise<ILeaderboardEntry> {}
接受排行榜技术名称 leaderboardName 作为唯一参数。返回包含用户排名的对象,包括以下字段:
|
参数 |
类型 |
描述 |
|
|
|
结果值。 |
|
|
|
用户在排行榜中的位置。 |
|
|
|
用户描述。 |
|
|
|
用户名。 |
|
|
|
用户的唯一标识符 |
|
|
|
返回指定大小的用户头像 URL。 |
|
|
|
返回适用于 Retina 显示屏的用户头像 srcset。 |
备注
请求发送频率不能超过 5 分钟内 60 次,否则将被拒绝并返回错误。
示例
1const ysdk = await YaGames.init();
2
3try {
4 const res = await ysdk.leaderboards.getPlayerEntry('leaderboard2021');
5
6 console.log(res);
7} catch (err) {
8 if (err.code === 'LEADERBOARD_PLAYER_NOT_PRESENT') {
9 // 当玩家在排行榜中没有记录时触发。
10 }
11}
排行榜记录
要显示用户排名,请使用 ysdk.leaderboards.getEntries() 方法。
方法签名:
1interface ILeaderboardEntries {
2 leaderboard: ILeaderboardDescription;
3 ranges: {
4 start: number;
5 size: number;
6 }[];
7 userRank: number;
8 entries: ILeaderboardEntry[];
9}
10
11function getEntries(
12 leaderboardName: string,
13 options: {
14 includeUser?: boolean;
15 quantityAround?: number;
16 quantityTop?: number;
17 }
18): Promise<ILeaderboardEntries> {}
接受排行榜技术名称 leaderboardName 和可选参数 options:
|
选项 |
类型 |
描述 |
|
|
|
确定是否在响应中包含已授权用户:
|
|
|
|
需要返回的排行榜中用户上下的记录数量。最小值为 1,最大值为 10。默认返回 5。 |
|
|
|
排行榜顶部的记录数量。最小值为 1,最大值为 20。默认返回 5。 |
返回包含用户排名的对象 Promise<ILeaderboardEntries>,包括以下字段:
|
参数 |
类型 |
描述 |
|
|
|
|
|
|
|
响应中的位置区间。 |
|
|
|
排名中的位置。从零开始计数,因此第 1 名被视为第零个元素。 |
|
|
|
请求的记录数量。如果数据不足,可能与响应不符。 |
|
|
|
用户在排名中的位置。如果不存在,或者是不包含用户的顶部请求,则等于 0。 |
|
|
|
排名记录数组。记录与 获取排名 方法返回的值相同。 |
备注
请求发送频率不能超过 5 分钟内 20 次,否则将被拒绝并返回错误。
示例
1const ysdk = await YaGames.init();
2
3// 获取前 10 名玩家和用户附近的 3 条记录。
4const entries = await ysdk.leaderboards.getEntries('leaderboard2021', {
5 quantityTop: 10,
6 includeUser: true,
7 quantityAround: 3
8});
9
10console.log(entries);
方法限制
|
方法 |
描述 |
限制 |
用户授权 |
|
|
每秒 1 次请求 |
必需 |
|
|
|
每 5 分钟 60 次请求 |
必需 |
|
|
|
每 5 分钟 20 次请求 |
可选 |
其他请求的限制:5 分钟内 20 次请求。
问题解决
提示
使用 ysdk.isAvailableMethod() 和 ysdk.leaderboards.setScore() 方法组合时,未授权用户不会出现在排行榜中,也看不到自己的进度。为了确保所有玩家的成绩都能保存,建议在应用程序代码中创建自定义排行榜。技术选择不受限制。
Object already exists
尝试使用旧名称创建新排行榜时会出现此错误。请输入以前未使用过的名称。
用户已隐藏
如果玩家不允许使用其头像和名称,则会显示"用户已隐藏"。对用户数据的访问取决于其个人资料中的设置。详见初始化部分。
错误 404
如果调用排行榜 SDK 方法时出现 404 错误,请检查开发人员控制台中是否创建了 Technical leaderboard name 字段中具有相应名称的排行榜。
备注
技术支持团队将协助您将已完成的游戏发布到 Yandex 游戏平台。关于开发和测试方面的具体问题,其他开发人员将在Discord 频道中进行回答。
如果您遇到 Yandex Games SDK 方面的问题或有其他问题想要咨询,请联系支持部门:
在控制台的Technical leaderboard name字段中指定的排行榜名称。
应用程序标识符。
如果为true,则该排行榜为主排行榜。
排序方向:
false— 降序(得分最高的用户排在前面)。true— 升序(得分最低的用户排在前面)。
字符串格式的排序方向:
'DESC'— 降序(得分最高的用户排在前面)。'ASC'– 升序(得分最低的用户排在前面)。
分数的小数部分大小。例如,当decimal_offset: 2时,数字1234将显示为12.34。
排行榜结果类型。可用值:numeric(数字)、time(毫秒)。
本地化名称列表。可能的语言代码列在语言与域名页面上。
结果值。不能为负数,最大值仅受JavaScript逻辑限制。
用户描述。
用户在排行榜中的位置。
用户名。
用户唯一标识符。
返回用户头像的URL。可能的size值:small、medium、large。
返回适用于Retina显示屏的用户头像srcset。可能的size值:small、medium、large。
确定是否在响应中包含已授权用户:
true- 包含在响应中。false(默认)- 不包含。
需要返回的排行榜中用户上下的记录数量。最小值为1,最大值为10。默认返回5条。
排行榜顶部的记录数量。最小值为1,最大值为20。默认返回5条。
响应中的位置区间。
排名中的位置。从零开始计数,因此第1名被视为第零个元素。
请求的记录数量。如果数据不足,可能与响应不符。
排名记录数组。记录与获取排名方法返回的值相同。