Roblox oferuje wiadomości tekstowe między graczami w czasie rzeczywistym za pośrednictwem TextChatService, klasy singleton odpowiedzialnej za zarządzanie ogólnym systemem czatu, w tym filtrowaniem wiadomości czatu, moderacją oraz 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ń, aby wykonać określone działania.
Konfiguracja UI
TextChatService oferuje domyślny interfejs użytkownika, który można dostosować do potrzeb twojego doświadczenia. Wyłącz dowolną z tych konfiguracji, aby ukryć jej powiązaną element interfejsu użytkownika. W razie potrzeby możesz również zastąpić te elementy interfejsu użytkownika 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 na serwer, 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ływana jest metoda AddUserAsync(). Źródła tekstowe zawierają szczegółowe uprawnienia użytkownika w kanale, takie jak jego zdolność do wysyłania wiadomości. Jeśli jeden użytkownik znajduje się w wielu kanałach tekstowych, jest związany 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 — Umożliwia użytkownikom wywoływanie konkretnych akcji lub zachowań, wysyłając wiadomości, które odpowiadają właściwościom PrimaryAlias lub SecondaryAlias. Polecenia czatu muszą być powiązane z TextChatService, aby działały.
Schemat przepływu czatu
Czat tekstowy używa modelu klient-serwer, z klientem wysyłającym, serwerem oraz klientami odbierającymi.

Gracz wysyła wiadomość ze swojego 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, uruchamia zdarzenie TextChatService.SendingMessage, aby wyświetlić wiadomość nadawcy na kliencie wysyłającym. Jednocześnie TextChannel:SendAsync() przekazuje wiadomość na serwer.
Serwer uruchamia TextChannel.ShouldDeliverCallback, aby określić, czy dostarczyć wiadomość innym graczom na podstawie uprawnień i wymagań filtracji społeczności Roblox.
Jeśli TextChannel.ShouldDeliverCallback określa, że wiadomość jest uprawniona do dostarczenia innym graczom, serwer stosuje jakiekolwiek filtry i uruchamia TextChannel.OnIncomingMessage dwukrotnie:
Po raz pierwszy na kliencie wysyłającym, co sygnalizuje, że serwer przetwarza wiadomość poprzez zdarzenie 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 filtracji.
Po raz drugi jest to na klientach odbierających, co wywołuje zdarzenie TextChatService.MessageReceived, aby wyświetlić wiadomość innym graczom.
Hooki i callbacki czatu tekstowego
API TextChatService zachęca do wyraźnego rozdzielenia wyglądu i dostarczania wiadomości czatu. Wiele instancji systemu czatu tekstowego zapewnia hooki i callbacki do formatowania w scentralizowanych, wyraźnych lokalizacjach.

Warunkowe dostarczanie wiadomości
Callback TextChannel.ShouldDeliverCallback powinien być zdefiniowany tylko na serwerze. Callback jest uruchamiany dla każdego dziecka TextSource kanału tekstowego, gdy wiadomość jest wysyłana, aby określić, czy wiadomość powinna być dostarczona. Ten callback może być użyty do wdrożenia niestandardowej logiki dostarczania wiadomości, która może zależeć od dodatkowego kontekstu rozgrywki, takiego jak:
- Czat oparty na odległości, gdzie użytkownicy mogą wysyłać wiadomości tylko do osób bliskich.
- Zapobieganie użytkownikom z pewnymi atrybutami od wysyłania wiadomości do innych.
Dostosuj wyświetlanie 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 callbacków do formatowania wiadomości przed ich wyświetleniem użytkownikom, na przykład aby dodać kolory lub etykiety czatu do nazw użytkowników lub formatować treść wiadomości.
Następujące callbacki są wywoływane dla każdej TextChatMessage, która ma być wyświetlona, co pozwala dostosować wygląd okna czatu w zależności od zawartości TextChannel, TextSource lub TextChatMessage. Gdy klient wysyła wiadomość, te callbacki są wywoływane raz, gdy wiadomość jest przesyłana do serwera, a wartość TextChatMessage.Status będzie równa Enum.TextChatMessageStatus.Sending. Gdy wiadomość zostanie odebrana przez serwer i jest wysyłana do innych użytkowników, klient nadawcy otrzymuje wiadomość ponownie z zaktualizowaną wartością Enum.TextChatMessageStatus.
- TextChatService.OnIncomingMessage — Ten callback powinien być zdefiniowany tylko na kliencie. Callback jest uruchamiany, gdy wiadomość jest odbierana, albo z serwera, albo jeśli lokalny klient właśnie wysłał wiadomość. Callback jest wywoływany dla każdej TextChatMessage otrzymanej ze wszystkich instancji TextChannel i jest pierwszym, który przetwarza wiadomość przed jej wyświetleniem użytkownikowi.
- TextChannel.OnIncomingMessage — Ten callback powinien być zdefiniowany tylko na kliencie. Callback jest uruchamiany, gdy wiadomość jest odbierana z serwera. Callback jest wywoływany dla każdej TextChatMessage otrzymanej z TextChannel. Domyślne instancje TextChannel utworzone za pomocą TextChatService.CreateDefaultTextChannels mają zdefiniowany ten callback i można je nadpisywać.
- TextChatService.OnBubbleAdded — Ten callback powinien być zdefiniowany 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 — Ten callback powinien być zdefiniowany 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 dziedzicznego czatu
Ta sekcja pomoże Ci w migracji z dziedzicznego systemu czatu, oferując alternatywne metody do implementacji wspólnych funkcjonalności i zachowań czatu za pomocą TextChatService.
W oknie Eksplorera wybierz TextChatService.
W oknie Właściwości znajdź rozwijane menu ChatVersion i wybierz TextChatService.

Podstawowe funkcjonalności
Chociaż oba systemy mają te same podstawowe funkcjonalności czatu, implementacje TextChatService są ogólnie bardziej zrównoważone i łatwiejsze do iteracji.
| Funkcjonalność | Dziedziczny czat | TextChatService | Różnice |
|---|---|---|---|
| Wyślij wiadomość czatu | Players:Chat() | TextChannel:SendAsync() | Metoda SendAsync() obsługuje bardziej zaawansowane funkcje czatu, takie jak formatowanie bogatym tekstem i priorytet wiadomości. Zawiera również wbudowane filtrowanie, aby zapobiegać wysyłaniu nieodpowiednich wiadomości. |
| Implementuj callbacki wiadomości | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | Dziedziczny system czatu wiąże funkcję z zdarzeniami systemu czatu w celu dostarczania wiadomości. Dwie metody TextChatService oferują lepszą elastyczność i dostosowywanie. |
| Dodaj niestandardowe polecenia czatu | Moduł ChatService/ChatCommand | TextChatCommand | TextChatService ma dedykowaną klasę dla poleceń tekstowych, a nie korzysta z modułu czatu dziedzicznego. |
| Wyświetl wiadomość systemową | StarterGui:SetCore() używając ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | Callback TextChannel.OnIncomingMessage może zwracać instancję TextChatMessageProperties, aby dostosować wygląd wiadomości. |
| Wyłącz czat | Ustawienia doświadczenia w Studio i 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 wszelkiego rodzaju wiadomości czatu.
| Funkcjonalność | Dziedziczny czat | TextChatService |
|---|---|---|
| Filtruj wiadomości czatu dla poszczególnego gracza | Chat:FilterStringAsync() | Automatyczny |
| Filtruj wiadomości radiowe | Chat:FilterStringForBroadcast() | Automatyczny |
Okno czatu i czat bąbelkowy
Zarówno okno czatu, jak i czat bąbelkowy mają identyczne zachowania i opcje dostosowywania w porównaniu do dziedzicznego systemu czatu. Ponieważ dziedziczny system czatu 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. Ponadto możesz łatwo dostosować i podglądać swoje właściwości wyglądu i zachowania czatu bąbelkowego za pomocą ustawień Studio, zamiast musieć je programować.
| Funkcjonalność | Dziedziczny 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 dymki NPC | Chat:Chat() | TextChatService:DisplayBubble() |
Migracja dodatkowych danych mówcy
Dziedziczny system czatu Lua pozwalał programistom na używanie SetExtraData w klasie Speaker. Te dane były używane do formatowania koloru nazwy, koloru czatu lub do stosowania etykiet nazwy dla danego mówcy.
DZIEDZICZNY SYSTEM CZATU SetExtraData
-- Przykład ustawiania dodatkowych danych dla mówcy w dziedzicznym 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 dla SetExtraData. Zamiast tego użyj callbacków takich jak OnWindowAdded, aby dostosować wygląd wiadomości używając bogatego tekstu na podstawie TextSource wiadomości.
Poniżej znajduje się przykład emulowania "dodatkowych danych" z dziedzicznego czatu Lua, 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ć callbacka OnChatWindowAdded, aby dostosować wygląd okna czatu na podstawie atrybutów ustawionych dla gracza:
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