玩家数据
您可以在 Yandex 服务器上保存游戏状态数据(包括完成的关卡、经验和游戏内购),也可以将这些数据传输到您的服务器。您还可以通过使用 Yandex 个人资料中的用户数据(例如姓名)对游戏进行个性化。
Player
对象可用于处理用户数据。
初始化
要初始化 Player
对象,请使用 ysdk.getPlayer()
方法:
var player;
ysdk.getPlayer().then(_player => {
player = _player;
}).catch(err => {
// 初始化 Player 对象时出错。
});
初始化 Player
对象时会传入以下数据:
- 用户ID — 所有玩家都会包含。
- 头像和名称 — 仅限已授权玩家。
- 平台内购数据(仅适用于支持应用内购买的游戏)— 仅限俄罗斯地区玩家。
访问用户数据取决于其个人资料中的隐私设置。如果玩家禁止访问个人数据,响应中将只包含用户ID。
您可以使用可选的 signed: true
参数和 fetch
方法来登录用户,并将游戏状态数据保存在您的服务器上。这样您就可以使用签名来验证玩家身份并避免可能存在的欺诈。
var player;
ysdk.getPlayer({ signed: true }).then(_player => {
player = _player;
// 使用 player.signature 在您的服务器上进行授权。
fetch('https://your.game.server?auth', {
method: 'POST',
headers: { 'Content-Type': 'text/plain' },
body: player.signature
});
}).catch(err => {
// 初始化 Player 对象时出错。
});
发送到服务器的请求中的 signature
参数包含 Yandex 个人资料中的用户数据和签名。该参数由两个 Base64 编码的字符串组成:
<signature>.<profile data>
详情请参见欺诈防范。
备注
请求的发送频率不能超过每5分钟20次,否则将会因错误而被拒绝。
用户登录
检查用户是否登录
要检查玩家是否已在 Yandex Games 上授权,请使用 Player
对象的 player.isAuthorized()
方法。该方法返回 true | false
。
注意
方法 player.getMode(): 'lite' | ''
已弃用,未来将从接口中移除。
调用登录对话框
如果玩家未登录,您可以使用 ysdk.auth.openAuthDialog()
方法打开登录对话框。
提示
将登录的好处通知用户。不了解这些好处的用户很可能跳过登录并退出游戏。
var player;
function initPlayer() {
return ysdk.getPlayer().then(_player => {
player = _player;
return player;
});
}
initPlayer().then(_player => {
if (_player.isAuthorized() === false) {
// 玩家未登录。
ysdk.auth.openAuthDialog().then(() => {
// 玩家已登录。
initPlayer().catch(err => {
// 初始化 Player 对象时出错。
});
}).catch(() => {
// 玩家未登录。
});
}
}).catch(err => {
// 初始化 Player 对象时出错。
});
游戏内数据
要处理用户的游戏内数据,请使用 Player
对象方法:
-
player.setData(data, flush)
:保存用户数据。数据大小上限不应超过 200 KB。data
:对象,包含键值对的对象。flush
:布尔值,指定数据发送顺序。如果该值为“true”,数据将立即发送到服务器;如果该值为“false”(默认值),发送数据的请求将排入队列。
该方法会返回表示数据是否保存的
Promise
。当参数值为
flush: false
时,返回的结果将只显示数据有效性(数据已排入队列以便之后发送时)。但是,如果您现在使用player.getData()
,将返回由player.setData()
设置的最新数据,即使当前数据尚未发送。player.setData({ achievements: ['trophy1', 'trophy2', 'trophy3'], }).then(() => { console.log('data is set'); });
-
player.getData(keys)
:异步返回存储在 Yandex 数据库中的游戏内用户数据。keys
:array,要返回的关键字列表。如果 keys
参数缺失,该方法会返回所有游戏内用户数据。
该方法可返回
Promise<Object>
,其中的对象包含键值对。 -
player.setStats(stats)
:保存用户的数值数据。数据大小上限不得超过 10 KB。stats
:对象,包含键值对的对象,其中每个值都是数字。
该方法会返回表示数据是否保存的
Promise
。提示
对于频繁变化的数值(例如得分、经验值和游戏货币),应使用该方法,而不是 player.setData()。
-
player.incrementStats(increments)
:更改游戏内用户数据。数据大小上限不得超过 10 KB。increments
:对象,包含键值对的对象,其中每个值都是数字。
该方法可返回
Promise<Object>
,其中的对象包含更改和添加的键值对。 -
player.getStats(keys)
:异步返回用户的数值数据。keys
:array,要返回的关键字列表。如果 keys
参数缺失,该方法会返回所有游戏内用户数据。
该方法可返回
Promise<Object>
,其中的对象包含键值对。
备注
请求频率是有限制的。如果超出限制,请求将会因错误而被拒绝。
用户个人资料数据
要从 Yandex 用户个人资料中获取数据,请使用 Player
对象方法:
-
player.getUniqueID()
:返回用户的唯一永久 ID(类型:字符串)。备注
之前使用的
player.getID()
方法现已弃用,但仍可以继续使用一段时间,这会在错误控制台中引发警告。一般来说,对于某个
Player
对象,player.getID()
和player.getUniqueID()
的值并不相同,但对于某些用户来说却可能是相同的。如果值不同且游戏本身已将某些数据关联到player.getID()
值,则您需要迁移该数据并将其关联到player.getUniqueID()
的值。要一次性迁移所有用户的数据,请联系支持部门。 -
player.getIDsPerGame()
:返回Promise<Array>
,将在所有用户明确同意迁移其个人数据的开发者游戏中指定用户 ID。例如:[ { appID: 103915, userID: "tOpLpSh7i8QG8Voh/SuPbeS4NKTj1OxATCTKQF92H4c=" }, { appID: 103993, userID: "bviQCIAAuVmNMP66bZzC4x+4oSFzRKpteZ/euP/Jwv4=" } ]
注意
该方法仅供登录用户使用。如果需要,请使用授权。
要检查该方法是否可供用户使用,您可以使用
ysdk.isAvailableMethod('player.getIDsPerGame')
方法。它会返回Promise<Boolean>
,其中布尔值表示该方法是否可用。 -
player.getName()
:返回用户的名称(类型:字符串)。 -
player.getPhoto(size)
:返回用户头像的 URL(类型:字符串)。size
:字符串,要求的大小。可能的值:small
、medium
、large
。
方法限制
方法 |
描述 |
限制 |
|
每5分钟20次请求 |
|
|
每5分钟100次请求 |
|
|
||
|
每1分钟60次请求 |
|
|
||
|
iOS 进度丢失
如果通过 iframe
集成游戏,则 localStorage
在新版 iOS 中可能会经常重置,这会导致玩家进度丢失。为避免发生这种情况,请使用与 localStorage
具有相同界面的 safeStorage
:
ysdk.getStorage().then(safeStorage => {
safeStorage.setItem('key', 'safe storage is working');
console.log(safeStorage.getItem('key'))
})
为了避免手动更改代码,请全局覆盖 localStorage
。
注意
覆盖前请确保 localStorage
不在使用中。
ysdk.getStorage().then(safeStorage => Object.defineProperty(window, 'localStorage', { get: () => safeStorage }))
.then(() => {
localStorage.setItem('key', 'safe storage is working');
console.log(localStorage.getItem('key'))
})
如果您将源代码下载为存档,则不需要执行任何操作:SDK 中的特殊包装器会自动使 localStorage
变得可靠。
备注
技术支持团队将协助您将已完成的游戏发布到 Yandex 游戏平台。关于开发和测试方面的具体问题,其他开发人员将在Discord 频道中进行回答。
如果您遇到 Yandex Games SDK 方面的问题或有其他问题想要咨询,请联系支持部门: