roblox-textchat-channels について
roblox-textchat-channelsは、TextChatServiceを使ってRobloxゲームにカスタムチャットチャンネルとサーバー間メッセージ配信を実装するためのスキルガイドです。チャンネルタブ、プレイヤーの参加、イベントフィードやチャット中継を設定する開発者向けです。
主な機能
- 01チャンネルタブの設定
- 02TextChannelの作成とメンバー追加
- 03クライアント側のシステムメッセージ表示
- 04サーバー間のイベント中継
- 05サーバー間のプレイヤーチャット中継
- 06MessagingService呼び出しの保護
活用シーン
- 01ゲーム内に個別のチャットタブを設定
- 02チャンネルにゲームイベントを表示
- 03複数サーバーへレアドロップ通知を配信
- 04ゲームサーバー間でチャットを中継
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ flatbedj/ roblox-skills --skill roblox-textchat-channelsインストール後、Claude Code で/roblox-textchat-channelsを入力して読み込まれたか確認します。
詳細
Roblox のカスタムチャット:チャンネル、タブ、サーバー間通信
最新のゲームでは TextChatService(ChatVersion = TextChatService)を使用します。切り替え可能な実際のチャンネルタブと、サーバー間配信を実現する方法を紹介します。中でも、見落としやすい点を中心に説明します。
2 つのチャンネルをタブとして表示する(デフォルトではオフになっている重要な設定)
最新のデフォルトチャットでは、チャンネルタブを有効にしない限り、すべての内容が 1 つのウィンドウにまとめられます。設定は 2 つあります。編集モードでプレイスのプロパティとして設定するのが最適です(実行時に設定するのでは遅すぎます。チャットサーバーが先に起動するため、デフォルトの接続設定が壊れる可能性があります)。
TextChatService.CreateDefaultTextChannels = false— デフォルトの RBXGeneral/System タブを削除し、必要なチャンネルだけを表示します。TextChatService.ChannelTabsConfiguration.Enabled = true— チャンネルをタブとして表示するためのスイッチです。ChannelTabsConfigurationは TextChatService の子として自動作成されます。有効にすると、カスタムTextChannelがそれぞれNameをラベルとするタブに自動的になります。チャンネルごとの設定は不要です。
⚠️ どちらもプレイスのプロパティなので、セッションをまたいで保持するにはプレイスの保存が必要です。フォールバックとして実行時に ChatService.start() でも設定してください。ただし、起動時に確実に反映されるのは編集モード/プレイスの値です。
チャンネルの作成(サーバー)
CreateDefaultTextChannels = false の場合、TextChannels コンテナーは自動作成されません。そのため、以下のようにします。
local container = TextChatService:FindFirstChild("TextChannels")
if not container then
local f = Instance.new("Folder"); f.Name = "TextChannels"; f.Parent = TextChatService; container = f
end
-- Tab order = CREATION order (there is NO reorder API — it's an open devforum feature request).
-- Create the channel you want leftmost FIRST.
local here = Instance.new("TextChannel"); here.Name = "Here"; here.Parent = container
local global = Instance.new("TextChannel"); global.Name = "Global"; global.Parent = container
プレイヤーがチャンネルを読んだり書き込んだりできるよう、参加時にすべてのチャンネルへ追加します:channel:AddUserAsync(player.UserId)(プレイヤーの TextSource が作成されます。pcall でエラーを処理してください。これは yield するため、呼び出しは順番に実行されます)。
チャンネルへのメッセージ表示(クライアント)
textChannel:DisplaySystemMessage(richText) は、呼び出したクライアントのそのチャンネルのタブにのみメッセージを表示します。ゲームイベントのフィード(ガチャ結果、アナウンスなど)を特定のタブに表示する用途に使えます。RichText を使用できますが、プレイヤーが </font> タグを注入できないよう、ユーザー提供テキストを先にエスケープしてください(s:gsub("&","&"):gsub("<","<"):gsub(">",">"))。
MessagingService を使ったサーバー間通信(チャットまたはイベントフィード)
DisplaySystemMessage はローカルのみで、通常のチャンネル配信もサーバー内に限られます。サーバー間で配信するには、次のようにします。
- イベントフィード(例:すべてのサーバーにレアドロップを通知する): イベント発生時に、
payload.j = game.JobIdを設定してMessagingService:PublishAsync(TOPIC, payload)を呼び出します。すべてのサーバーでSubscribeAsync(TOPIC, ...)を呼び出します。data.j ~= game.JobId(別のサーバー)の場合は、RemoteEvent をローカルクライアントに送信し、クライアント側でDisplaySystemMessageを呼び出します。重複を避けるため、ローカル側のコピーはFireAllClientsですぐに送信し、サブスクライバーでは自身の JobId をスキップします。 - サーバー間のプレイヤーチャット: チャンネルの
ShouldDeliverCallback(サーバー上で受信者ごとに実行されます)を設定します。MessagingService:PublishAsyncを使ってメッセージを一度だけ中継し(message.MessageIdで重複を排除)、ローカルにも配信するためreturn trueを返します。他のサーバーはメッセージを受信し、クライアントにDisplaySystemMessageで表示します(ローカルではネイティブメッセージ、リモートではシステムメッセージとして表示されますが、許容できます)。 - MessagingService は必ず
pcallでエラーを処理してください。API アクセスが無効な場合(Studio)や、レート制限(トピックあたり毎分約 150 + 60×プレイヤー数メッセージ)に達した場合、エラーが発生します。その際、機能をクラッシュさせず、サーバー内のみで動作する状態にできます。
テスト時の注意点
- ソロの Studio ではサーバー間通信をテストできません(サーバーが 1 つしかないため)。MessagingService の送受信は自身にしか届きません。サーバー内の処理(チャンネルが存在すること、プレイヤーがメンバーであること、DisplaySystemMessage が表示されること)を確認し、サーバー間の処理を慎重に接続してください。
- Server データモデルから
Net.event("X"):FireAllClients(payload)でテストイベントを送信し、その後チャットをscreen_captureで撮影します(新しいメッセージがあるとウィンドウが表示されます)。書式と表示先のタブを確認してください。
教訓
チャットや UI について「プラットフォームでは X ができない」と判断する前に、create.roblox.com/docs と devforum を確認してください。最新のチャットは、見た目以上に高機能です(チャンネルタブ、グラデーション、設定などが利用できます)。ドキュメント:create.roblox.com/docs/chat/chat-window;devforum「Channel Tabs & UI Gradient Now Available in TextChatService」。