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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:45:36