You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Roblox DataStore无法保存玩家数据问题求助

问题分析与代码修复

核心问题排查

  1. 数据加载打印的误解
    代码里只要数据请求成功(success为true)就会打印“Players data connected”,这是正常逻辑——success只代表请求DataStore的操作没出错,不代表有玩家数据。首次进入时PlayerData为nil,之后会自动分配默认数据,所以这个打印不是bug。

  2. 数据保存失败的关键错误

    • Studio环境判断语法错误:原代码RunService:IsStudio(function()写法完全错误,正确的判断方式是if RunService:IsStudio() then return end,错误语法会导致服务器关闭时的保存逻辑直接失效。
    • 重力值赋值时机错误:原代码在还没从会话数据加载重力值时,就把Gravity.Value(初始为0)赋值给了workspace.Gravity,应该放到Gravity.Value = sessionData[Player.UserId].Gravity之后。
    • GetAsync参数无效:DataBase:GetAsync(Player.UserId, sessionData[Player.UserId])的第二个参数是多余的,Roblox的GetAsync只需要传入玩家ID作为键名,不需要额外传默认值。

修复后的完整代码

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)

    -- 修正:官方推荐先创建实例再设置Parent,避免潜在问题
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = Player
    
    local FolderOfValues = Instance.new("Folder")
    FolderOfValues.Name = "FolderOfValues"
    FolderOfValues.Parent = leaderstats

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

    local Gravity = Instance.new("IntValue")
    Gravity.Name = "Gravity"
    Gravity.Parent = FolderOfValues

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

    repeat
        success, PlayerData = pcall(function()
            -- 移除无效的第二个参数
            return DataBase:GetAsync(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

    -- 先同步会话数据到UI,再处理世界重力
    Coins.Value = sessionData[Player.UserId].Coins
    Coins.Changed:Connect(function()
        sessionData[Player.UserId].Coins = Coins.Value
    end)

    Gravity.Value = sessionData[Player.UserId].Gravity
    workspace.Gravity = Gravity.Value
    Gravity.Changed:Connect(function()
        sessionData[Player.UserId].Gravity = Gravity.Value
        workspace.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 for " .. Player.Name)
        else
            warn("Failed to save data for " .. Player.Name)
        end
        -- 清理会话数据,避免内存泄漏
        sessionData[Player.UserId] = nil
    end
end

Players.PlayerRemoving:Connect(PlayerLeaving)

function ServerShutDown()
    print("Server Shutting down")
    -- 正确判断Studio环境,测试时跳过强制保存
    if RunService:IsStudio() then
        return
    end
    -- 批量保存所有玩家数据
    for _, Player in ipairs(Players:GetPlayers()) do
        task.spawn(PlayerLeaving, Player)
    end
end

game:BindToClose(ServerShutDown)

额外优化说明

  • 改用Roblox官方推荐的实例创建方式,先创建对象再设置父级,避免因实例初始化顺序导致的异常。
  • 重力值修改时同步更新游戏世界重力,保证数值一致性。
  • 保存数据后清理会话中的玩家数据,避免长期运行导致内存占用过高。
  • 保存提示添加玩家名称,方便调试时定位具体玩家的保存状态。

内容的提问来源于stack exchange,提问作者AronasRR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:24:50