Roblox点击模拟器游戏数据保存报错:attempt to index nil with 'leaderstats'
问题分析
报错ServerScriptService.leaderstats:87: attempt to index nil with 'leaderstats'的核心原因有两个:
- 变量名混用:在
game:BindToClose的循环里,遍历的玩家变量是Player(大写),但后续访问player.leaderstats时用了小写的player,这个小写变量大概率是外部作用域的失效变量,已经变成nil。 - 未做存在性校验:没有判断玩家的
leaderstats实例是否存在就直接访问其子项,比如玩家刚加入服务器还没完成leaderstats初始化,服务器就触发关闭流程,此时leaderstats为nil。
修复方案
修改BindToClose的代码,统一变量名、增加存在性校验,并将所有可能出错的操作包裹在pcall中,避免单个保存失败导致整个流程中断:
game:BindToClose(function() -- 遍历所有在线玩家 for _, player in pairs(game.Players:GetPlayers()) do local playerUserId = "player"..player.UserId -- 先检查leaderstats是否存在 if not player:FindFirstChild("leaderstats") then continue -- 跳过没有leaderstats的玩家 end local leaderstats = player.leaderstats -- 保存Clicks数据 local success, errormessage = pcall(function() local clicksValue = leaderstats:FindFirstChild("Clicks") and leaderstats.Clicks.Value or 0 clicksDataStore:SetAsync(playerUserId, clicksValue) end) if not success then warn("保存Clicks失败: "..errormessage) end -- 保存Rebirths数据 local success, errormessage = pcall(function() local rebirthsValue = leaderstats:FindFirstChild("Rebirths") and leaderstats.Rebirths.Value or 0 rebirthsDataStore:SetAsync(playerUserId, rebirthsValue) end) if not success then warn("保存Rebirths失败: "..errormessage) end -- 保存Gems数据 local success, errormessage = pcall(function() local gemsValue = leaderstats:FindFirstChild("Gems") and leaderstats.Gems.Value or 0 gemsDataStore:SetAsync(playerUserId, gemsValue) end) if not success then warn("保存Gems失败: "..errormessage) end end end)
额外注意点:
game:BindToClose的回调函数没有参数,原代码里写的function(player)是错误的,会导致内部逻辑混乱。- 用
FindFirstChild替代直接点访问,避免因为子项不存在触发报错。 - 每个保存操作单独用
pcall包裹,并处理失败情况,方便排查问题。
内容的提问来源于stack exchange,提问作者Stykoz
相关产品推荐
相关产品推荐

