テキストチャットの概要

*このコンテンツは、ベータ版の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)を提供します。さらに、すべてをスクリプトする必要なく、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
©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。