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
相关产品推荐
相关产品推荐

