Roblox oferuje komunikację tekstową między graczami w rzeczywistych sesjach za pośrednictwem TextChatService, singletonowej klasy odpowiedzialnej za zarządzanie ogólnym systemem czatu, w tym filtrowaniem wiadomości czatu, moderacją i uprawnieniami użytkowników. Ta usługa ma standardową funkcjonalność, a także oferuje zestaw metod i zdarzeń do rozszerzenia i dostosowania czatu, takich jak dostarczanie wiadomości na podstawie dostosowanych wymagań, dodawanie specjalnych uprawnień lub moderacji dla konkretnych graczy oraz tworzenie niestandardowych poleceń do wykonywania konkretnych akcji.
Konfiguracja interfejsu użytkownika
TextChatService dostarcza domyślny interfejs użytkownika, który można dostosować do potrzeb twojej gry. Wyłącz dowolną z tych konfiguracji, aby ukryć powiązany z nią element UI. W razie potrzeby możesz również zastąpić te elementy UI niestandardowymi interfejsami:
Aby uzyskać więcej informacji, zobacz Okno czatu oraz Czat balonowy.
Kanały, wiadomości i polecenia
TextChannel — Kanały tekstowe przekazują wiadomości wysyłane przez użytkownika z klienta do serwera, który następnie wyświetla je innym użytkownikom na podstawie uprawnień. Kanały tekstowe muszą być powiązane z TextChatService, aby działały.
TextSource — Użytkownik w TextChannel. Źródła tekstowe są bezpośrednio powiązane z TextChannel, gdy wywołana jest AddUserAsync(). Źródła tekstowe zawierają szczegółowe uprawnienia użytkownika w kanale, takie jak możliwość wysyłania wiadomości. Jeśli jeden 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ść oraz znacznik czasu utworzenia.
TextChatCommand — Pozwala użytkownikom wzywać określone akcje lub zachowania, wysyłając wiadomości, które pasują do właściwości PrimaryAlias lub SecondaryAlias. Polecenia czatu muszą być powiązane z TextChatService, aby działały.
Schemat blokowy czatu
Czat tekstowy korzysta z modelu klient-serwer, z klientem wysyłającym, serwerem oraz klientami odbierającymi.

Gracz wysyła wiadomość ze swojego lokalnego urządzenia, uruchamiając 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, wyzwala zdarzenie TextChatCommand.Triggered, aby wykonać zdefiniowaną akcję. Nie są wymagane żadne dalsze kroki.
Jeśli wiadomość jest zwykłą wiadomością czatu, wyzwala zdarzenie TextChatService.SendingMessage, aby wyświetlić wiadomość nadawcy na wysyłającym kliencie. W tym samym czasie TextChannel:SendAsync() przekazuje wiadomość do serwera.
Serwer wyzwala TextChannel.ShouldDeliverCallback, aby określić, czy dostarczyć wiadomość innym graczom na podstawie uprawnień i wymagań filtracji społeczności Roblox.
Jeśli TextChannel.ShouldDeliverCallback ustala, że wiadomość kwalifikuje się do dostarczenia innym graczom, serwer stosuje wszelkie filtry i wyzwala TextChannel.OnIncomingMessage dwukrotnie:
Po raz pierwszy na wysyłającym kliencie, co sygnalizuje, że serwer przetwarza wiadomość przez zdarzenie TextChatService.MessageReceived. To zdarzenie zastępuje lokalną wiadomość na wysyłającym kliencie przetworzoną wiadomością z serwera. Wiadomość jest identyczna, jeśli oryginalna nie wymagała filtrowania.
Po raz drugi na klientach odbierających, co wyzwala zdarzenie TextChatService.MessageReceived, aby wyświetlić wiadomość innym graczom.
Haki czatu i wywołania zwrotne
API TextChatService zachęca do wyraźnego rozdzielenia wyglądu i dostarczania wiadomości czatu. Wielokrotne instancje systemu czatu tekstowego zapewniają haki i wywołania zwrotne do formatowania w centralnych, przejrzystych lokalizacjach.

Warunkowe dostarczanie wiadomości
Wywołanie zwrotne TextChannel.ShouldDeliverCallback powinno być definiowane tylko na serwerze. Wywołanie to jest wyzwalane 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że być używane do implementacji 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 znajdują się w ich pobliżu.
- Zapobieganie użytkownikom z określonymi atrybutami w wysyłaniu wiadomości do innych.
Dostosowanie wyświetlania wiadomości
Domyślny interfejs użytkownika TextChatService opiera się na bogatym tekście do formatowania i dostosowania, jak wiadomości są wyświetlane. Możesz używać następujących wywołań zwrotnych do formatowania wiadomości przed ich wyświetleniem użytkownikom, na przykład dodawania kolorów lub znaczników czatu do nazw użytkowników lub formatowania treści wiadomości.
Poniższe wywołania zwrotne są wyzwalane 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 i wartość TextChatMessage.Status będzie Enum.TextChatMessageStatus.Sending. Gdy wiadomość jest odbierana przez serwer i jest dostarczana do innych użytkowników, klient nadawcy otrzymuje wiadomość ponownie z zaktualizowaną wartością Enum.TextChatMessageStatus.
- TextChatService.OnIncomingMessage — To wywołanie zwrotne powinno być definiowane tylko na kliencie. To wywołanie jest wyzwalane, gdy wiadomość jest odbierana, either z serwera, albo jeśli lokalny klient właśnie wysłał wiadomość. To wywołanie jest wywoływane dla każdej TextChatMessage odbieranej ze wszystkich instancji TextChannel i jest pierwszym, które przetwarza wiadomość przed jej wyświetleniem użytkownikowi.
- TextChannel.OnIncomingMessage — To wywołanie zwrotne powinno być definiowane tylko na kliencie. To wywołanie jest wyzwalane, gdy wiadomość jest odbierana z serwera. To wywołanie jest wywoływane dla każdej TextChatMessage odbieranej z TextChannel. Domyślne instancje TextChannel, utworzone z TextChatService.CreateDefaultTextChannels, mają to wywołanie zwrotne zdefiniowane i można je nadpisać.
- TextChatService.OnBubbleAdded — To wywołanie zwrotne powinno być definiowane tylko na kliencie. Użyj go do dostosowania wyglądu dymkó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 do dostosowania wyglądu wiadomości czatu w interfejsie użytkownika okna czatu niezależnie od wyglądu wiadomości w dymkach czatu.
Migracja z poprzedniego systemu czatu
Ta sekcja pomoże ci w migracji z poprzedniego systemu czatu, dostarczając alternatywne metody implementacji powszechnych funkcji i zachowań czatu za pomocą TextChatService.
W oknie Eksploratora wybierz TextChatService.
W oknie Właściwości znajdź rozwijane menu ChatVersion i wybierz TextChatService.

Podstawowe funkcje
Chociaż oba systemy dzielą te same podstawowe funkcje czatu, implementacje TextChatService są ogólnie bardziej trwałe i łatwiejsze do iteracji.
| Funkcja | Stary czat | TextChatService | Różnice |
|---|---|---|---|
| Wysyłanie wiadomości 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 w zapobieganiu wysyłania niewłaściwych wiadomości. |
| Implementacja wywołań zwrotnych wiadomości | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | System czatu z poprzedniej wersji wiąże funkcję z zdarzeniami systemu czatu w celu dostarczania wiadomości. Dwie metody TextChatService oferują lepszą elastyczność i dostosowanie. |
| Dodawanie niestandardowych poleceń czatu | Moduł ChatService/ChatCommand | TextChatCommand | TextChatService ma dedykowaną klasę dla poleceń tekstowych, zamiast używać modułu czatu z poprzedniej wersji. |
| Wyświetlanie wiadomości systemowej | StarterGui:SetCore() używając ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | Wywołanie zwrotne TextChannel.OnIncomingMessage może zwracać instancję TextChatMessageProperties, aby dostosować wygląd wiadomości. |
| Wyłącz czat | Ustawienia doświadczenia w Studio oraz 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 implementować filtrowania tekstu dla wszystkich rodzajów wiadomości czatu.
| Funkcja | Stary czat | TextChatService |
|---|---|---|
| Filtruj wiadomości czatu dla indywidualnego gracza | Chat:FilterStringAsync() | Automatyczne |
| Filtruj wiadomości nadawane | Chat:FilterStringForBroadcast() | Automatyczne |
Okno i czat balonowy
Zarówno zachowanie okna czatu, jak i czatu balonowego oraz opcje dostosowywania TextChatService są identyczne jak w przypadku systemu czatu z poprzedniej wersji. Ponieważ system czatu z poprzedniej wersji pozwalał tylko na dostosowywanie z wykorzystaniem modułów czatu lub kontenera Players, usługa oferuje dedykowane klasy (ChatWindowConfiguration i BubbleChatConfiguration) do zarządzania wszystkimi właściwościami okna czatu i czatu balonowego. Dodatkowo możesz łatwo dostosować i podglądać właściwości swojego wyglądu i zachowania czatu balonowego za pomocą ustawień Studio, zamiast musieć skryptować je wszystkie.
| Funkcja | Stary czat | TextChatService |
|---|---|---|
| Włącz okno czatu | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
| Włącz czat balonowy | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
| Ustaw właściwości okna czatu | Players:SetChatStyle() | ChatWindowConfiguration |
| Ustaw właściwości czatu balonowego | Chat:SetBubbleChatSettings() Chat.BubbleChatSettingsChanged() Players.BubbleChat Players:SetChatStyle() | BubbleChatConfiguration |
| Włącz dymki NPC | Chat:Chat() | TextChatService:DisplayBubble() |
Migracja "dodatkowych danych" mówiącego
Z przestarzałego systemu czatu Lua deweloperzy mogli korzystać z SetExtraData w klasie Speaker. Dane te były używane do formatowania koloru nazwy, koloru czatu lub stosowania etykiet nazw dla danego mówiącego.
System czatu z przestarzałej wersji SetExtraData
-- Przykład ustawienia dodatkowych danych na mówiącym w systemie czatu z przestarzałej wersji
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 = "TwojaNazwaEtykiety", TagColor = Color3.fromRGB(0, 255, 0)}, {TagText = "InnaNazwaEtykiety", 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 w oparciu o TextSource danej wiadomości.
Poniższy przykład emuluje "dodatkowe dane" czatu Lua z poprzedniej wersji, uzyskując dostęp do atrybutów obiektów Player:
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)
Następnie możesz użyć wywołania zwrotnego OnChatWindowAdded, aby dostosować wygląd okna czatu na podstawie atrybutów ustawionych na graczu:
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)'>[TwojaEtykieta]</font> {overrideProperties.PrefixText}`
end
local isOtherTag = player:GetAttribute("isOtherTag")
if isOtherTag == true then
overrideProperties.PrefixText = `<font color='rgb(255, 0, 0)'>[InnaEtykieta]</font> {overrideProperties.PrefixText}`
end
return overrideProperties
end
end
return nil
end