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

Baldi's Basics类游戏听觉脚本GetChildren()调用报错原因排查

问题分析与解决

报错原因

第8行的attempted to index nil with GetChildren错误,本质是传入getHRP函数的参数c为nil。

导致c为nil的核心原因:

  • 代码中通过game.Players:FindFirstChild(p.Name, true).Character获取角色存在冗余且不安全:p本身就是遍历game.Players:GetPlayers()得到的Player对象,直接访问p.Character即可;但即使这样,Player的Character属性也可能为nil(比如玩家刚进入游戏时角色尚未加载完成,或者角色被销毁)。
  • 在调用getHRP(c)前没有先判断c是否有效,直接传入nil触发了后续的错误。

修复后的代码

local baldi = script.Parent
local neededConfig = require(game.ReplicatedStorage.modules.configs.tags)
local targ = baldi.Target
local crime = targ.Crime
local minDistance = 200

function getHRP(c: Model)
    -- 先检查传入的模型是否为nil,避免后续报错
    if not c then
        return nil
    end
    local t = c:GetChildren()

    for _, part in pairs(t) do
        if part:IsA("BasePart") and part.Name == "HumanoidRootPart" then
            return part
        end
    end

    return nil
end

function speedup(boostTime, briefSpeedup)
    baldi.Speed.Value += briefSpeedup

    task.delay(boostTime, function()
        baldi.Speed.Value -= briefSpeedup
    end)
end

function listen()
    local nearest = minDistance

    crime.Value = "baldi"

    for _, p in pairs(game.Players:GetPlayers()) do
        -- 直接通过Player对象获取Character,同时判断是否存在
        local c = p.Character
        -- 先判断角色是否存在,再调用getHRP
        if c then
            local hrp = getHRP(c)
            if hrp then
                local dist = (hrp.Position - baldi.HumanoidRootPart.Position).magnitude

                if dist <= nearest and c:HasTag(neededConfig.tags.sound) then
                    nearest = dist
                    targ.Value = p

                    if baldi.Wandering.Value ~= 0 then
                        speedup(15, 1.25)
                        baldi.Wandering.Value = 0

                        task.delay(30, function()
                            baldi.Wandering.Value = 1
                        end)
                    end
                end
            end
        end
    end
end

spawn(function()
    repeat
        task.wait()
        listen()
    until baldi == nil
end)

关键优化点

  • 在getHRP函数开头增加c的nil检查,从源头避免调用GetChildren()时的报错。
  • 简化角色获取逻辑:直接使用p.Character替代冗余的game.Players:FindFirstChild(p.Name, true).Character。
  • 在调用getHRP前先判断c是否有效,确保只有存在的角色才会传入函数处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:01:14