这个脚本如何知道 'currentPlayer' 是谁?

How does this script know who 'currentPlayer' is?

我是 Roblox 开发的新手,但想尝试制作一款小行星游戏。我从为宇宙飞船创建座位开始,但我认识到一些我无法解释的行为,希望有人能提供一些说明。

这是我正在谈论的代码,只是一些非常基础的代码,因此我可以掌握一些初步想法:

--Services--
local Players = game:GetService("Players")

--Local Variables--
local seat = script.Parent                          -- Refers to the VehicleSeat object
local currentPlayer = nil                           -- Prevents errors in reference to nil?
local prompt = script.Parent.GetInPrompt            -- Get the parent object's proximity prompt

--Proximity Prompt Trigger Code--
prompt.Triggered:Connect(function(currentPlayer) -- Bind the prompt trigger to function
    local char = currentPlayer.Character            -- Get the currentPlayer
    seat:Sit(char.Humanoid)                     -- Make them sit
    prompt.Enabled = false                          -- Disable the prompt so it isn't visible
    print("Character is sitting")                   -- Print to console for debug
end)

--Get up function--
local function gettingUp(currentPlayer)
    print("Attribute Change Fired - Getting Up")    -- Print to console for debug
    prompt.Enabled = true
end

-- Note that since Lua is an interpreted language any function must be defined before use--
seat.ChildRemoved:Connect(function()
    gettingUp(currentPlayer)
end)

我看到我在顶部访问了“Players”服务,并将 currentPlayer 变量初始化为 nil。我不明白当 proximityPrompt 触发时 currentPlayer 如何从 nil 变为 player。

我认为它可能是 Roblox 中的 'reserved name',但我在网上找不到任何证据。

您的脚本混淆了局部变量和函数参数。

在脚本的顶部,您定义了局部变量 currentPlayerProximityPrompt.Triggered signal provides the instance of the Player 将其激活为函数参数。您还将该参数命名为 currentPlayer。当在此函数的范围内时,函数参数隐藏局部变量,这意味着 currentPlayer 引用此函数参数,而不是您在脚本顶部定义的局部变量。

为避免这种混淆,最好将函数参数和局部变量命名为不同的东西。

如果您希望 currentPlayer 引用与 ProximityPrompt 交互的玩家,请尝试将函数参数分配给局部变量:

prompt.Triggered:Connect(function(player)
    currentPlayer = player
    local char = currentPlayer.Character
    seat:Sit(char.Humanoid)
    prompt.Enabled = false
    print("Character is sitting")
end)

这将允许您以后的函数保留对 Player 对象的引用。