Roblox bietet textbasierte Nachrichtenübertragung zwischen Spielern in Live-Sitzungen über TextChatService, eine Singleton-Klasse, die für das Management des gesamten Chatsystems verantwortlich ist, einschließlich der Filterung von Chatnachrichten, Moderation und Benutzerberechtigungen. Dieser Dienst hat seine Standardfunktionen und bietet auch eine Reihe von Methoden und Ereignissen zur Erweiterung und Anpassung des Chats, wie das Liefern von Nachrichten basierend auf angepassten Anforderungen, das Hinzufügen spezieller Berechtigungen oder Moderation für bestimmte Spieler und das Erstellen von benutzerdefinierten Befehlen, um spezifische Aktionen auszuführen.
UI-Konfiguration
TextChatService bietet eine Standard-UI, die an die Bedürfnisse Ihres Spiels angepasst werden kann. Deaktivieren Sie beliebige dieser Konfigurationen, um das zugehörige UI-Element auszublenden. Wenn gewünscht, können Sie diese UI-Elemente auch durch benutzerdefinierte Schnittstellen ersetzen:
Für weitere Informationen siehe Chatfenster und Bubble-Chat.
Kanäle, Nachrichten und Befehle
TextChannel – Textkanäle übermitteln vom Client gesendete Nachrichten an den Server, der diese dann basierend auf Berechtigungen anderen Benutzern anzeigt. Textkanäle müssen an TextChatService angehängt sein, um zu funktionieren.
TextSource – Ein Benutzer in einem TextChannel. Textquellen sind direkt an den TextChannel angehängt, wenn AddUserAsync() aufgerufen wird. Textquellen enthalten detaillierte Berechtigungen eines Benutzers im Kanal, wie zum Beispiel ihre Fähigkeit, Nachrichten zu senden. Wenn ein einzelner Benutzer in mehreren Textkanälen ist, sind sie mit mehreren Textquellen verbunden.
TextChatMessage – Eine Nachricht in einem Textkanal. Chatnachrichten enthalten grundlegende Informationen wie den Absender der Nachricht, die ursprüngliche Nachricht, die gefilterte Nachricht und den Zeitstempel der Erstellung.
TextChatCommand – Ermöglicht Benutzern, spezifische Aktionen oder Verhaltensweisen zu aktivieren, indem sie Nachrichten senden, die den Eigenschaften PrimaryAlias oder SecondaryAlias entsprechen. Chatbefehle müssen an TextChatService angehängt sein, um zu funktionieren.
Chat-Flussdiagramm
Der Textchat verwendet das Client-Server-Modell, mit einem sendenden Client, dem Server und den empfangenden Clients.

Ein Spieler sendet eine Nachricht von seinem lokalen Gerät, was die Methode TextChannel:SendAsync() auslöst. Diese Methode verarbeitet die Nachricht und bestimmt, ob es sich um einen Chatbefehl oder eine reguläre Chatnachricht handelt.
Wenn die Nachricht ein Chatbefehl ist, wird das Ereignis TextChatCommand.Triggered ausgelöst, um die definierte Aktion auszuführen. Es sind keine weiteren Schritte erforderlich.
Wenn die Nachricht eine reguläre Chatnachricht ist, wird das Ereignis TextChatService.SendingMessage ausgelöst, um die Nachricht dem Sender über den sendenden Client anzuzeigen. Gleichzeitig wird TextChannel:SendAsync() aufgerufen, um die Nachricht an den Server zu übermitteln.
Der Server löst TextChannel.ShouldDeliverCallback aus, um zu bestimmen, ob die Nachricht basierend auf Berechtigungen und den Anforderungen an die Filterung der Roblox-Community an andere Spieler geliefert werden soll.
Wenn TextChannel.ShouldDeliverCallback bestimmt, dass die Nachricht berechtigt ist, an andere Spieler geliefert zu werden, wendet der Server alle Filter an und löst TextChannel.OnIncomingMessage zweimal aus:
Das erste Mal erfolgt dies beim sendenden Client und signalisiert, dass der Server die Nachricht über das Ereignis TextChatService.MessageReceived verarbeitet. Dieses Ereignis ersetzt die lokale Nachricht des sendenden Clients durch die verarbeitete Nachricht vom Server. Die Nachricht ist identisch, wenn die Originalnachricht keine Filterung erforderte.
Das zweite Mal erfolgt dies bei den empfangenden Clients, was das Ereignis TextChatService.MessageReceived auslöst, um die Nachricht anderen Spielern anzuzeigen.
Textchat-Hooks und -Callbacks
Die API von TextChatService fördert eine klare Trennung im Aussehen und der Übermittlung von Chatnachrichten. Mehrere Instanzen des Textchatsystems bieten Hooks und Callbacks, um zentralisierte, klare Formate zu ermöglichen.

Bedingte Nachrichtenlieferung
Der Callback TextChannel.ShouldDeliverCallback sollte nur auf dem Server definiert werden. Der Callback wird für jedes TextSource-Kind des Textkanals ausgelöst, wenn eine Nachricht gesendet wird, um zu bestimmen, ob die Nachricht geliefert werden soll. Dieser Callback kann verwendet werden, um benutzerdefinierte Nachrichtenlieferlogik zu implementieren, die von zusätzlichen Spielkontexten abhängen kann, wie zum Beispiel:
- Proximitätsbasierter Chat, bei dem Benutzer nur Nachrichten an diejenigen senden können, die ihnen nahe sind.
- Verhindern, dass Benutzer mit bestimmten Attributen anderen Nachrichten senden.
Anpassung der Nachrichtenanzeige
Die Standard-UI von TextChatService basiert auf Rich Text, um das Format und die Anpassung der Anzeige von Nachrichten zu steuern. Sie können die folgenden Callbacks verwenden, um Nachrichten zu formatieren, bevor sie den Benutzern angezeigt werden, beispielsweise um Farben oder Chat-Tags zu Benutzernamen hinzuzufügen oder den Nachrichteninhalt zu formatieren.
Die folgenden Callbacks werden für jede TextChatMessage aufgerufen, die angezeigt werden soll, was Ihnen ermöglicht, das Erscheinungsbild des Chatfensters basierend auf dem Inhalt von TextChannel, TextSource oder TextChatMessage anzupassen. Wenn ein Client eine Nachricht sendet, werden diese Callbacks einmal aufgerufen, wenn die Nachricht an den Server gesendet wird und der Wert von TextChatMessage.Status auf Enum.TextChatMessageStatus.Sending gesetzt ist. Sobald die Nachricht vom Server empfangen und an andere Benutzer geliefert wird, erhält der sendende Client die Nachricht erneut mit einem aktualisierten Wert von Enum.TextChatMessageStatus.
- TextChatService.OnIncomingMessage — Dieser Callback sollte nur auf dem Client definiert werden. Der Callback wird ausgelöst, wenn eine Nachricht empfangen wird, entweder vom Server oder wenn der lokale Client gerade eine Nachricht gesendet hat. Der Callback wird für jede TextChatMessage aufgerufen, die von allen TextChannel-Instanzen empfangen wird, und ist der erste, der die Nachricht verarbeitet, bevor sie dem Benutzer angezeigt wird.
- TextChannel.OnIncomingMessage — Dieser Callback sollte nur auf dem Client definiert werden. Der Callback wird ausgelöst, wenn eine Nachricht vom Server empfangen wird. Der Callback wird für jede TextChatMessage aufgerufen, die von dem TextChannel empfangen wird. Standard-TextChannel-Instanzen, die von TextChatService.CreateDefaultTextChannels erstellt wurden, haben diesen Callback definiert und können überschrieben werden.
- TextChatService.OnBubbleAdded — Dieser Callback sollte nur auf dem Client definiert werden. Verwenden Sie ihn, um das Erscheinungsbild von Chatblasen unabhängig vom Erscheinungsbild der Nachricht in der Chatfenster-UI anzupassen.
- TextChatService.OnChatWindowAdded — Dieser Callback sollte nur auf dem Client definiert werden. Verwenden Sie ihn, um das Erscheinungsbild von Chatnachrichten in der Chatfenster-UI unabhängig vom Erscheinungsbild der Nachricht in Chatblasen anzupassen.
Migration vom Legacy-Chat
Dieser Abschnitt hilft Ihnen, vom Legacy-Chat-System zu migrieren, indem er alternative Methoden zur Implementierung gängiger Chatfunktionen und -verhaltensweisen unter Verwendung von TextChatService bereitstellt.
Wählen Sie im Explorer die TextChatService aus.
Finden Sie im Properties-Fenster das Dropdown-Menü ChatVersion und wählen Sie TextChatService.

Grundlegende Funktionen
Obwohl beide Systeme die gleichen grundlegenden Chatfunktionen bieten, sind die Implementierungen von TextChatService im Allgemeinen nachhaltiger und einfacher zu iterieren.
| Funktionalität | Legacy-Chat | TextChatService | Unterschiede |
|---|---|---|---|
| Eine Chatnachricht senden | Players:Chat() | TextChannel:SendAsync() | Die Methode SendAsync() unterstützt fortschrittlichere Chatfunktionen, wie Rich-Text-Formatierung und Nachrichtenprioritäten. Sie enthält auch eine integrierte Filterung, um zu helfen, unangemessene Nachrichten zu verhindern. |
| Messaging-Callbacks implementieren | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | Das Legacy-Chat-System bindet eine Funktion an die Ereignisse des Chatsystems zur Übermittlung von Nachrichten. Die beiden Methoden von TextChatService bieten bessere Flexibilität und Anpassungsmöglichkeiten. |
| Benutzerdefinierte Chatbefehle hinzufügen | ChatService/ChatCommand-Modul | TextChatCommand | TextChatService hat eine eigene Klasse für Textbefehle anstelle der Nutzung eines Legacy-Chatmoduls. |
| Eine Systemnachricht anzeigen | StarterGui:SetCore() mit ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | Der Callback TextChannel.OnIncomingMessage kann eine Instanz von TextChatMessageProperties zurückgeben, um das Erscheinungsbild der Nachricht anzupassen. |
| Chat deaktivieren | Erlebnis-Einstellungen im Studio und ChatWindow/ChatSettings-Modul zum Ausblenden des Chatfensters | ChatWindowConfiguration.Enabled |
Nachrichtenfilterung
TextChatService filtert automatisch Chatnachrichten basierend auf den Kontoinformationen jedes Spielers, sodass Sie keine manuelle Textfilterung für alle Arten von Chatnachrichten implementieren müssen.
| Funktionalität | Legacy-Chat | TextChatService |
|---|---|---|
| Chatnachricht für einen einzelnen Spieler filtern | Chat:FilterStringAsync() | Automatisch |
| Broadcast-Nachrichten filtern | Chat:FilterStringForBroadcast() | Automatisch |
Fenster- und Blasen-Chat
Das Verhalten und die Anpassungsoptionen des Chatfensters und Blasen-Chats von TextChatService sind identisch mit dem des Legacy-Chat-Systems. Da das Legacy-Chat-System nur eine Anpassung über Chatmodule oder den Players-Container erlaubt, bietet der Dienst eigene Klassen (ChatWindowConfiguration und BubbleChatConfiguration), um alle Eigenschaften des Chatfensters und des Blasen-Chats zu verwalten. Darüber hinaus können Sie Ihre Blasen-Chat-Erscheinung und -Verhaltenseigenschaften leicht anpassen und in den Studioeinstellungen anzeigen, anstatt alle zu skripten.
| Funktionalität | Legacy-Chat | TextChatService |
|---|---|---|
| Chatfenster aktivieren | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
| Blasen-Chat aktivieren | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
| Chatfenstereigenschaften festlegen | Players:SetChatStyle() | ChatWindowConfiguration |
| Blasen-Chat-Eigenschaften festlegen | Chat:SetBubbleChatSettings() Chat.BubbleChatSettingsChanged() Players.BubbleChat Players:SetChatStyle() | BubbleChatConfiguration |
| NPC-Blasen aktivieren | Chat:Chat() | TextChatService:DisplayBubble() |
Migration von "zusätzlichen Daten" des Sprechers
Das Legacy-Lua-Chat-System erlaubte Entwicklern, SetExtraData in der Speaker-Klasse zu verwenden. Diese Daten wurden verwendet, um die Farbauswahl des Namens, die Chatfarbe oder um Namensschilder für einen bestimmten Sprecher anzuwenden.
Legacy-Chat-System SetExtraData
-- Ein Beispiel für das Festlegen zusätzlicher Daten auf einem Sprecher im Legacy-Chat-System
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 hat kein direktes Äquivalent zu SetExtraData. Verwenden Sie stattdessen Callbacks wie OnWindowAdded, um das Erscheinungsbild von Nachrichten mithilfe von Rich Text basierend auf der TextSource der Nachricht anzupassen.
Das folgende Beispiel zeigt, wie man die "zusätzlichen Daten" aus dem Legacy-Lua-Chat emulieren kann, indem Attribute an Player-Objekten verwendet werden:
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)
Anschließend können Sie den Callback OnChatWindowAdded verwenden, um das Erscheinungsbild des Chatfensters basierend auf den Attributen festzulegen, die für den Spieler gesetzt wurden:
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)'>[IhrTag]</font> {overrideProperties.PrefixText}`
end
local isOtherTag = player:GetAttribute("isOtherTag")
if isOtherTag == true then
overrideProperties.PrefixText = `<font color='rgb(255, 0, 0)'>[AndereTag]</font> {overrideProperties.PrefixText}`
end
return overrideProperties
end
end
return nil
end