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 也可以双向工作。
例如,这些脚本会工作、挂起还是可能出错?
(在脚本中)
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 也可以双向工作。