"PlayerAdded" 脚本在玩家死亡后仍然有效。如何修复?

我试图创建这个脚本,其中我创建了一个 Loading Screen,它应该只工作一次,因为 PlayerAdded 函数是为此设计的。但是当玩家死亡时,Loading Screen 又会出现。问题出在哪里?

我使用了两种类型的 Player added。普通的 PlayerAdded 在只有一个玩家时不起作用,因为服务器刚刚启动并避免了玩家的脚本。第二种类型给我带来了这个问题。

function onPlayerAdded(Player)
    local PlayerGui = game.Players.LocalPlayer:WaitForChild("PlayerGui")
    PlayerGui:SetTopbarTransparency(0)
    local LoadingScreen = Player.PlayerGui.LoadingScreen
    ...
end

game.Players.PlayerAdded:Connect(onPlayerAdded)

for _, player in pairs(game.Players:GetPlayers()) do
    onPlayerAdded(player)
end
点赞
用户11748161
用户11748161

你可以使用 ReplicatedFirst:

game.Players.PlayerAdded:Connect(function(plr)
    game.ReplicatedFirst.LoadingScreen:Clone().Parent = plr.PlayerGui
end)

如果我犯了任何错误,非常抱歉,因为我已经有一段时间没有在 Roblox 中进行编程了,而且我正在使用手机。

2019-07-08 01:02:05
用户9922866
用户9922866

我设想的代码如下:

local players = game:GetService("Players")

-- 假设这个加载界面是脚本的子对象。
local gui = script:WaitForChild("LoadingGui")

local function onPlayerAdded(player)
    local playerGui = player:WaitForChild("PlayerGui")
    local clone = playerGui:FindFirstChild("LoadingGui")
    if (not clone) then
        clone = gui:Clone()
        clone.Parent = playerGui
    end
    return
end
players.PlayerAdded:Connect(onPlayerAdded)

onPlayerAdded 应该在每个客户端上只触发一次,所以以预期的方式,GUI 只会出现一次。而且,将这段代码放在 Script 中,而非 LocalScript 中,放在 ServerScriptStorage 里是个好注意点。

2019-07-08 02:12:03
用户13429318
用户13429318

主要问题似乎是本地脚本正在与玩家一起重新创建。我认为这是因为该脚本位于玩家的StarterGui或StarterCharacterScripts中。解决方法是将此脚本移动到StarterPlayerScripts或ReplicatedFirst中。

另一个问题是当任何玩家加入时,将触发PlayerAdded。这是在本地脚本上完成的,因此每当有其他人加入时,加载屏幕就会出现,这很可能不是想要的结果。应该完全删除PlayerAdded以修复此问题,无论如何当前玩家添加时脚本都将自动运行。由于这一点,循环也是不必要的。

2021-11-04 23:24:35