如何从服务器脚本获取 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 触发回服务器,其中包含所有项目的列表,然后您可以在服务器上设置异步。
我正在开发一个库存系统,现在我需要保存它,但是在尝试保存它时会在输出中打印出来
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 触发回服务器,其中包含所有项目的列表,然后您可以在服务器上设置异步。