Roblox bietet textbasierte Nachrichten zwischen Spielern in Live-Sitzungen über TextChatService, eine Singleton-Klasse, die für die Verwaltung 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 z. B. das Zustellen 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 eine 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 leiten vom Benutzer gesendete Nachrichten vom Client an den Server weiter, der sie dann anderen Benutzern basierend auf Berechtigungen anzeigt. Textkanäle müssen an TextChatService angehängt werden, um zu funktionieren.
TextSource — Ein Benutzer in einem TextChannel. Textquellen werden direkt an den TextChannel angehängt, wenn AddUserAsync() aufgerufen wird. Textquellen enthalten detaillierte Berechtigungen eines Benutzers im Kanal, wie z. B. die 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 es Benutzern, spezifische Aktionen oder Verhaltensweisen auszulösen, indem sie Nachrichten senden, die mit den Eigenschaften PrimaryAlias oder SecondaryAlias übereinstimmen. Chatbefehle müssen an TextChatService angehängt werden, um zu funktionieren.
Chat-Flussdiagramm
Der Text-Chat verwendet das Client-Server-Modell, mit einem sendenden Client, dem Server und 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 Absender auf dem sendenden Client anzuzeigen. Gleichzeitig übergibt TextChannel:SendAsync() die Nachricht an den Server.
Der Server löst TextChannel.ShouldDeliverCallback aus, um zu bestimmen, ob die Nachricht anderen Spielern basierend auf Berechtigungen und den Anforderungen der Roblox-Community-Filterung zugestellt werden soll.
Wenn TextChannel.ShouldDeliverCallback bestimmt, dass die Nachricht für die Zustellung an andere Spieler berechtigt ist, wendet der Server alle Filter an und löst TextChannel.OnIncomingMessage zweimal aus:
Das erste Mal geschieht dies auf dem sendenden Client und signalisiert, dass der Server die Nachricht über das Ereignis TextChatService.MessageReceived verarbeitet. Dieses Ereignis ersetzt die lokale Nachricht auf dem sendenden Client durch die verarbeitete Nachricht vom Server. Die Nachricht ist identisch, wenn die ursprüngliche keine Filterung erforderte.
Das zweite Mal geschieht dies auf den empfangenden Clients, was das Ereignis TextChatService.MessageReceived auslöst, um die Nachricht anderen Spielern anzuzeigen.
Text-Chat-Hooks und Rückrufe
Die TextChatService-API fördert eine klare Trennung des Erscheinungsbilds und der Zustellung von Chatnachrichten. Mehrere Instanzen des Text-Chat-Systems bieten Hooks und Rückrufe, um in zentralen, klaren Orten zu formatieren.

Bedingte Zustellung von Nachrichten
Der Rückruf TextChannel.ShouldDeliverCallback sollte nur auf dem Server definiert werden. Der Rückruf wird für jedes TextSource-Kind des Textkanals ausgelöst, wenn eine Nachricht gesendet wird, um zu bestimmen, ob die Nachricht zugestellt werden soll. Dieser Rückruf kann verwendet werden, um benutzerdefinierte Logik zur Nachrichtenübermittlung zu implementieren, die von zusätzlichem Gameplay-Kontext abhängen kann, wie z. B.:
- Proximitätsbasierter Chat, bei dem Benutzer nur Nachrichten an diejenigen senden können, die sich in ihrer Nähe befinden.
- Verhindern, dass Benutzer mit bestimmten Attributen anderen Nachrichten senden.
Anpassung der Nachrichtenanzeige
Die Standard-UI von TextChatService basiert auf reichhaltigem Text, um zu formatieren und anzupassen, wie Nachrichten angezeigt werden. Sie können die folgenden Rückrufe verwenden, um Nachrichten zu formatieren, bevor sie den Benutzern angezeigt werden, z. B. um Farben oder Chat-Tags zu Benutzernamen hinzuzufügen oder den Inhalt der Nachricht zu formatieren.
Die folgenden Rückrufe werden für jede TextChatMessage aufgerufen, die angezeigt werden soll, was es 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 Rückrufe einmal aufgerufen, wenn die Nachricht an den Server gesendet wird und der Wert von TextChatMessage.Status Enum.TextChatMessageStatus.Sending sein wird. Sobald die Nachricht vom Server empfangen wird und an andere Benutzer zugestellt wird, erhält der sendende Client die Nachricht erneut mit einem aktualisierten Wert von Enum.TextChatMessageStatus.
- TextChatService.OnIncomingMessage — Dieser Rückruf sollte nur auf dem Client definiert werden. Der Rückruf wird ausgelöst, wenn eine Nachricht empfangen wird, entweder vom Server oder wenn der lokale Client gerade eine Nachricht gesendet hat. Der Rückruf 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 Rückruf sollte nur auf dem Client definiert werden. Der Rückruf wird ausgelöst, wenn eine Nachricht vom Server empfangen wird. Der Rückruf wird für jede TextChatMessage aufgerufen, die vom TextChannel empfangen wird. Standardmäßige TextChannel-Instanzen, die von TextChatService.CreateDefaultTextChannels erstellt wurden, haben diesen Rückruf definiert und können überschrieben werden.
- TextChatService.OnBubbleAdded — Dieser Rückruf 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 Rückruf 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 bei der Migration vom Legacy-Chat-System, indem er alternative Methoden zur Implementierung gängiger Chat-Funktionalitäten und -Verhaltensweisen mit TextChatService bereitstellt.
Wählen Sie im Explorer Fenster TextChatService aus.
Suchen Sie im Eigenschaften Fenster das Dropdown-Menü ChatVersion und wählen Sie TextChatService.

Grundlegende Funktionen
Obwohl beide Systeme die gleichen grundlegenden Chat-Funktionalitäten teilen, 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 Chat-Funktionen, wie z. B. reichhaltige Textformatierung und Nachrichtenpriorität. Sie enthält auch eine integrierte Filterung, um zu verhindern, dass unangemessene Nachrichten gesendet werden. |
| Messaging-Rückrufe implementieren | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | Das Legacy-Chat-System bindet eine Funktion an die Ereignisse des Chatsystems zur Zustellung von Nachrichten. Die beiden Methoden von TextChatService bieten bessere Flexibilität und Anpassung. |
| Benutzerdefinierte Chatbefehle hinzufügen | ChatService/ChatCommand-Modul | TextChatCommand | TextChatService hat eine dedizierte Klasse für Textbefehle, anstatt ein Legacy-Chat-Modul zu verwenden. |
| Eine Systemnachricht anzeigen | StarterGui:SetCore() mit ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | Der Rückruf TextChannel.OnIncomingMessage kann eine Instanz von TextChatMessageProperties zurückgeben, um das Erscheinungsbild der Nachricht anzupassen. |
| Chat deaktivieren | ChatWindow/ChatSettings-Modul zum Ausblenden des Chatfensters | ChatWindowConfiguration.Enabled |
Nachrichtenfilterung
TextChatService filtert automatisch Chatnachrichten basierend auf den Kontoinformationen jedes Spielers, sodass Sie die Textfilterung für alle Arten von Chatnachrichten nicht manuell implementieren müssen.
| Funktionalität | Legacy-Chat | TextChatService |
|---|---|---|
| Chatnachricht für einzelnen Spieler filtern | Chat:FilterStringAsync() | Automatisch |
| Broadcast-Nachrichten filtern | Chat:FilterStringForBroadcast() | Automatisch |
Fenster- und Bubble-Chat
Sowohl das Chatfenster als auch die Bubble-Chat-Verhalten und Anpassungsoptionen von TextChatService sind identisch mit denen des Legacy-Chat-Systems. Da das Legacy-Chat-System nur Anpassungen über Chat-Module oder den Players-Container zulässt, bietet der Dienst dedizierte Klassen (ChatWindowConfiguration und BubbleChatConfiguration), um alle Eigenschaften des Chatfensters und des Bubble-Chats zu verwalten. Darüber hinaus können Sie das Erscheinungsbild und die Verhaltensparameter Ihres Bubble-Chats einfach über die Studio-Einstellungen anpassen und in der Vorschau anzeigen, anstatt alles skripten zu müssen.
| Funktionalität | Legacy-Chat | TextChatService |
|---|---|---|
| Chatfenster aktivieren | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
| Bubble-Chat aktivieren | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
| Chatfenster-Eigenschaften festlegen | Players:SetChatStyle() | ChatWindowConfiguration |
| Bubble-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 Namensfarbe, die Chatfarbe zu formatieren oder Namensschilder für einen bestimmten Sprecher anzuwenden.
-- Ein Beispiel für das Setzen 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 Rückrufe wie OnWindowAdded, um das Erscheinungsbild von Nachrichten mithilfe von reichhaltigem Text basierend auf der TextSource der Nachricht anzupassen.
Das folgende Beispiel zeigt, wie man die "zusätzlichen Daten" des Legacy-Lua-Chats emuliert, indem man auf Attribute von Player-Objekten zugreift:
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)Dann können Sie den Rückruf OnChatWindowAdded verwenden, um das Erscheinungsbild des Chatfensters basierend auf den Attributen, die auf dem Spieler gesetzt wurden, anzupassen:
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