Roblox生存积分系统报错:Attempt to index nil with 'WaitForChild' 求助
问题分析与修复方案
核心错误原因
- 奖励函数调用未传参:在
inlobby函数里调用givepoints()时没传入玩家对象,导致givepoints里的player参数为nil,直接触发「Attempt to index nil with 'WaitForChild'」报错。 - 重复绑定触碰事件:每次玩家触碰起始Part时,都会重新给
lobbypart绑定一次Touched事件,多次触碰后会触发多次奖励逻辑,造成混乱。 - 全局回合状态逻辑冲突:用全局变量
inround跟踪回合状态,多玩家场景下会出现逻辑混乱(比如一个玩家触发回合开始,另一个玩家碰大厅Part就直接结束所有人的回合)。
修复后的代码
local Players = game:GetService("Players") local part = script.Parent local lobbypart = workspace.LobbyPart -- 用字典存储每个玩家的回合状态,替代全局inround local playersInRound = {} local SurvivedPoints = 10 local function givepoints(player) -- 先判断leaderstats是否存在,避免报错 local playerstats = player:FindFirstChild("leaderstats") if not playerstats then warn(player.Name .. " 没有leaderstats,无法发放积分") return end local playerpoints = playerstats:FindFirstChild("Points") if not playerpoints then warn(player.Name .. " 的leaderstats里没有Points,无法发放积分") return end playerpoints.Value = playerpoints.Value + SurvivedPoints print(player.Name .. " 获得" .. SurvivedPoints .. "积分") end -- 单独处理大厅触碰逻辑,只绑定一次 local function onLobbyTouched(otherPart) local character = otherPart.Parent local player = Players:GetPlayerFromCharacter(character) -- 检查玩家存在且处于回合中 if player and playersInRound[player] then playersInRound[player] = false givepoints(player) print(player.Name .. " 结束回合,获得积分") end end local function onRoundStartTouched(otherPart) local character = otherPart.Parent local humanoid = character:FindFirstChild("Humanoid") if humanoid then local player = Players:GetPlayerFromCharacter(character) if player then playersInRound[player] = true print(player.Name .. " 进入回合") end end end -- 只绑定一次触碰事件,避免重复绑定 part.Touched:Connect(onRoundStartTouched) lobbypart.Touched:Connect(onLobbyTouched)
关键修改说明
- 用
playersInRound字典记录每个玩家的回合状态,解决多玩家场景下的逻辑冲突问题。 - 将大厅触碰事件的绑定移到外部,只执行一次,避免重复绑定导致的多次触发。
- 调用
givepoints时传入玩家对象,彻底解决参数nil的问题。 - 增加
FindFirstChild的判断和警告,让报错更清晰,避免程序崩溃。
内容的提问来源于stack exchange,提问作者idan1973
相关产品推荐
相关产品推荐

