Roblox oferuje komunikację opartą na wiadomościach tekstowych między graczami w sesjach na żywo za pośrednictwem TextChatService, klasy singleton odpowiedzialnej za zarządzanie całym systemem czatu, w tym filtrowaniem wiadomości czatu, moderacją i uprawnieniami użytkowników. Ta usługa ma swoją standardową funkcjonalność i oferuje również zestaw metod i zdarzeń do rozszerzania i dostosowywania czatu, takich jak dostarczanie wiadomości na podstawie dostosowanych wymagań, dodawanie specjalnych uprawnień lub moderacji dla konkretnych graczy oraz tworzenie niestandardowych poleceń do wykonywania określonych działań.
Konfiguracja UI
TextChatService zapewnia domyślny interfejs użytkownika, który można dostosować do potrzeb twojej gry. Wyłącz dowolną z tych konfiguracji, aby ukryć powiązany element UI. Jeśli chcesz, możesz również zastąpić te elementy UI niestandardowymi interfejsami:
Aby uzyskać więcej informacji, zobacz Okno czatu i Czat bąbelkowy.
Kanały, wiadomości i polecenia
TextChannel — Kanały tekstowe przesyłają wiadomości wysyłane przez użytkowników z klienta do serwera, który następnie wyświetla je innym użytkownikom na podstawie uprawnień. Kanały tekstowe muszą być przypisane do TextChatService, aby działały.
TextSource — Użytkownik w TextChannel. Źródła tekstowe są bezpośrednio przypisane do TextChannel, gdy wywoływana jest metoda AddUserAsync(). Źródła tekstowe zawierają szczegółowe uprawnienia użytkownika w kanale, takie jak ich zdolność do wysyłania wiadomości. Jeśli pojedynczy użytkownik znajduje się w wielu kanałach tekstowych, są one powiązane z wieloma źródłami tekstowymi.
TextChatMessage — Wiadomość w kanale tekstowym. Wiadomości czatu zawierają podstawowe informacje, takie jak nadawca wiadomości, oryginalna wiadomość, przefiltrowana wiadomość i znacznik czasu utworzenia.
TextChatCommand — Pozwala użytkownikom wywoływać określone akcje lub zachowania, wysyłając wiadomości, które odpowiadają właściwościom PrimaryAlias lub SecondaryAlias. Polecenia czatu muszą być przypisane do TextChatService, aby działały.
Schemat przepływu czatu
Czat tekstowy korzysta z modelu klient-serwer, z klientem wysyłającym, serwerem i klientami odbierającymi.

Gracz wysyła wiadomość z lokalnego urządzenia, co uruchamia metodę TextChannel:SendAsync(). Ta metoda przetwarza wiadomość i określa, czy jest to polecenie czatu, czy zwykła wiadomość czatu.
Jeśli wiadomość jest poleceniem czatu, wywołuje zdarzenie TextChatCommand.Triggered, aby wykonać zdefiniowaną akcję. Nie są wymagane żadne dalsze kroki.
Jeśli wiadomość jest zwykłą wiadomością czatu, wywołuje zdarzenie TextChatService.SendingMessage, aby wyświetlić wiadomość nadawcy na kliencie wysyłającym. W tym samym czasie TextChannel:SendAsync() przekazuje wiadomość do serwera.
Serwer wywołuje TextChannel.ShouldDeliverCallback, aby określić, czy dostarczyć wiadomość innym graczom na podstawie uprawnień i wymagań filtracji społeczności Roblox.
Jeśli TextChannel.ShouldDeliverCallback ustali, że wiadomość kwalifikuje się do dostarczenia innym graczom, serwer stosuje wszelkie filtry i wywołuje TextChannel.OnIncomingMessage dwukrotnie:
Po raz pierwszy na kliencie wysyłającym, co sygnalizuje, że serwer przetwarza wiadomość za pośrednictwem zdarzenia TextChatService.MessageReceived. To zdarzenie zastępuje lokalną wiadomość na kliencie wysyłającym przetworzoną wiadomością z serwera. Wiadomość jest identyczna, jeśli oryginalna nie wymagała filtrowania.
Po raz drugi na klientach odbierających, co wywołuje zdarzenie TextChatService.MessageReceived, aby wyświetlić wiadomość innym graczom.
Hooki i wywołania zwrotne czatu
API TextChatService zachęca do wyraźnego rozdzielenia wyglądu i dostarczania wiadomości czatu. Wiele instancji systemu czatu tekstowego zapewnia hooki i wywołania zwrotne do formatowania w scentralizowanych, jasnych lokalizacjach.

Warunkowe dostarczanie wiadomości
Wywołanie zwrotne TextChannel.ShouldDeliverCallback powinno być definiowane tylko na serwerze. Wywołanie zwrotne jest wywoływane dla każdego dziecka TextSource kanału tekstowego, gdy wiadomość jest wysyłana, aby określić, czy wiadomość powinna być dostarczona. To wywołanie zwrotne można wykorzystać do wdrożenia niestandardowej logiki dostarczania wiadomości, która może zależeć od dodatkowego kontekstu rozgrywki, takiego jak:
- Czat oparty na bliskości, gdzie użytkownicy mogą wysyłać wiadomości tylko do tych, którzy są blisko nich.
- Zapobieganie użytkownikom z określonymi atrybutami w wysyłaniu wiadomości do innych.
Dostosowywanie wyświetlania wiadomości
Domyślny interfejs użytkownika TextChatService opiera się na bogatym tekście, aby formatować i dostosowywać sposób wyświetlania wiadomości. Możesz użyć następujących wywołań zwrotnych do formatowania wiadomości przed ich wyświetleniem użytkownikom, na przykład, aby dodać kolory lub tagi czatu do nazw użytkowników lub formatować treść wiadomości.
Następujące wywołania zwrotne są wywoływane dla każdej TextChatMessage, która ma być wyświetlona, co pozwala na dostosowanie wyglądu okna czatu na podstawie zawartości TextChannel, TextSource lub TextChatMessage. Gdy klient wysyła wiadomość, te wywołania zwrotne są wywoływane raz, gdy wiadomość jest wysyłana do serwera, a wartość TextChatMessage.Status będzie Enum.TextChatMessageStatus.Sending. Gdy wiadomość zostanie odebrana przez serwer i jest dostarczana innym użytkownikom, klient nadawcy otrzymuje wiadomość ponownie z zaktualizowaną wartością Enum.TextChatMessageStatus.
- TextChatService.OnIncomingMessage — To wywołanie zwrotne powinno być definiowane tylko na kliencie. Wywołanie zwrotne jest wywoływane, gdy wiadomość jest odbierana, zarówno z serwera, jak i jeśli lokalny klient właśnie wysłał wiadomość. Wywołanie zwrotne jest wywoływane dla każdej TextChatMessage odebranej ze wszystkich instancji TextChannel i jest pierwsze do przetworzenia wiadomości przed jej wyświetleniem użytkownikowi.
- TextChannel.OnIncomingMessage — To wywołanie zwrotne powinno być definiowane tylko na kliencie. Wywołanie zwrotne jest wywoływane, gdy wiadomość jest odbierana z serwera. Wywołanie zwrotne jest wywoływane dla każdej TextChatMessage odebranej z TextChannel. Domyślne instancje TextChannel utworzone z TextChatService.CreateDefaultTextChannels mają to wywołanie zwrotne zdefiniowane i mogą być nadpisane.
- TextChatService.OnBubbleAdded — To wywołanie zwrotne powinno być definiowane tylko na kliencie. Użyj go, aby dostosować wygląd bąbelków czatu niezależnie od wyglądu wiadomości w interfejsie użytkownika okna czatu.
- TextChatService.OnChatWindowAdded — To wywołanie zwrotne powinno być definiowane tylko na kliencie. Użyj go, aby dostosować wygląd wiadomości czatu w interfejsie użytkownika okna czatu niezależnie od wyglądu wiadomości w bąbelkach czatu.
Migracja z legacy czatu
Ta sekcja pomoże Ci w migracji z systemu czatu legacy, dostarczając alternatywne metody do wdrażania powszechnych funkcji i zachowań czatu za pomocą TextChatService.
W oknie Explorer wybierz TextChatService.
W oknie Properties znajdź rozwijane menu ChatVersion i wybierz TextChatService.

Podstawowe funkcjonalności
Chociaż oba systemy dzielą te same podstawowe funkcje czatu, implementacje TextChatService są ogólnie bardziej zrównoważone i łatwiejsze do iteracji.
| Funkcjonalność | Legacy czat | TextChatService | Różnice |
|---|---|---|---|
| Wyślij wiadomość czatu | Players:Chat() | TextChannel:SendAsync() | Metoda SendAsync() obsługuje bardziej zaawansowane funkcje czatu, takie jak formatowanie bogatego tekstu i priorytet wiadomości. Zawiera również wbudowane filtrowanie, aby pomóc zapobiegać wysyłaniu nieodpowiednich wiadomości. |
| Implementuj wywołania zwrotne wiadomości | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | System czatu legacy wiąże funkcję z wydarzeniami systemu czatu w celu dostarczania wiadomości. Dwie metody TextChatService oferują lepszą elastyczność i dostosowanie. |
| Dodaj niestandardowe polecenia czatu | Moduł ChatService/ChatCommand | TextChatCommand | TextChatService ma dedykowaną klasę dla poleceń tekstowych, zamiast używać modułu czatu legacy. |
| Wyświetl wiadomość systemową | StarterGui:SetCore() używając ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | Wywołanie zwrotne TextChannel.OnIncomingMessage może zwrócić instancję TextChatMessageProperties, aby dostosować wygląd wiadomości. |
| Wyłącz czat | Moduł ChatWindow/ChatSettings do ukrywania okna czatu | ChatWindowConfiguration.Enabled |
Filtrowanie wiadomości
TextChatService automatycznie filtruje wiadomości czatu na podstawie informacji o koncie każdego gracza, więc nie musisz ręcznie wdrażać filtrowania tekstu dla wszystkich rodzajów wiadomości czatu.
| Funkcjonalność | Legacy czat | TextChatService |
|---|---|---|
| Filtruj wiadomość czatu dla pojedynczego gracza | Chat:FilterStringAsync() | Automatyczne |
| Filtruj wiadomości nadawcze | Chat:FilterStringForBroadcast() | Automatyczne |
Okno czatu i czat bąbelkowy
Zarówno zachowanie i opcje dostosowywania okna czatu, jak i czatu bąbelkowego w TextChatService są identyczne z tymi w systemie czatu legacy. Ponieważ system czatu legacy pozwalał tylko na dostosowywanie za pomocą modułów czatu lub kontenera Players, usługa zapewnia dedykowane klasy (ChatWindowConfiguration i BubbleChatConfiguration) do zarządzania wszystkimi właściwościami okna czatu i czatu bąbelkowego. Dodatkowo możesz łatwo dostosować i podglądać właściwości wyglądu i zachowania czatu bąbelkowego za pomocą ustawień Studio, zamiast musieć je wszystkie skryptować.
| Funkcjonalność | Legacy czat | TextChatService |
|---|---|---|
| Włącz okno czatu | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
| Włącz czat bąbelkowy | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
| Ustaw właściwości okna czatu | Players:SetChatStyle() | ChatWindowConfiguration |
| Ustaw właściwości czatu bąbelkowego | Chat:SetBubbleChatSettings() Chat.BubbleChatSettingsChanged() Players.BubbleChat Players:SetChatStyle() | BubbleChatConfiguration |
| Włącz bąbelki NPC | Chat:Chat() | TextChatService:DisplayBubble() |
Migracja "dodatkowych danych" mówcy
Legacy system czatu Lua pozwalał deweloperom używać SetExtraData w klasie Speaker. Te dane były używane do formatowania koloru nazwy, koloru czatu lub do stosowania tagów nazw dla danego mówcy.
-- Przykład ustawiania dodatkowych danych na mówcy w legacy systemie czatu
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 nie ma bezpośredniego odpowiednika SetExtraData. Zamiast tego użyj wywołań zwrotnych takich jak OnWindowAdded, aby dostosować wygląd wiadomości za pomocą bogatego tekstu na podstawie TextSource wiadomości.
Poniżej znajduje się przykład emulacji "dodatkowych danych" legacy Lua czatu poprzez dostęp do atrybutów obiektów Player:
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)Następnie możesz użyć wywołania zwrotnego OnChatWindowAdded, aby dostosować wygląd okna czatu na podstawie atrybutów ustawionych na graczu:
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