Как получить PlayerGUI из серверного скрипта?

Я работаю над системой инвентаризации, и теперь мне нужно сохранить ее, но при попытке сохранить она печатает это на выходе

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)
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Хотя вы правильно обращаетесь к пути к 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)

Ладно попробую, открываю студию

ridhomblr 12.05.2022 12:36

Удаленное событие не запускается, я дважды проверил, что удаленное событие находится в ReplicatedStorage, а сценарий сервера — в ServerScriptService, а LocalScript — в StarterPlayer.StarterCharacterScripts, а также проверил код. Любой код может выполняться после saveEvent:FireServer(invTable), например print("Test")

ridhomblr 12.05.2022 13:39

Хм, странно. Верен ли путь к RemoteEvent в сценарии вашего сервера? Вы можете проверить, есть ли ошибка в вашем локальном скрипте, создав простой инструмент, который также запускает событие, просто чтобы увидеть, получает ли скрипт какие-либо события.

Kylaaa 12.05.2022 13:49

Кроме того, дважды проверьте, нет ли ошибок в окне вывода.

Kylaaa 12.05.2022 13:52

Да, это правильно. (game.ReplicatedStorage.InventorySaving), и да, он находится в ServerScriptService, и да, он срабатывает, когда я нажимаю с помощью инструмента. И это работает, и никаких ошибок, связанных с Инвентаризацией, нет.

ridhomblr 12.05.2022 15:52

Последнее, что нужно проверить, иначе я не уверен, почему это событие не сработает. Правилен ли путь для определения RemoteEvent в локальном сценарии? Правильно ли он указывает на game.ReplicatedStorage.InventorySaving?

Kylaaa 13.05.2022 16:40

Неважно, вчера я сделал это: LocalScript запускает удаленное событие каждый раз, когда ребенок добавляется из фрейма инвентаря, затем запускает серверный скрипт, который клонирует инвентарь на стороне сервера, затем он сохраняется, как обычно, с помощью GetChildren()

ridhomblr 15.05.2022 05:43

Как закрыть этот вопрос?

ridhomblr 15.05.2022 05:44

Единственный способ закрыть его - либо принять ответ, либо удалить вопрос.

Kylaaa 15.05.2022 13:27

Таким образом, вы не можете получить доступ к PlayerGui игрока через сервер. PlayerGui реплицируется локально для каждого клиента, поэтому для взаимодействия с Player's Gui я бы рекомендовал использовать RemoteEvents. Используя удаленные события, вы отправляете сигнал клиенту, который затем может быть получен с помощью LocalScript. Затем в локальном сценарии вы можете запустить другое RemoteEvent обратно на сервер со списком всех элементов, которые затем можно установить на сервере SetAsync.

Итак, локальный скрипт, который обновляется каждый раз, когда добавляется ребенок, и запускает RemoteEvent на сервер?

ridhomblr 12.05.2022 12:02

Ага! Если у вас возникнут какие-либо проблемы, не стесняйтесь lmk.

YellowBannanaRBX 12.05.2022 13:52

Другие вопросы по теме