Robloxは、テキストベースのメッセージングをライブセッション中のプレイヤー間で提供します。これは、チャットメッセージのフィルタリング、モデレーション、およびユーザー権限を管理するシングルトンクラスである TextChatService を通じて行われます。このサービスには標準の機能があり、カスタマイズされた要件に基づいてメッセージを配信したり、特定のプレイヤーに特別な権限やモデレーションを追加したり、特定のアクションを実行するためのカスタムコマンドを作成したりするためのメソッドやイベントのセットを提供します。
UIの設定
TextChatService は、ゲームのニーズに合わせてカスタマイズできるデフォルトのUIを提供します。これらの設定を無効にすると、その関連するUI要素が非表示になります。必要に応じて、これらのUI要素をカスタムインターフェースで置き換えることもできます:
詳細については、チャットウィンドウおよびバブルチャットを参照してください。
チャネル、メッセージ、およびコマンド
TextChannel — テキストチャネルは、クライアントからサーバーに送信されたユーザーのメッセージを中継し、その後、権限に基づいて他のユーザーに表示します。テキストチャネルは機能するために TextChatService に親子関係を持たなければなりません。
TextSource — TextChannel 内のユーザー。AddUserAsync() メソッドが呼び出されると、テキストソースは直接 TextChannel に親子関係を持ちます。テキストソースには、チャネル内のユーザーのメッセージ送信権限などの詳細な権限が含まれています。単一のユーザーが複数のテキストチャネルにいる場合、彼らは複数のテキストソースに関連付けられます。
TextChatMessage — テキストチャネル内のメッセージ。チャットメッセージには、メッセージの送信者、元のメッセージ、フィルタリングされたメッセージ、および作成タイムスタンプなどの基本情報が含まれます。
TextChatCommand — ユーザーが PrimaryAlias または SecondaryAlias プロパティに一致するメッセージを送信することによって、特定のアクションや動作を実行できるようにします。チャットコマンドは、機能するために TextChatService に親子関係を持たなければなりません。
チャットフローチャート
テキストチャットはクライアント-サーバーモデルを使用し、送信クライアント、サーバー、そして受信クライアントが存在します。

プレイヤーがローカルデバイスからメッセージを送信すると、TextChannel:SendAsync() メソッドがトリガーされます。このメソッドはメッセージを処理し、それがチャットコマンドか通常のチャットメッセージかを判断します。
メッセージがチャットコマンドである場合、TextChatCommand.Triggered イベントが発火して、定義されたアクションを実行します。それ以上のステップは必要ありません。
メッセージが通常のチャットメッセージである場合、TextChatService.SendingMessage イベントが発火して、送信クライアントの送信者にメッセージを表示します。同時に、TextChannel:SendAsync() がメッセージをサーバーに渡します。
サーバーは TextChannel.ShouldDeliverCallback を発火させ、権限やRobloxコミュニティのフィルタリング要件に基づいて、メッセージを他のプレイヤーに配信するかどうかを決定します。
TextChannel.ShouldDeliverCallback がメッセージが他のプレイヤーに配信される資格があると判断した場合、サーバーはフィルタを適用し、TextChannel.OnIncomingMessage を2回発火させます:
最初は送信クライアントで、サーバーがメッセージを処理していることを示すために TextChatService.MessageReceived イベントをトリガーします。このイベントは、送信クライアントでローカルメッセージをサーバーからの処理済みメッセージで置き換えます。元のメッセージがフィルタリングを必要としなければ、メッセージは同じです。
2回目は受信クライアントで、他のプレイヤーにメッセージを表示するために TextChatService.MessageReceived イベントをトリガーします。
テキストチャットフックとコールバック
TextChatService APIは、チャットメッセージの表示と配信に明確な分離を奨励します。テキストチャットシステムの複数のインスタンスが、中央集中的で明確な場所でメッセージのフォーマットを行うためのフックとコールバックを提供します。

条件付きメッセージ配信
TextChannel.ShouldDeliverCallback コールバックは、サーバー上でのみ定義されるべきです。このコールバックは、メッセージが送信されるときに、テキストチャネルの各 TextSource 子について発火し、メッセージが配信されるべきかどうかを判断します。このコールバックは、以下のような追加のゲームプレイコンテキストに依存するカスタムメッセージ配信ロジックを実装するために使用できます:
- 近接ベースのチャット — ユーザーは、自分の近くにいる人にのみメッセージを送信できます。
- 特定の属性を持つユーザーが他のユーザーにメッセージを送信するのを防ぐこと。
メッセージ表示のカスタマイズ
デフォルトの TextChatService UIは、メッセージの表示方法をフォーマットしカスタマイズするためにリッチテキストに依存しています。メッセージの表示前にメッセージをフォーマットするために以下のコールバックを使用できます。たとえば、ユーザー名に色やチャットタグを追加したり、メッセージコンテンツをフォーマットしたりします。
以下のコールバックは、表示される直前のすべての TextChatMessage に対して呼び出され、TextChannel、TextSource、または TextChatMessage の内容に基づいてチャットウィンドウの外観をカスタマイズできます。クライアントがメッセージを送信するとき、これらのコールバックはメッセージがサーバーに送信されたときに1回呼び出され、TextChatMessage.Status の値は Enum.TextChatMessageStatus.Sending になります。サーバーがメッセージを受信し、他のユーザーに配信されるとき、送信者クライアントは更新された Enum.TextChatMessageStatus 値とともに再度メッセージを受け取ります。
- TextChatService.OnIncomingMessage — このコールバックはクライアントのみで定義されるべきです。メッセージが受信されたとき(サーバーからまたはローカルクライアントがちょうどメッセージを送信した場合)に発火します。このコールバックは、すべての TextChannel インスタンスから受信したすべての TextChatMessage で呼び出され、ユーザーに表示される前にメッセージを最初に処理します。
- TextChannel.OnIncomingMessage — このコールバックはクライアントのみで定義されるべきです。サーバーからメッセージが受信されたときに発火します。このコールバックは、TextChannel から受信したすべての TextChatMessage で呼び出されます。TextChatService.CreateDefaultTextChannels から作成されたデフォルトの TextChannel インスタンスには、このコールバックが定義されており、上書きできます。
- TextChatService.OnBubbleAdded — このコールバックはクライアントのみで定義されるべきです。チャットウィンドウUIでのメッセージの外観とは独立して、チャットバブルの外観をカスタマイズするために使用します。
- TextChatService.OnChatWindowAdded — このコールバックはクライアントのみで定義されるべきです。チャットウィンドウUIでのメッセージの外観とは独立して、チャットメッセージの外観をカスタマイズするために使用します。
レガシーチャットからの移行
このセクションでは、TextChatService を使用して一般的なチャット機能と動作を実装するための代替メソッドを提供することで、レガシーチャットシステムからの移行を支援します。
Explorer ウィンドウで、TextChatService を選択します。
Properties ウィンドウで、ChatVersion ドロップダウンを見つけて、TextChatService を選択します。

基本機能
両方のシステムは基本的なチャット機能を共有していますが、一般的に TextChatService の実装は持続可能で、反復が容易です。
| 機能 | レガシーチャット | TextChatService | 違い |
|---|---|---|---|
| チャットメッセージを送信 | Players:Chat() | TextChannel:SendAsync() | SendAsync() メソッドは、リッチテキストフォーマットやメッセージの優先度など、より高度なチャット機能をサポートしています。また、不適切なメッセージが送信されるのを防ぐためのフィルタリング機能も組み込まれています。 |
| メッセージコールバックの実装 | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | レガシーチャットシステムはメッセージを配信するためにチャットシステムイベントに関数をバインドします。TextChatService の2つのメソッドは、より良い柔軟性とカスタマイズを提供します。 |
| カスタムチャットコマンドを追加 | ChatService/ChatCommand モジュール | TextChatCommand | TextChatService は、レガシーチャットモジュールを使用するのではなく、テキストコマンド用の専用クラスを持っています。 |
| システムメッセージを表示 | StarterGui:SetCore()を使用して ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | TextChannel.OnIncomingMessage コールバックが、メッセージの外観をカスタマイズするために TextChatMessageProperties インスタンスを返すことができます。 |
| チャットを無効にする | 体験設定 (Studio) と ChatWindow/ChatSettings モジュールでチャットウィンドウを非表示にする | ChatWindowConfiguration.Enabled |
メッセージフィルタリング
TextChatService は、各プレイヤーのアカウント情報に基づいてチャットメッセージを自動的にフィルタリングするため、すべての種類のチャットメッセージに対して手動でテキストフィルタリングを実装する必要はありません。
| 機能 | レガシーチャット | TextChatService |
|---|---|---|
| 個別プレイヤーのためのチャットメッセージのフィルタリング | Chat:FilterStringAsync() | 自動 |
| ブロードキャストメッセージのフィルタリング | Chat:FilterStringForBroadcast() | 自動 |
ウィンドウおよびバブルチャット
TextChatService のチャットウィンドウおよびバブルチャットの動作とカスタマイズオプションは、レガシーチャットシステムのそれと同一です。レガシーチャットシステムはチャットモジュールや Players コンテナを使用してのカスタマイズのみを許可しますが、このサービスはすべてのチャットウィンドウおよびバブルチャットプロパティを管理するための専用クラス(ChatWindowConfiguration と BubbleChatConfiguration)を提供します。加えて、Studioの設定を使用して、すべてをスクリプトすることなく、バブルチャットの外観と動作を簡単に調整し、プレビューすることができます。
| 機能 | レガシーチャット | TextChatService |
|---|---|---|
| チャットウィンドウを有効にする | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
| バブルチャットを有効にする | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
| チャットウィンドウのプロパティを設定 | Players:SetChatStyle() | ChatWindowConfiguration |
| バブルチャットのプロパティを設定 | Chat:SetBubbleChatSettings() Chat.BubbleChatSettingsChanged() Players.BubbleChat Players:SetChatStyle() | BubbleChatConfiguration |
| NPCバブルを有効にする | Chat:Chat() | TextChatService:DisplayBubble() |
スピーカーの「追加データ」を移行する
レガシーLuaチャットシステムでは、開発者は Speaker クラスで SetExtraData を使用することができました。このデータは、名前の色、チャットの色をフォーマットしたり、特定のスピーカーに名前タグを適用するために使用されました。
レガシーチャットシステム SetExtraData
-- レガシーチャットシステムでスピーカーに追加データを設定する例
ChatService.SpeakerAdded:Connect(function(playerName)
local speaker = ChatService:GetSpeaker(playerName)
speaker:SetExtraData("NameColor", Color3.fromRGB(255, 255, 55))
speaker:SetExtraData("ChatColor", Color3.fromRGB(212, 175, 55))
speaker:SetExtraData("Tags", {{TagText = "YourTagName", TagColor = Color3.fromRGB(0, 255, 0)}, {TagText = "OtherTagName", TagColor = Color3.fromRGB(255, 0, 0)}})
end)
TextChatService には SetExtraData の直接的な相当物はありません。代わりに、メッセージの TextSource に基づいてリッチテキストを使用してメッセージの外観をカスタマイズするために、コールバック である OnWindowAdded を使用します。
以下は、Player オブジェクトの属性にアクセスしてレガシーLuaチャットの「追加データ」をエミュレートする例です:
TextChatService SetAttributes
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
player:SetAttribute("NameColor", Color3.fromRGB(255, 255, 55))
player:SetAttribute("ChatColor", Color3.fromRGB(212, 175, 55))
player:SetAttribute("isYourTag", true)
player:SetAttribute("isOtherTag", true)
end)
その後、OnChatWindowAdded コールバックを使用して、プレイヤーに設定された属性に基づいてチャットウィンドウの外観をカスタマイズできます:
TextChatService OnChatWindowAdded
local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
TextChatService.OnChatWindowAdded = function(textChatMessage)
local textSource = textChatMessage.TextSource
if textSource then
local player = Players:GetPlayerByUserId(textSource.UserId)
if player then
local overrideProperties = TextChatService.ChatWindowConfiguration:DeriveNewMessageProperties()
overrideProperties.PrefixText = textChatMessage.PrefixText
overrideProperties.Text = textChatMessage.Text
local nameColor = player:GetAttribute("NameColor")
if nameColor and typeof(nameColor) == "Color3" then
overrideProperties.PrefixTextProperties.TextColor3 = nameColor
end
local chatColor = player:GetAttribute("ChatColor")
if chatColor and typeof(chatColor) == "Color3" then
overrideProperties.TextColor3 = chatColor
end
local isYourTag = player:GetAttribute("isYourTag")
if isYourTag == true then
overrideProperties.PrefixText = `<font color='rgb(0, 255, 0)'>[YourTag]</font> {overrideProperties.PrefixText}`
end
local isOtherTag = player:GetAttribute("isOtherTag")
if isOtherTag == true then
overrideProperties.PrefixText = `<font color='rgb(255, 0, 0)'>[OtherTag]</font> {overrideProperties.PrefixText}`
end
return overrideProperties
end
end
return nil
end