Roblox 数据库不保存玩家数据

问题描述 投票:0回答:1
local DataStoreService = game:GetService("DataStoreService")
local DataBase = DataStoreService:GetDataStore("data")
local sessionData = {}
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function(Player)
    Player.CharacterAdded:Connect(function(Character)
        Character.Humanoid.JumpHeight = 275
    end)

    local leaderstats = Instance.new("Folder", Player)
    leaderstats.Name = "leaderstats"
    
    local FolderOfValues = Instance.new("Folder",leaderstats)
    FolderOfValues.Name = "FolderOfValues"

    local Coins = Instance.new("IntValue", FolderOfValues)
    Coins.Name = "Coins"

    local Gravity = Instance.new("IntValue", FolderOfValues)

    Gravity.Name = "Gravity"


    local success = nil
    local PlayerData = nil
    local attempt = 1

    repeat
        success, PlayerData = pcall(function()
            return DataBase:GetAsync(Player.UserId, sessionData[Player.UserId])
        end)

        attempt += 1
        if not success then

            warn(PlayerData)
            task.wait(2)

        end
    until success or attempt == 5
    
    if success then
        print("Players data connected")
        if not PlayerData then
            print("Assigning default data")
            PlayerData = {
                ["Coins"] = 0,
                ["Gravity"] = 10
            }
        end
        sessionData[Player.UserId] = PlayerData
    else
        warn("Unable to get data for the player")
        Player:Kick("Unable to load your data, try again next time")
    end
    workspace.Gravity = Gravity.Value



    Coins.Value = sessionData[Player.UserId].Coins
    Coins.Changed:Connect(function()
        sessionData[Player.UserId].Coins = Coins.Value
    end)


    Gravity.Value = sessionData[Player.UserId].Gravity
    Gravity.Changed:Connect(function()
        sessionData[Player.UserId].Gravity = Gravity.Value
    end)

end)


function PlayerLeaving(Player)
    if sessionData[Player.UserId] then
        local success = nil
        local errormsg = nil
        local attempt = 1

        repeat
            success, errormsg = pcall(function()
                DataBase:SetAsync(Player.UserId, sessionData[Player.UserId])

            end)
            attempt += 1
            if not success then
                warn(errormsg)
                task.wait(3)

            end


        until success or attempt == 5

        if success then
            print("Data saved")
        else
            warn("Not saved")
        end


    end
end

game.Players.PlayerRemoving:Connect(PlayerLeaving)


function ServerShutDown()
    print("Server Shutting down")
    RunService:IsStudio(function()
        return
    end)
    for i, Player in ipairs(game.Players:GetChildren()) do
        task.spawn(function()
            PlayerLeaving(Player)
        end)
    end
end

game:BindToClose(ServerShutDown)

当我在没有数据的情况下进入游戏时,即使我没有任何进展,它也会打印“玩家的数据已连接”。当我带着进度离开时,没有任何打印表明我的数据尚未保存。我加入后就什么都没有了。我读过 10 篇不同的帖子,但没有一个对我有帮助。请有人帮忙!

database roblox luau
1个回答
0
投票

假设您在工作室,您是否启用了工作室测试的 API 访问权限? 如果没有,您将无法访问实际发布的游戏使用的数据存储。

当我阅读我们的脚本时,我发现您使用了带有两个参数的 GetAsync,而只有一个参数。这很可能不会在玩家第一次加入时造成问题,因为它将返回 nil,但玩家第二次加入时,因为此时已填充,可能会导致随机的不需要的行为。

我建议您还将玩家的用户 ID 分配给本地变量,因为当脚本仍在运行时,玩家将被取消引用并返回 nil,这很可能会导致您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.