尝试用“Touched”索引 nil?

时间:2021-01-09 22:10:00

标签: lua roblox

这是交易,我正在将传送系统与 Roblox Studio 上的工具结合起来。然而,这个错误让我很难过。我将在下面提供代码和其他有用的资源,并在之后描述问题。

local tool = script.Parent.Parent

local debounce = false
local afterTeleport = false

local plrName = game.Players.LocalPlayer.Name
local char = workspace:FindFirstChild(plrName)

tool.Activated:connect(function(m)
    if debounce == false then
        local hum = game.Players.LocalPlayer.Character.Humanoid
        local anim_feet = hum:LoadAnimation(script.Parent.Animation)
        local current = anim_feet
    
        local bodyVelocity = tool.Handle.LocalScript.BodyVelocity:Clone()
    
        debounce = true
    
        current:Play()
        wait(1.1)
        local gui = script.Parent.TransitionGui:Clone()
    
        -- Properties for UI
        gui.Parent = game.Players.LocalPlayer.PlayerGui
    
        -- Transition
        gui.Frame.BackgroundTransparency = 1
        wait(0.02)
        gui.Frame.BackgroundTransparency = 0.8
        wait(0.02)
        gui.Frame.BackgroundTransparency = 0.6
        wait(0.02)
        gui.Frame.BackgroundTransparency = 0.4
        wait(0.02)
        gui.Frame.BackgroundTransparency = 0.2
        wait(0.02)
        gui.Frame.BackgroundTransparency = 0
    
        -- Teleport Player Into Sky Above Them
        hum.Parent.HumanoidRootPart.CFrame = 
        CFrame.new(Vector3.new(hum.Parent.HumanoidRootPart.CFrame.X, hum.Parent.HumanoidRootPart.CFrame.Y + 700, hum.Parent.HumanoidRootPart.CFrame.Z))
        bodyVelocity.Parent = hum.Parent.HumanoidRootPart
        afterTeleport = true
        wait(0.02)
        gui.Frame.BackgroundTransparency = 0.2
        wait(0.02)
        gui.Frame.BackgroundTransparency = 0.4
        wait(0.02)
        gui.Frame.BackgroundTransparency = 0.6
        wait(0.02)
        gui.Frame.BackgroundTransparency = 0.8
        wait(0.02)
        gui.Frame.BackgroundTransparency = 1
        wait(0.02)
    
    end
end)

char.Touched:Connect(function(interact)
    local hum = game.Players.LocalPlayer.Character.Humanoid

    if afterTeleport == true then
        if interact:IsA("Terrain") then
            if hum.Parent.HumanoidRootPart:FindFirstChild("BodyVelocity") then
                hum.Parent.HumanoidRootPart.BodyVelocity:Destroy()
            end
        elseif interact:IsA("Part") then
            if hum.Parent.HumanoidRootPart:FindFirstChild("BodyVelocity") then
                hum.Parent.HumanoidRootPart.BodyVelocity:Destroy()
            end
        elseif interact:IsA("MeshPart") then
            if hum.Parent.HumanoidRootPart:FindFirstChild("BodyVelocity") then
                hum.Parent.HumanoidRootPart.BodyVelocity:Destroy()
            end
        end
    end
end)

对我来说,这看起来是正确的。但问题是每当我对代码进行测试时,输出都会显示一个我不明白的错误。输出错误为:

16:35:59.453  Players.BigBetterBuilder.Backpack.Sky Port.Handle.LocalScript:58: attempt to index nil with 'Touched' 

我对这个工具的目标是,当它被激活时,它会将你传送到玩家当前位置上方 700 个螺柱的天空。它将向玩家的 HumanoidRootPart 添加一个 BodyVelocity,导致玩家减慢体面的速度,并在玩家接触地面时。它应该移除 BodyVelocity,让玩家可以在没有奇怪重力的情况下四处游荡。

但是应该检测玩家何时触地的功能不起作用。不幸的是,我似乎无法解决问题。

1 个答案:

答案 0 :(得分:2)

您的代码存在计时问题。在脚本的顶部,您尝试访问玩家的角色模型,但是当此脚本运行时,该角色可能尚未加载到工作区中。因此,当您调用 char.Touched:Connect(...) 时,它会抛出错误,因为 char 为空。

但是您也遇到了不同的问题。玩家的角色是一个模型,而模型没有像 Parts 那样的 Touched 事件。因此,为了使用 Touched 事件,您需要将其附加到角色可能触摸的平台上,或者附加到角色模型内的部件上。

因此,尝试将 char.Touched 连接移动到一个回调中,该回调在玩家和角色正确加载到游戏中后触发,并将 Touched 连接附加到角色模型中的不同部分:

local player = game.Players.LocalPlayer
player.CharacterAdded:Connect(function(character)

    -- create a helper function for checking if we're touching the ground
    local function checkTouchedGround(interact)
        if not afterTeleport then
            return
        end

        local shouldRemoveVelocity = false
        if interact:IsA("Terrain") then
            shouldRemoveVelocity = true
        elseif interact:IsA("Part") then
            shouldRemoveVelocity = true
        elseif interact:IsA("MeshPart") then
            shouldRemoveVelocity = true
        end

        if shouldRemoveVelocity then
            local bv = character.HumanoidRootPart:FindFirstChild("BodyVelocity", 0.1)
            if bv then
                bv:Destroy()
            end
        end
    end

    -- listen for any time any player parts touch the ground
    for _, child in ipairs(character:GetDescendants()) do
        if child:isA("BasePart") then
            child.Touched:Connect(checkTouchedGround)
        end
     end
end)