テキストチャットの概要

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

Robloxは、TextChatServiceを通じてライブセッション中にプレイヤー間でテキストベースのメッセージングを提供します。このシングルトンクラスは、チャットメッセージのフィルタリング、モデレーション、ユーザー権限を含む全体的なチャットシステムの管理を担当します。このサービスには標準機能があり、チャットを拡張およびカスタマイズするためのメソッドやイベントのセットも提供しています。たとえば、カスタマイズされた要件に基づいてメッセージを配信したり、特定のプレイヤーに特別な権限やモデレーションを追加したり、特定のアクションを実行するためのカスタムコマンドを作成したりできます。

UI設定

TextChatServiceは、ゲームのニーズに合わせてカスタマイズできるデフォルトのUIを提供します。これらの設定を無効にすると、関連するUI要素が非表示になります。必要に応じて、これらのUI要素をカスタムインターフェースに置き換えることもできます。

詳細については、チャットウィンドウおよびバブルチャットを参照してください。

チャンネル、メッセージ、およびコマンド

  • TextChannel — テキストチャネルは、ユーザーが送信したメッセージをクライアントからサーバーに渡し、サーバーはそれを権限に基づいて他のユーザーに表示します。テキストチャネルは、機能するためにTextChatServiceに親子関係を持たなければなりません。

  • TextSourceTextChannel内のユーザー。テキストソースは、AddUserAsync()が呼び出されると、直接TextChannelに親子関係を持ちます。テキストソースには、チャネル内のユーザーの詳細な権限が含まれており、メッセージを送信する能力などが含まれます。単一のユーザーが複数のテキストチャネルにいる場合、彼らは複数のテキストソースに関連付けられます。

  • TextChatMessage — テキストチャネル内のメッセージ。チャットメッセージには、メッセージの送信者、元のメッセージ、フィルタリングされたメッセージ、作成タイムスタンプなどの基本情報が含まれます。

  • TextChatCommand — ユーザーがPrimaryAliasまたはSecondaryAliasプロパティに一致するメッセージを送信することで、特定のアクションや動作を呼び出すことを可能にします。チャットコマンドは、機能するためにTextChatServiceに親子関係を持たなければなりません。

チャットフローチャート

テキストチャットは、クライアント-サーバーモデルを使用し、送信クライアントサーバー、および受信クライアントがあります。

ゲーム内テキストチャットのフローチャート。
  1. プレイヤーがローカルデバイスからメッセージを送信すると、TextChannel:SendAsync()メソッドがトリガーされます。このメソッドはメッセージを処理し、それがチャットコマンドか通常のチャットメッセージかを判断します。

    • メッセージがチャットコマンドである場合、TextChatCommand.Triggeredイベントが発火し、定義されたアクションを実行します。これ以上の手順は必要ありません。

    • メッセージが通常のチャットメッセージである場合、TextChatService.SendingMessageイベントが発火し、送信クライアントの送信者にメッセージを表示します。同時に、TextChannel:SendAsync()がメッセージをサーバーに渡します。

  2. サーバーはTextChannel.ShouldDeliverCallbackを発火させ、権限やRobloxコミュニティのフィルタリング要件に基づいて他のプレイヤーにメッセージを配信するかどうかを判断します。

  3. TextChannel.ShouldDeliverCallbackがメッセージが他のプレイヤーに配信される資格があると判断した場合、サーバーはフィルターを適用し、TextChannel.OnIncomingMessageを2回発火させます。

    1. 最初は送信クライアントで、サーバーがメッセージを処理していることを示すためにTextChatService.MessageReceivedイベントが発火します。このイベントは、送信クライアントのローカルメッセージをサーバーからの処理されたメッセージに置き換えます。元のメッセージがフィルタリングを必要としなかった場合、メッセージは同一です。

    2. 2回目は受信クライアントで、他のプレイヤーにメッセージを表示するためにTextChatService.MessageReceivedイベントが発火します。

テキストチャットのフックとコールバック

TextChatService APIは、チャットメッセージの外観と配信の明確な分離を促進します。テキストチャットシステムの複数のインスタンスは、中央集権的で明確な場所でフォーマットするためのフックとコールバックを提供します。

TextChatServiceコールバックの順序のフローチャート

条件付きメッセージ配信

TextChannel.ShouldDeliverCallbackコールバックは、サーバー上でのみ定義する必要があります。このコールバックは、メッセージが送信されるときにテキストチャネルの各TextSource子に対して発火し、メッセージが配信されるべきかどうかを判断します。このコールバックは、次のような追加のゲームプレイコンテキストに依存するカスタムメッセージ配信ロジックを実装するために使用できます。

  • 近接ベースのチャットでは、ユーザーは自分の近くにいる人にのみメッセージを送信できます。
  • 特定の属性を持つユーザーが他のユーザーにメッセージを送信するのを防ぐ。

メッセージ表示のカスタマイズ

デフォルトのTextChatService UIは、リッチテキストを使用してメッセージの表示方法をフォーマットおよびカスタマイズします。次のコールバックを使用して、メッセージがユーザーに表示される前にフォーマットできます。たとえば、ユーザー名に色やチャットタグを追加したり、メッセージコンテンツをフォーマットしたりできます。

次のコールバックは、表示される直前のすべてのTextChatMessageに対して呼び出され、TextChannelTextSource、または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を使用して一般的なチャット機能や動作を実装するための代替メソッドを提供することで、レガシーチャットシステムからの移行を支援します。

  1. Explorerウィンドウで、TextChatServiceを選択します。

  2. Propertiesウィンドウで、ChatVersionドロップダウンを見つけ、TextChatServiceを選択します。

基本機能

両方のシステムは同じ基本的なチャット機能を共有していますが、一般的にTextChatServiceの実装はより持続可能で、反復が容易です。

機能レガシーチャットTextChatService違い
チャットメッセージを送信するPlayers:Chat()TextChannel:SendAsync()SendAsync()メソッドは、リッチテキストフォーマットやメッセージの優先度など、より高度なチャット機能をサポートしています。また、不適切なメッセージが送信されるのを防ぐためのフィルタリングも組み込まれています。
メッセージコールバックを実装するChat:InvokeChatCallback()
Chat:RegisterChatCallback()
TextChatService.SendingMessage
TextChatService.OnIncomingMessage
レガシーチャットシステムは、メッセージを配信するためにチャットシステムイベントに関数をバインドします。TextChatServiceの2つのメソッドは、より良い柔軟性とカスタマイズを提供します。
カスタムチャットコマンドを追加するChatService/ChatCommandモジュールTextChatCommandTextChatServiceは、レガシーチャットモジュールを使用するのではなく、テキストコマンド用の専用クラスを持っています。
システムメッセージを表示するStarterGui:SetCore()を使用してChatMakeSystemMessageTextChannel:DisplaySystemMessage()TextChannel.OnIncomingMessageコールバックは、メッセージの外観をカスタマイズするためにTextChatMessagePropertiesインスタンスを返すことができます。
チャットを無効にするChatWindow/ChatSettingsモジュールでチャットウィンドウを非表示にするChatWindowConfiguration.Enabled

メッセージフィルタリング

TextChatServiceは、各プレイヤーのアカウント情報に基づいてチャットメッセージを自動的にフィルタリングするため、すべての種類のチャットメッセージに対して手動でテキストフィルタリングを実装する必要はありません。

機能レガシーチャットTextChatService
個々のプレイヤーのチャットメッセージをフィルタリングするChat:FilterStringAsync()自動
ブロードキャストメッセージをフィルタリングするChat:FilterStringForBroadcast()自動

ウィンドウとバブルチャット

TextChatServiceチャットウィンドウバブルチャットの動作およびカスタマイズオプションは、レガシーチャットシステムのそれと同一です。レガシーチャットシステムはチャットモジュールやPlayersコンテナを使用してのみカスタマイズを許可するため、サービスはすべてのチャットウィンドウおよびバブルチャットプロパティを管理するための専用クラス(ChatWindowConfigurationおよびBubbleChatConfiguration)を提供します。さらに、すべてをスクリプト化する必要なく、スタジオ設定を使用してバブルチャットの外観や動作プロパティを簡単に調整およびプレビューできます。

機能レガシーチャット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
©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。