Roblox脚本问题:TimeSurvived仅单人生效且计时间隔异常
Roblox 存活时长计时脚本修复方案
问题原因
- 仅单玩家生效:原脚本中
money是全局变量,新玩家加入时会覆盖之前的引用,最终只有最后加入的玩家数值会被修改。 - 计时间隔随机:传送器的
Touched事件会被玩家模型的多个部件重复触发,每次触发都会启动独立循环,多个循环同时修改数值导致计数速度混乱。
修复后代码
-- 存储正在计时的玩家,避免重复触发循环 local activePlayers = {} game.Players.PlayerAdded:Connect(function(plr) -- 创建leaderstats文件夹(使用局部变量避免全局污染) local leaderstats = Instance.new("Folder") leaderstats.Name = "leaderstats" leaderstats.Parent = plr -- 创建TimeSurvived数值对象 local timeSurvived = Instance.new("IntValue") timeSurvived.Name = "TimeSurvived" timeSurvived.Value = 0 timeSurvived.Parent = leaderstats -- 玩家离开时清除活跃标记 plr.PlayerRemoving:Connect(function() activePlayers[plr] = nil end) end) script.Parent.Touched:Connect(function(hit) -- 从触碰部件找到对应的人形角色 local humanoid = hit.Parent:FindFirstChildOfClass("Humanoid") if not humanoid then return end -- 从人形角色获取对应的玩家 local plr = game.Players:GetPlayerFromCharacter(humanoid.Parent) if not plr or activePlayers[plr] then return end -- 标记玩家进入计时状态 activePlayers[plr] = true local timeSurvived = plr.leaderstats.TimeSurvived -- 启动计时循环 while activePlayers[plr] and plr:IsDescendantOf(game.Players) do timeSurvived.Value += 1 task.wait(1) -- 使用task.wait替代wait,计时更稳定 end -- 循环结束后清除活跃标记 activePlayers[plr] = nil end)
关键改动说明
- 使用
activePlayers表记录正在计时的玩家,防止同一个玩家触发多个计时循环,彻底解决间隔混乱问题。 - 所有变量改为局部变量,避免全局覆盖,确保每个玩家的计时数据独立。
- 通过
Humanoid和GetPlayerFromCharacter准确关联触碰传送器的玩家,保证计时对象正确。 - 玩家离开游戏时自动清除活跃标记,避免内存泄漏。
内容的提问来源于stack exchange,提问作者WJDBOOMER
相关产品推荐
相关产品推荐

