通过 Roblox 中的 RemoteEvent 传递参数

问题描述 投票:0回答:1

我目前正在尝试在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))

但它就是不起作用。

lua roblox roblox-studio
1个回答
0
投票

简短回答

你们比你想象的要近得多!这归结为最后一行中的一个非常微妙的错误,应该改为:

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 这可能会引发一个安静的错误,因为您使用错误数量的参数调用该函数,但老实说我不知道。

© www.soinside.com 2019 - 2024. All rights reserved.