通常、エクスペリエンス内のコードは、実行中のサーバーまたはクライアントにのみ影響を与えることができますが、以下のような状況では、異なるサーバーが相互に通信することを望む場合があります:
- グローバルアナウンス — 「ユーザーが特別なアイテムを見つけた!」などのアナウンスを、すべてのエクスペリエンスサーバーに送信します。
- リアルタイムサーバーブラウザ — すべてのエクスペリエンスサーバーのリストとそれらに誰がいるか (毎分更新) をコンパイルし、最大 20 サーバーにリストを表示します。
MessagingService を使用して、エクスペリエンスでクロスサーバーメッセージングをサポートできます。テレポートプレイグランド サンプルエクスペリエンスを使用して、実装する前にクロスサーバーメッセージングがどのように機能するかを見ることもできます。最後に、外部ツールを使用してクロスサーバー通信を探索する方法は、ここ を参照してください。
クロスサーバーメッセージング設定
クロスサーバーメッセージを有効にするには、複数のサーバーからアクセス可能なカスタマイズされたメッセージチャネルの トピック を設定する必要があります。トピックを作成した後、ユーザーをトピックにサブスクライブしてメッセージを受信し、トピックにメッセージを公開することを有効にすることができます。
ユーザーを購読してメッセージを受信する
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() を使用して、特定のトピックと一致し、それにメッセージを公開します。たとえば、次のコードサンプルは、ユーザーが新しいサーバーに参加するときにすべてのユーザーに通知するために PublishAsync() を使用し、ユーザーの表示名を表す Player.Name と、実行中のエクスペリエンスサーバーインスタンスの唯一の識別子 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 .. " joined server with 'JobId' of " .. game.JobId
MessagingService:PublishAsync(MESSAGING_TOPIC, message)
end)
if not publishSuccess then
print(publishResult)
end
end)