RemoteEvents 可以是双向的吗?

Can RemoteEvents be two way?

例如,这些脚本会工作、挂起还是可能出错?

(在脚本中)

RemoteEvent = game:GetService("ReplicatedStorage"):WaitForChild("RemoteEvent")

RemoteEvent:FireClient()
RemoteEvent.onServerEvent:Wait()
print("Hello World")

(在 LocalScript 中)

RemoteEvent = game:GetService("ReplicatedStorage"):WaitForChild("RemoteEvent")

RemoteEvent.onClientEvent:Wait()
RemoteEvent:FireServer()

为了简单地回答您的问题,RemoteEvents 确实可以双向工作。从客户端到服务器可以使用与服务器到客户端相同的事件。

您的示例按原样可能会有一些时间问题。 服务器将启动,触发所有零客户端,然后等待客户端发回信号。 稍后某个时间,客户端将加入,然后等待服务器信号(已经发生)并卡住。

根据您想要的逻辑,您可以等待玩家加入游戏时执行代码:

-- server Script
local PlayerService = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RemoteEvent = ReplicatedStorage.RemoteEvent

PlayerService.PlayerAdded:Connect( function(player)
    -- Wait() will fire for any player that sends up the signal, so make sure that we know which player sent it
    -- instead, connect to the signal to make sure we're listening to the right player
    RemoteEvent.OnServerEvent:Connect( function(clientPlayer)
        if clientPlayer.Name == player.Name then

            print("Hello World", player.Name)

            -- pass some data from the server to the client
            RemoteEvent:FireClient( player, 1, 2, 3)
        end)
    end)
end)

然后在你的客户端...

-- LocalScript in PlayerScripts
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RemoteEvent = ReplicatedStorage.RemoteEvent

-- since there's no telling when this event will fire, tell the server that we've loaded!
RemoteEvent:FireServer()

-- wait for the server to respond and give us some data
local connection
connection = RemoteEvent.OnClientEvent:Connect( function(a, b, c)
    print("got data from server : ", a, b, c)

    -- disconnect so this event only fires once
    connection:Disconnect()
end)

我想补充 Kylaaa 的回答和对您的代码示例的回应,如果您打算等待来自客户端的响应,您还可以调用 RemoteFunction 而不是触发事件和等待事件回到你身边。像这样:

脚本:

game.Players.PlayerAdded:Connect(function(plr)
    local response = game.ReplicatedStorage.RemoteFunction:InvokeClient(plr, "Hello")
    print("Client said: " .. response)  
end)

本地脚本:

game.ReplicatedStorage.RemoteFunction.OnClientInvoke = function(text)
    print ("Server said: " .. text)
    return "Hi"
end

PS。 RemoteFunction 也可以双向工作。