我一直遇到这个问题,因为在整个脚本中我 getAsync 和 SetAsync 值的顺序完全相同,但在排除故障时,由于我不断丢失数据,它显然说它尝试为玩家设置的第一个值是 nil,虽然打印表格显示它在那里,只是与我设置的位置不同。
local DataStore = game:GetService("DataStoreService"):GetDataStore("Basic")
local template = {
Money = 0;
Level = 0;
XP = 0
}
local MAXIMUM_RETRY_ATTEMPTS = 5
local RETRY_COOLDOWN = 1
game.Players.PlayerAdded:Connect(function(plr)
local ls = plr:FindFirstChild("leaderstats")
local retryCount = 0
local success = false
local result
while not success and retryCount < MAXIMUM_RETRY_ATTEMPTS do
success, result = pcall(function()
local data = DataStore:GetAsync(tostring(plr.UserId))
if data == nil then
print("nothing?")
else
ls.Money.Value = data.Money
ls.Level.Value = data.Level
ls.XP.Value = data.XP
print("Success import")
print(data)
end
end)
if not success then
retryCount = retryCount + 1
warn(string.format("Failed to Import %s's data with error : %s", plr.Name, tostring(result or "")))
local data = DataStore:GetAsync(tostring(plr.UserId))
print(data)
task.wait(RETRY_COOLDOWN)
end
end
end)
game.Players.PlayerRemoving:Connect(function(plr)
local result
local success = false
local ls = plr:FindFirstChild("leaderstats")
while not success do
success, result = pcall(function()
DataStore:SetAsync(tostring(plr.UserId), {
Money = ls.Money.Value;
Level = ls.Level.Value;
XP = ls.XP.Value
})
print("Success export")
end)
if not success then
warn(string.format("Failed to Export %s's data with error : %s", plr.Name, tostring(result or "")))
end
end
end)
正如您在评论中提到的,您看到的错误是:
而且您已经缩小了范围,认为这不是您的
data
桌子。这意味着您的领导者统计数据ls
为零。因此,看看您在哪里定义它...看起来您遇到了竞争条件。您正在尝试获取 leaderstats,但如果不存在,它将返回
nil
。因此,如果另一个脚本正在创建它,一个简单的修复方法可能是将该行更改为...但更好的解决方法可能是将构建 leaderstats 文件夹的代码和所有 NumberValues 移到此函数的顶部。这样,构建 leaderstats 的代码与用数据填充它的代码相同。