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

Roblox开发:玩家死亡后同名重复工具仅存1个问题修复

Roblox开发:玩家重生后背包同名重复工具丢失修复

问题表现

  • 预期目标:玩家死亡重生后,背包内所有工具(包含同名重复工具)全部正常留存
  • 实际异常:当玩家持有多件同名工具(例如3把"Gun 1")时,重生后背包仅保留1件该名称工具,其余重复工具全部丢失

问题根因

原代码存在两个核心问题:

  1. 恢复工具时使用Plr['Backpack'][v.Name]按名称直接索引子对象,Roblox中如果父级下存在多个同名子实例,这种索引方式只会返回第一个匹配项,导致每次恢复同名工具时,都会误删之前已经放入背包的同名工具,最终仅保留最后一次放入的单件工具。
  2. 每次角色触发Spawned逻辑时都会重复给Humanoid.Died绑定事件,没有做旧连接断开处理,会导致事件重复触发、内存泄漏。

原问题代码

local Inventory = {}

local function Spawned(Char)
    local Plr = game.Players:GetPlayerFromCharacter(Char)
    for i,v in pairs(Inventory[Plr]) do
        if Plr['Backpack']:findFirstChild(v.Name) then
            Plr['Backpack'][v.Name]:Destroy()
        end
        v.Parent = Plr['Backpack']  
    end
    Inventory[Plr] = {}
    Char:WaitForChild('Humanoid').Died:connect(function()
        for i,v in pairs({Plr['Backpack'], Char}) do
            for ii,vv in pairs(v:GetChildren()) do
                if vv:IsA('Tool') then
                    table.insert(Inventory[Plr], vv:Clone())
                    vv:Destroy()
                end
            end
        end
    end)
end

game.Players.PlayerAdded:connect(function(Plr)
    Inventory[Plr] = {}
    local Char = Plr.Character or Plr.CharacterAdded:wait()
    Spawned(Char)
    Plr.CharacterAdded:connect(Spawned)
end)

修复后代码

local Inventory = {}

local function Spawned(Char)
    local Plr = game.Players:GetPlayerFromCharacter(Char)
    if not Plr then return end

    -- 批量恢复所有暂存工具,不做同名判断删除
    for _, storedTool in ipairs(Inventory[Plr]) do
        storedTool.Parent = Plr.Backpack
    end
    table.clear(Inventory[Plr])

    local Humanoid = Char:WaitForChild("Humanoid")
    -- 断开旧的死亡事件连接,避免重复触发
    if Inventory[Plr].DiedConn then
        Inventory[Plr].DiedConn:Disconnect()
    end
    -- 绑定新的死亡事件,暂存所有工具
    Inventory[Plr].DiedConn = Humanoid.Died:Connect(function()
        for _, container in ipairs({Plr.Backpack, Char}) do
            for _, item in ipairs(container:GetChildren()) do
                if item:IsA("Tool") then
                    table.insert(Inventory[Plr], item:Clone())
                    item:Destroy()
                end
            end
        end
    end)
end

game.Players.PlayerAdded:Connect(function(Plr)
    Inventory[Plr] = {}
    Plr.CharacterAdded:Connect(Spawned)
    -- 处理玩家进服时已经存在角色的情况
    if Plr.Character then
        Spawned(Plr.Character)
    end
end)

修复点说明

  • 移除了恢复工具阶段按名称查找删除同名工具的错误逻辑,所有暂存的工具无论名称是否重复,都会直接放回玩家背包
  • 新增事件连接生命周期管理,每次绑定新的Died事件前先断开旧连接,避免事件重复执行、内存泄漏
  • 补充空值边界判断,避免玩家实例、角色实例不存在时触发脚本报错
  • 统一使用Luau推荐的Connect、ipairs等写法,替换旧的connect、wait等过时API

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:57:18