通常、ゲーム内のコードは実行されているサーバーまたはクライアントにのみ影響を与えることができますが、異なるサーバー間で通信を行いたい状況もあります。これには以下のようなケースが含まれます:
- グローバルアナウンスメント — "ユーザーが特別なアイテムを見つけました!" などのアナウンスをすべてのゲームサーバーに送信します。
- リアルタイムサーバーブラウザ — ゲームのすべてのサーバーとその中にいるユーザーのリストをコンパイルし(毎分更新)、最大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() を使用して特定のトピックに一致させてメッセージを公開します。次のコードサンプルでは、MessagingService: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 .. " は 'JobId' が " .. game.JobId .. " のサーバーに参加しました"
MessagingService:PublishAsync(MESSAGING_TOPIC, message)
end)
if not publishSuccess then
print(publishResult)
end
end)