roblox 中的数据问题

Data problems in roblox

不幸的是,我正在尝试将数据保存在 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() 都是阻塞网络请求,有可能会失败并引发错误。另外,您可以从服务器发送一个 limit on the number of requests,如果您达到该限制,您的代码将抛出错误并且可能会丢失玩家数据。

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

保存数据

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)