如何从服务器脚本获取 PlayerGUI?

How to get PlayerGUI from a Server Script?

我正在开发一个库存系统,现在我需要保存它,但是在尝试保存它时会在输出中打印出来

PlayerGui 不是 Player“Players.RidhoMBLR”的有效成员

local function save(player)
    local invTable = {}

    for i, v in pairs(player.PlayerGui.ScreenGui.Inventory.InvFrame:GetChildren()) do
        if v:IsA("TextButton") then
            table.insert(invTable, v)
        end
    end

   dataStore:SetAsync(player.UserId, invTable)
end

players.PlayerRemoving:Connect(save)

当您正确访问 PlayerGui 的路径时,它可能不会复制到服务器(即,它的存在只能在 LocalScripts 的客户端上观察到)。

因此您可能需要使用 LocalScript 从 UI 中提取所有相关信息,并使用 RemoteEvent 将其传送到服务器。所以将您的代码移动到 LocalScript :

local players = game.Players
local saveEvent = game.ReplicatedStorage.RemoteEvent -- find your RemoteEvent here

local function save(player)
    -- only tell the server about it if we are the one leaving
    if player ~= players.LocalPlayer then
        return
    end

    -- get information about the inventory
    local inventory = player.PlayerGui.ScreenGui.Inventory.InvFrame:GetChildren()
    local invTable = {}
    for i, v in ipairs(intentory) do
        if v:IsA("TextButton") then
            -- grab the text out of each button
            table.insert(invTable, v.Text)
        end
    end

   -- tell the server about our inventory
   saveEvent:FireServer(invTable)
end

players.PlayerRemoving:Connect(save)

然后在服务器脚本中,监听客户端何时触发事件并保存数据:

local saveEvent = game.ReplicatedStorage.RemoteEvent -- find that same RemoteEvent

-- listen for when players report that they are leaving
saveEvent.OnServerEvent:Connect(function(player, inventoryTable)
    -- save their information
    dataStore:SetAsync(player.UserId, inventoryTable)
end)

所以基本上你不能通过服务器访问玩家的PlayerGui。 PlayerGui 为每个客户端在本地复制,因此为了与玩家的 Gui 交互,我建议使用 RemoteEvents。通过使用远程事件,您将向客户端发送一个信号,然后该信号可以被 LocalScript 接收。然后,在本地脚本上,您可以将另一个 RemoteEvent 触发回服务器,其中包含所有项目的列表,然后您可以在服务器上设置异步。