Я работаю над системой инвентаризации, и теперь мне нужно сохранить ее, но при попытке сохранить она печатает это на выходе
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 для извлечения всей соответствующей информации из пользовательского интерфейса и передачи ее на сервер с помощью 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)
Удаленное событие не запускается, я дважды проверил, что удаленное событие находится в ReplicatedStorage, а сценарий сервера — в ServerScriptService, а LocalScript — в StarterPlayer.StarterCharacterScripts, а также проверил код. Любой код может выполняться после saveEvent:FireServer(invTable), например print("Test")
Хм, странно. Верен ли путь к RemoteEvent в сценарии вашего сервера? Вы можете проверить, есть ли ошибка в вашем локальном скрипте, создав простой инструмент, который также запускает событие, просто чтобы увидеть, получает ли скрипт какие-либо события.
Кроме того, дважды проверьте, нет ли ошибок в окне вывода.
Да, это правильно. (game.ReplicatedStorage.InventorySaving), и да, он находится в ServerScriptService, и да, он срабатывает, когда я нажимаю с помощью инструмента. И это работает, и никаких ошибок, связанных с Инвентаризацией, нет.
Последнее, что нужно проверить, иначе я не уверен, почему это событие не сработает. Правилен ли путь для определения RemoteEvent в локальном сценарии? Правильно ли он указывает на game.ReplicatedStorage.InventorySaving?
Неважно, вчера я сделал это: LocalScript запускает удаленное событие каждый раз, когда ребенок добавляется из фрейма инвентаря, затем запускает серверный скрипт, который клонирует инвентарь на стороне сервера, затем он сохраняется, как обычно, с помощью GetChildren()
Как закрыть этот вопрос?
Единственный способ закрыть его - либо принять ответ, либо удалить вопрос.
Таким образом, вы не можете получить доступ к PlayerGui игрока через сервер. PlayerGui реплицируется локально для каждого клиента, поэтому для взаимодействия с Player's Gui я бы рекомендовал использовать RemoteEvents. Используя удаленные события, вы отправляете сигнал клиенту, который затем может быть получен с помощью LocalScript. Затем в локальном сценарии вы можете запустить другое RemoteEvent обратно на сервер со списком всех элементов, которые затем можно установить на сервере SetAsync.
Итак, локальный скрипт, который обновляется каждый раз, когда добавляется ребенок, и запускает RemoteEvent на сервер?
Ага! Если у вас возникнут какие-либо проблемы, не стесняйтесь lmk.
Ладно попробую, открываю студию