💬

【Roblox】MessagingService 異なるサーバー間でのデータの送受信について

2024/11/18に公開

はじめに

今回はMessagingServiceを使用して、異なるサーバー間での送受信機能の実装について紹介します。

なお、ここで言う「サーバー」は同一エクスペリエンス内のゲームサーバーのことです。
スクリプトを配置するServerScriptServiceなどの「サーバー」とは別物なのでご注意ください。

Robloxバージョン:0.638.1.6380615

やり取りを行うデータの制限

MessagingServiceを使用することで、エクスペリエンス内のサーバーに通知を送信・受信することができます。
これを用いることで、同じゲーム内の異なるサーバーで遊んでいるユーザー同士の同期やランキングの更新なども行えます。

通信を挟むことになるので、下記のような制限があります。

公式リファレンス
https://create.roblox.com/docs/reference/engine/classes/MessagingService

制限 最大
メッセージのサイズ 1KB
ゲームサーバーごとに送信されたメッセージ 600 + 240 * (このゲームサーバーのプレイヤー数) / 分
トピックごとに受信したメッセージ (40 + 80 * サーバー数) / 分
ゲーム全体で受信したメッセージ (400 + 200 * サーバー数) / 分
ゲームサーバーごとに許可されるサブスクリプション 20 + 8 * (このゲームサーバーのプレイヤー数)
ゲームサーバーごとのサブスクライブリクエスト 1分あたり240リクエスト

使用例

MessagingServiceを使用してメッセージの送受信をする例を紹介します。

メッセージ受信

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退出時にイベント登録解除
        player.AncestryChanged:Connect(function()
            subscribeConnection:Disconnect()
        end)
    end
end)

MessagingService:SubscribeAsync(topic, callback)でメッセージの受信を設定します。

MessagingService:SubscribeAsync()の引数
topic - メッセージを識別する文字列
callback - メッセージ受信時に呼ばれるメソッド

callbackの引数は下記テーブル型が渡されます。

Data - 渡されたメッセージ。
Sent - 送信された時間(秒単位のUnixTime)。

送信時に指定しされたtopicに対してメッセージを受け取る仕組みです。

メッセージ送信

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)

MessagingService:PublishAsync(topic, message)でメッセージを送信することができます。

MessagingService:SubscribeAsync()の引数
topic - メッセージを識別する文字列
message - 送信したいデータ

このmessageは前述した制限に反しなければ、テーブル型も送信できます。
工夫をすれば簡単なマッチング機能なども作成できるでしょう。

確認

今回は、他のプレイヤーの別のプレースへの移動が完了した際に、移動先のプレースから通知を飛ばす処理を作成してみました。

受信したUnixTimeを時間に変換して、メッセージと一緒にチャットに表示して確認しています。


無事に通知が届いている!

まとめ

  • 同じゲーム内の別サーバーとのやり取りはMessagingServiceを使用すると行える。
  • MessagingService:SubscribeAsync(topic, callback)で通知の受け取りを行う。
  • MessagingService:PublishAsync(topic, message)で通知を送信する。

他の方法として、サーバー間のやり取りはOpenAPIを使用したりHttpServiceを使用することで実現できます。
しかし、MessagingServiceの方が簡易に実装できますし、制限も結構緩いので使用しやすいと思います。

ぜひ、サーバ間のやり取りをする際は使用してみてください!!

参考

https://create.roblox.com/docs/cloud-services/cross-server-messaging
https://create.roblox.com/docs/reference/engine/classes/MessagingService

ランド・ホー Roblox開発チーム

Discussion