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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:35:08