Przegląd czatu tekstowego

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

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.

Schemat przepływu czatu tekstowego w doświadczeniu.
  1. 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.

  2. Serwer uruchamia TextChannel.ShouldDeliverCallback, aby określić, czy dostarczyć wiadomość innym graczom na podstawie uprawnień i wymagań filtracji społeczności Roblox.

  3. Jeśli TextChannel.ShouldDeliverCallback określa, że wiadomość jest uprawniona do dostarczenia innym graczom, serwer stosuje jakiekolwiek filtry i uruchamia TextChannel.OnIncomingMessage dwukrotnie:

    1. 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.

    2. 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.

Schemat kolejności callbacków TextChatService

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.

  1. W oknie Eksplorera wybierz TextChatService.

  2. 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 czatTextChatServiceRóżnice
Wyślij wiadomość czatuPlayers: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ściChat: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 czatuModuł ChatService/ChatCommandTextChatCommandTextChatService ma dedykowaną klasę dla poleceń tekstowych, a nie korzysta z modułu czatu dziedzicznego.
Wyświetl wiadomość systemowąStarterGui:SetCore() używając ChatMakeSystemMessageTextChannel:DisplaySystemMessage()Callback TextChannel.OnIncomingMessage może zwracać instancję TextChatMessageProperties, aby dostosować wygląd wiadomości.
Wyłącz czatUstawienia doświadczenia w Studio i moduł ChatWindow/ChatSettings do ukrywania okna czatuChatWindowConfiguration.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 czatTextChatService
Filtruj wiadomości czatu dla poszczególnego graczaChat:FilterStringAsync()Automatyczny
Filtruj wiadomości radioweChat: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ć.

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
©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.