Lua roblox中的数据问题

Lua roblox中的数据问题,lua,roblox,Lua,Roblox,不幸的是,我正试图在roblox中保存数据。它坏了,你能帮我吗? 这是我的密码: local ds = game:GetService("DataStoreService"):GetDataStore("Data") game.Players.PlayerAdded:Connect(function(player) local leaderstats = Instance.new("Model") leaderstats.Name = "leaderstats" lea

不幸的是,我正试图在roblox中保存数据。它坏了,你能帮我吗? 这是我的密码:

local ds = game:GetService("DataStoreService"):GetDataStore("Data")

game.Players.PlayerAdded:Connect(function(player)
    local leaderstats = Instance.new("Model")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player

    local hidden = Instance.new("Model")
    hidden.Name = "hidden"
    hidden.Parent = player

    local coins = Instance.new("IntValue")
    coins.Name = "Coins"
    coins.Parent = leaderstats
    coins.Value = ds:GetAsync(player.UserId.."-coins") or 0
    ds:SetAsync(player.UserId.."-coins", coins.Value)
    coins.Changed:Connect(function()
        ds:SetAsync(player.UserId.."-coins", coins.Value)
    end)

    local gems = Instance.new("IntValue")
    gems.Name = "Gems"
    gems.Parent = leaderstats
    gems.Value = ds:GetAsync(player.UserId.."-gems") or 0
    ds:SetAsync(player.UserId.."-gems", gems.Value)
    gems.Changed:Connect(function()
        ds:SetAsync(player.UserId.."-gems", gems.Value)
    end)

    local level = Instance.new("IntValue")
    level.Name = "Level"
    level.Parent = leaderstats
    level.Value = ds:GetAsync(player.UserId.."-level") or 1
    ds:SetAsync(player.UserId.."-level", level.Value)
    level.Changed:Connect(function()
        ds:SetAsync(player.UserId.."-level", level.Value)
    end)

    local xp = Instance.new("IntValue")
    xp.Name = "XP"
    xp.Parent = hidden
    xp.Value = ds:GetAsync(player.UserId.."-xp") or 0
    ds:SetAsync(player.UserId.."-xp", xp.Value)
    xp.Changed:Connect(function()
        ds:SetAsync(player.UserId.."-xp", xp.Value)
    end)

    local maxstamina = Instance.new("IntValue")
    maxstamina.Name = "MaxStamina"
    maxstamina.Parent = hidden
    maxstamina.Value = ds:GetAsync(player.UserId.."-maxstamina") or 100
    ds:SetAsync(player.UserId.."-maxstamina", maxstamina.Value)
    maxstamina.Changed:Connect(function()
        ds:SetAsync(player.UserId.."-maxstamina", maxstamina.Value)
    end)

    local maxmagic = Instance.new("IntValue")
    maxmagic.Name = "MaxMagic"
    maxmagic.Parent = hidden
    maxmagic.Value = ds:GetAsync(player.UserId.."-maxmagic") or 100
    ds:SetAsync(player.UserId.."-maxmagic", maxmagic.Value)
    maxmagic.Changed:Connect(function()
        ds:SetAsync(player.UserId.."-maxmagic", maxmagic.Value)
    end)

    local stamina = Instance.new("IntValue")
    stamina.Name = "Stamina"
    stamina.Parent = hidden
    stamina.Value = maxstamina.value

    local magic = Instance.new("IntValue")
    magic.Name = "Magic"
    magic.Parent = hidden
    magic.Value = maxmagic.value

end)

game.Players.PlayerRemoving:Connect(function(player)
    ds:setAsync(player.UserId.."-coins", player.leaderstats.Coins.Value)
    ds:setAsync(player.UserId.."-gems", player.leaderstats.Gems.Value)
    ds:setAsync(player.UserId.."-xp", player.hidden.XP.Value)
    ds:setAsync(player.UserId.."-level", player.leaderstats.Level.Value)
    ds:setAsync(player.UserId.."-maxstamina", player.hidden.MaxStamina.Value)
    ds:setAsync(player.UserId.."-maxmagic", player.hidden.MaxMagic.Value)
end)    
谢谢你的帮助! 也没有错误代码,只是测试时数据没有保存。 我已启用Studio对API服务的访问。
真的,我不知道发生了什么我花了几个小时寻找如何解决这个问题,但我没有找到它。

可能是你的游戏还没有发布,但你的代码中没有任何东西看起来会抛出语法错误,但它看起来确实不安全和浪费

对GetAsync和SetAsync的每次调用都是一个阻塞网络请求,有可能失败并引发错误。另外,您可以从服务器发送一个数据包,如果达到该限制,您的代码将抛出错误并可能丢失玩家数据

您可以将整个值表保存到单个键中,而不是每个键保存一个值。这大大减少了网络请求的数量和失败的可能性

保存数据

加载数据


我想roblox社区会更有帮助。你发布了你的游戏吗?是的,我发布了它。我有一个错误:HTTP服务不是DataModel的有效成员。@Kylaaa我该怎么办?现在它说无法转换std::string的值。我查了一下,上面说我的数据没有被编码。我应该怎么做才能修复它?我已经用额外的日志和安全检查更新了答案。希望这会给出一个关于正在发生的事情的更清晰的信息。现在它将同样的错误信息放在了警告中。我该怎么办?警告的全文是什么?警告应该向您显示它试图解析为JSON的内容。可能是字符串不是有效的JSON,或者存在其他问题。
local HttpService = game:GetService("HttpService")
local DataStoreService = game:GetService("DataStoreService")
local ds = DataStoreService:GetDataStore("Data")

game.Players.PlayerRemoving:Connect(function(player)
    local stats = player.leaderstats
    local hidden = player.hidden

    local data = {
        coins = stats.Coins.Value,
        gems = stats.Gems.Value,
        xp = hidden.XP.Value,
        level = stats.Level.Value,
        maxstamina = hidden.MaxStamina.Value,
        maxmagic = hidden.MaxMagic.Value,
    }

    -- wrap the request in a try-catch block to ensure that failures don't throw errors
    local success, result = pcall(function()
        -- save all the data as a JSON string
        ds:setAsync(player.UserId, HttpSevice:JSONEncode(data))
    end
    if not success then
        warn(string.format("Failed to save %s's data with error : %s", player.Name, tostring(result))
        -- TO DO: FIGURE OUT HOW YOU WANT TO HANDLE THIS ERROR.
        -- IF YOU DO NOTHING, THE PLAYER WILL LOSE THIS SESSION'S DATA
    end 
end)
game.Players.PlayerAdded:Connect(function(player)
    local defaultData = {
        coins = 0,
        gems = 0,
        xp = 0,
        level = 1,
        maxstamina = 100,
        maxmagic = 100,
    }
    local loadedData = defaultData
    local success, result = pcall(function()
         return ds:GetAsync(player.UserId)
    end
    if success then
        if result then
            -- if we've successfully loaded the data, parse the stored json data
            print(string.format("An old player named %s has returned with data : %s!", player.Name, result))
            -- player data should look like this :
            -- {"coins":0,"xp":0,"gems":0,"level":1,"maxstamina":100,"maxmagic":100}
            local parseSuccess, parseResult = pcall(function()
                return HttpService:JSONDecode(result)
            end)
            if parseSuccess then
                loadedData = parseResult
            else
                warn(string.format("Failed to parse %s with error : %s", tostring(result), tostring(parseResult)) 
            end
        else
            -- we have a new player
            print(string.format("New player named %s has joined!", player.Name))
        end
    else
        warn(string.format("Something went wrong fetching %s's data : %s", player.Name, tostring(result))
        -- TO DO: FIGURE OUT HOW YOU WANT TO HANDLE THIS ERROR.
        -- IF YOU DO NOTHING, THE PLAYER'S DATA WILL BE THE DEFAULT DATA USED FOR
        -- NEW PLAYERS
    end

    -- create the leaderstats and hidden values, load the data from the loadedData table
    local leaderstats = Instance.new("Model")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player

    local hidden = Instance.new("Model")
    hidden.Name = "hidden"
    hidden.Parent = player

    local coins = Instance.new("IntValue")
    coins.Name = "Coins"
    coins.Parent = leaderstats
    coins.Value = loadedData.coins

    local gems = Instance.new("IntValue")
    gems.Name = "Gems"
    gems.Parent = leaderstats
    gems.Value = loadedData.gems

    local level = Instance.new("IntValue")
    level.Name = "Level"
    level.Parent = leaderstats
    level.Value = loadedData.level

    local xp = Instance.new("IntValue")
    xp.Name = "XP"
    xp.Parent = hidden
    xp.Value = loadedData.xp

    local maxstamina = Instance.new("IntValue")
    maxstamina.Name = "MaxStamina"
    maxstamina.Parent = hidden
    maxstamina.Value = loadedData.maxstamina

    local maxmagic = Instance.new("IntValue")
    maxmagic.Name = "MaxMagic"
    maxmagic.Parent = hidden
    maxmagic.Value = loadedData.maxmagic

    local stamina = Instance.new("IntValue")
    stamina.Name = "Stamina"
    stamina.Parent = hidden
    stamina.Value = loadedData.maxstamina

    local magic = Instance.new("IntValue")
    magic.Name = "Magic"
    magic.Parent = hidden
    magic.Value = loadedData.maxmagic
end)