Сейчас я пытаюсь создать систему сообщений в Roblox. Сервер должен иметь возможность отправлять сообщение через RemoteEvent, а клиент должен иметь возможность принимать его, отображая сообщение в текстовом поле графического интерфейса.
Однако я не могу передать аргументы в onDisplayMessage() из displayMessageEvent. Когда я запускаю RemoteEvent, ничего не происходит.
На данный момент это серверный скрипт:
local displayMessageEvent = Instance.new("RemoteEvent")
displayMessageEvent.Name = "DisplayMessageEvent"
displayMessageEvent.Parent = ReplicatedStorage
displayMessageEvent:FireAllClients("Hello, World!")
А это клиентский скрипт:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local displayMessageEvent = ReplicatedStorage:WaitForChild("DisplayMessageEvent")
local function onDisplayMessage(message)
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local screenGui = playerGui:WaitForChild("ScreenGui")
local textLabel = screenGui:WaitForChild("TextLabel")
textLabel.Text = message
end
displayMessageEvent.OnClientEvent:Connect(onDisplayMessage())
Я попытался заменить последнюю строку следующей, с аналогичными результатами:
displayMessageEvent.OnClientEvent:Connect(onDisplayMessage(displayMessageEvent.event))
Как я могу заставить клиента правильно обрабатывать RemoteEvent?
Вы намного ближе, чем вы думаете! Все сводится к очень тонкой ошибке в вашей последней строке, которая вместо этого должна читаться:
displayMessageEvent.OnClientEvent:Connect(onDisplayMessage)
Обратите внимание, что я удалил внутреннюю пару круглых скобок после onDisplayMessage
. Если вы внесете это одно изменение, ваш скрипт должен работать как положено.
Ваша первоначальная интуиция оказалась верной. Когда вы привязываете функцию к событию с помощью Connect
, вам не нужно много работать с аргументами. Просто вызовите FireAllClients
с тем же количеством аргументов, которое ожидает ваша подключенная функция. Другими словами, если вы правильно связали функцию с событием, ваш код делает именно то, что вы от него хотели.
Проблема в том, как вы подключаете свою функцию к событию. Connect
ожидает функцию (также известную в этом контексте как обратный вызов), но на самом деле вы ее не передаете, поскольку onDisplayMessage()
не является функцией. Точнее, есть разница между onDisplayMessage
и onDisplayMessage()
: первое — это функция, а второе — вызов функции.
Итак, когда Роблокс видит эту строку:
displayMessageEvent.OnClientEvent:Connect(onDisplayMessage())
Он не думает привязывать функцию onDisplayMessage
к событию. Вместо этого он вызывает onDisplayMessage
без аргументов, а затем привязывает возвращаемое значение к событию.1
Удаление круглых скобок гарантирует, что вы привязываете саму функцию, а не вызываете функцию и привязываете возвращаемое ею значение.
1 Вероятно, это выдает тихую ошибку, поскольку вы вызываете функцию с неверным количеством аргументов, но я, честно говоря, не знаю.