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

Roblox leaderstats数据保存报错:hours不是Folder有效成员求助

问题分析与修复

报错原因清晰明确:

  • 你创建的时长统计实例名称是**"Hours"**(首字母大写),但保存数据时用了小写的hours访问——Roblox实例名称严格区分大小写,因此找不到对应成员。
  • 睡眠代币的实例名称是**"Sleep Tokens"**(带空格),用.访问会被识别为两个独立标识符,必须用方括号["Sleep Tokens"]才能正确定位。

另外补充两个潜在问题的优化:

  1. 多次调用SetAsync易触发数据存储限流,建议合并为一次请求。
  2. 新玩家首次加载数据时,返回值为nil,直接赋值会报错,需设置默认值。

修复后的完整代码:

local DataStoreService = game:GetService("DataStoreService")
local DataStore = DataStoreService:GetDataStore("DataStore")

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

    local hours = Instance.new("IntValue")
    hours.Name = "Hours"
    hours.Value = 0
    hours.Parent = leaderstats

    local sleepTokens = Instance.new("IntValue")
    sleepTokens.Name = "Sleep Tokens"
    sleepTokens.Value = 0
    sleepTokens.Parent = leaderstats

    local success, errormessage = pcall(function()
        -- 合并获取数据,减少请求次数
        local savedData = DataStore:GetAsync(player.UserId)
        if savedData then
            hours.Value = savedData.Hours or 0
            sleepTokens.Value = savedData.SleepTokens or 0
        end
    end)

    if not success then
        print("加载玩家数据时出错")
        warn(errormessage)
    end
end)

game.Players.PlayerRemoving:Connect(function(player)
    local success, errormessage = pcall(function()
        -- 合并数据为一个表,一次完成保存
        local playerData = {
            Hours = player.leaderstats.Hours.Value,
            SleepTokens = player.leaderstats["Sleep Tokens"].Value
        }
        DataStore:SetAsync(player.UserId, playerData)
    end)

    if success then
        print("玩家数据已保存")
    else
        print("保存玩家数据时出错")
        warn(errormessage)
    end
end)

-- 新增服务器关闭时的保存逻辑,避免数据丢失
game:BindToClose(function()
    for _, player in ipairs(game.Players:GetPlayers()) do
        local success, errormessage = pcall(function()
            local playerData = {
                Hours = player.leaderstats.Hours.Value,
                SleepTokens = player.leaderstats["Sleep Tokens"].Value
            }
            DataStore:SetAsync(player.UserId, playerData)
        end)
        if not success then
            warn("服务器关闭时保存" .. player.Name .. "数据失败: " .. errormessage)
        end
    end
end)

关键修改点:

  • 访问时长实例时使用正确的大写名称player.leaderstats.Hours
  • 访问带空格的代币实例时改用player.leaderstats["Sleep Tokens"]
  • 合并数据存储请求,降低API限流风险
  • 新增新玩家默认值处理,避免nil赋值错误
  • 添加BindToClose逻辑,确保服务器关闭时所有玩家数据都能保存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:20:37