Lua脚本报错:尝试用'Destroy'索引nil值,请求排查解决
解决 "attempt to index nil with 'Destroy'" 报错及脚本逻辑优化
报错原因
你遇到的错误是因为FindFirstChild未找到目标对象(返回nil),却直接调用了Destroy()方法。比如代码里的game.Players.LocalPlayer.Character:FindFirstChild("Weight"):Destroy(),如果Character中不存在"Weight"对象,这条语句就会触发报错。
代码中的其他问题
- 错误引用
game.StarterPack.Weight.Equipped:StarterPack里的是装备模板,不是玩家当前实际使用的装备,无法通过它判断玩家是否装备了Weight。应该通过检查玩家Character中是否存在Weight对象来判断装备状态。 - 嵌套
if逻辑冗余:第二个if写在第一个if内部,它的条件game.StarterPack.Weight.Unequipped本身不成立,且和外层条件重复,实际不会被触发。
修正后的代码
local player = game.Players.LocalPlayer local backpack = player.Backpack local leaderstats = player.leaderstats local strength = leaderstats.Strength strength.Changed:Connect(function(newValue) -- 仅当Strength达到30时执行逻辑 if newValue >= 30 then -- 销毁Character中已装备的Weight(如果存在) local equippedWeight = player.Character:FindFirstChild("Weight") if equippedWeight then equippedWeight:Destroy() end -- 销毁背包中的Weight(如果存在) local backpackWeight = backpack:FindFirstChild("Weight") if backpackWeight then backpackWeight:Destroy() end -- 克隆DoubleWeight到背包 local doubleWeight = game.ReplicatedStorage.Tools.DoubleWeight:Clone() doubleWeight.Parent = backpack end end)
修正说明
- 缓存常用对象(player、backpack等),避免重复查找,提升性能同时简化代码。
- 每次调用
FindFirstChild后先判断对象是否存在,再调用Destroy(),彻底避免nil索引错误。 - 简化逻辑:只要Strength达到30,就移除所有Weight(不管装备状态),然后添加DoubleWeight,解决原逻辑中对StarterPack模板的错误引用问题。
- 利用Changed事件传入的
newValue参数,无需重复读取strength.Value。
内容的提问来源于stack exchange,提问作者johnrutoDEV
相关产品推荐
相关产品推荐

