【Roblox】MessagingService 異なるサーバー間でのデータの送受信について
はじめに
今回はMessagingServiceを使用して、異なるサーバー間での送受信機能の実装について紹介します。
なお、ここで言う「サーバー」は同一エクスペリエンス内のゲームサーバーのことです。
スクリプトを配置するServerScriptServiceなどの「サーバー」とは別物なのでご注意ください。
Robloxバージョン:0.638.1.6380615
やり取りを行うデータの制限
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の方が簡易に実装できますし、制限も結構緩いので使用しやすいと思います。
ぜひ、サーバ間のやり取りをする際は使用してみてください!!
参考
当社ではRobloxを活用したゲームの開発、 また企業の商品やサービスの認知度拡大に寄与する3Dワールドの制作など、 Robloxにおける様々な活用支援を行っております。 Robloxのコンテンツ開発をご検討されている企業様は、お気軽にご相談ください。 landho.co.jp/
Discussion