Roblox开发:玩家死亡后同名重复工具仅存1个问题修复
Roblox开发:玩家重生后背包同名重复工具丢失修复
问题表现
- 预期目标:玩家死亡重生后,背包内所有工具(包含同名重复工具)全部正常留存
- 实际异常:当玩家持有多件同名工具(例如3把"Gun 1")时,重生后背包仅保留1件该名称工具,其余重复工具全部丢失
问题根因
原代码存在两个核心问题:
- 恢复工具时使用
Plr['Backpack'][v.Name]按名称直接索引子对象,Roblox中如果父级下存在多个同名子实例,这种索引方式只会返回第一个匹配项,导致每次恢复同名工具时,都会误删之前已经放入背包的同名工具,最终仅保留最后一次放入的单件工具。 - 每次角色触发
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
相关产品推荐
相关产品推荐

