我目前正在尝试在Roblox中制作一个消息系统,以便服务器可以像这样发送消息:
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 传递到 onDisplayMessage() 中,但我不确定如何获取它。
我尝试做类似的事情:
displayMessageEvent.OnClientEvent:Connect(onDisplayMessage(displayMessageEvent.event))
但它就是不起作用。
你们比你想象的要近得多!这归结为最后一行中的一个非常微妙的错误,应该改为:
displayMessageEvent.OnClientEvent:Connect(onDisplayMessage)
请注意,我删除了
onDisplayMessage
后面的一对括号。如果您进行这一更改,您的脚本应该按预期工作。
你最初的直觉是正确的。当您使用
Connect
将函数绑定到事件时,您无需过多处理参数。只需使用连接函数期望的相同数量的参数调用 FireAllClients
即可。换句话说,假设您将函数正确连接到事件,您的代码将完全按照您的意愿执行。
问题在于如何将函数连接到事件。
Connect
需要一个函数作为参数,但实际上你并没有给它一个函数,因为 onDisplayMessage()
不是一个函数。更具体地说,onDisplayMessage
和 onDisplayMessage()
之间存在区别 - 第一个是函数,第二个是函数 call。
让我们用一个更简单的例子。假设您有一个名为
foo
的函数,它不带参数并返回数字 1。现在考虑这两行:
x = foo
y = foo()
在第一种情况下,
x
的值为foo
- 也就是说,它将引用函数本身。在第二种情况下,y
的值为 1,因为 Luau 看到空括号并意识到它不应该只使用 foo
,而应该不带参数调用 foo
,然后使用其返回值。
所以当 Roblox 看到这一行时:
displayMessageEvent.OnClientEvent:Connect(onDisplayMessage())
它不认为将函数
onDisplayMessage
绑定到事件。相反,它不带参数调用 onDisplayMessage
,然后将其返回值绑定到事件。1
删除括号可确保您绑定函数本身,而不是调用函数并绑定它返回的值。
1 这可能会引发一个安静的错误,因为您使用错误数量的参数调用该函数,但老实说我不知道。