通常,游戏中的代码只能影响正在运行的服务器或客户端,但可能会有一些情况需要不同的服务器进行通信,包括:
- 全球公告 — 向所有游戏服务器发送公告,例如“用户发现了一件特殊物品!”
- 实时服务器浏览器 — 汇编所有游戏服务器及其在线玩家的列表(每分钟更新一次),并在最多 20 台服务器上显示该列表。
您可以使用 MessagingService 来支持游戏中的跨服务器消息传递。您还可以使用 Teleportation Playground 示例游戏查看跨服务器消息传递的工作原理,然后再进行实现。最后,请参阅 此处 以探索使用外部工具进行跨服务器通信。
跨服务器消息传递设置
要启用跨服务器消息传递,您必须设置一个 主题,这是一个可从多个服务器访问的自定义消息通道。创建主题后,您可以 订阅用户 该主题以接收消息,并启用 发布消息 到该主题。
订阅用户以接收消息
使用 MessagingService:SubscribeAsync() 订阅用户到主题,并指定一个回调函数以检测发布到该主题的消息。例如,以下代码示例将所有用户订阅到 FriendServerEvent 主题,当任何用户被传送到不同服务器时接收消息。
local MessagingService = game:GetService("MessagingService")
local Players = game:GetService("Players")
local MESSAGING_TOPIC = "FriendServerEvent"
Players.PlayerAdded:Connect(function(player)
-- 订阅主题
local subscribeSuccess, subscribeConnection = pcall(function()
return MessagingService:SubscribeAsync(MESSAGING_TOPIC, function(message)
print(message.Data)
end)
end)
if subscribeSuccess then
-- 当玩家的家族关系更改时取消订阅主题
player.AncestryChanged:Connect(function()
subscribeConnection:Disconnect()
end)
end
end)
发布消息
使用 MessagingService:PublishAsync() 匹配特定主题并向其发布消息。例如,以下代码示例使用 MessagingService:PublishAsync() 通知所有用户当用户加入新服务器时的消息,包括 Player.Name 表示用户的显示名称和 DataModel.JobId,这是正在运行的游戏服务器实例的唯一标识符。
local MessagingService = game:GetService("MessagingService")
local Players = game:GetService("Players")
local MESSAGING_TOPIC = "FriendServerEvent"
Players.PlayerAdded:Connect(function(player)
-- 发布到主题
local publishSuccess, publishResult = pcall(function()
local message = player.Name .. " 加入了 JobId 为 " .. game.JobId .. " 的服务器"
MessagingService:PublishAsync(MESSAGING_TOPIC, message)
end)
if not publishSuccess then
print(publishResult)
end
end)