Roblox ofrece mensajería de texto entre jugadores en sesiones en vivo a través de TextChatService .Este servicio tiene su funcionalidad estándar, pero también proporciona un conjunto de métodos y eventos para extender y personalizar el chat, como entregar mensajes basados en requisitos personalizados , agregar permisos o moderación especiales a jugadores específicos y crear comandos personalizados para ejecutar acciones específicas.
Las siguientes secciones resumen las clases y instancias principales que puedes usar para personalizar el sistema de chat.
Configuración de primer nivel
La clase singleton TextChatService es responsable de gestionar el sistema de chat general, incluida la gestión de la filtración de mensajes de chat, la moderación y los permisos de usuario.Usa propiedades como CreateDefaultTextChannels y CreateDefaultCommands para habilitar o deshabilitar los canales y comandos de chat predeterminados
Configuración predeterminada de la interfaz de usuario
TextChatService proporciona una interfaz de usuario predeterminada que se puede personalizar para adaptarse a las necesidades de tu experiencia.Cada una de estas configuraciones se puede desactivar para ocultar el elemento de interfaz asociado y se puede reemplazar por interfaces personalizadas si se desea.
- ChatWindowConfiguration — Representa la interfaz de usuario de la ventana de chat predeterminada, incluida su apariencia y comportamiento. Desactivarla para ocultar la ventana de chat
- ChatInputBarConfiguration — Representa la interfaz de usuario de la barra de entrada de chat predeterminada, incluida su apariencia y comportamiento.
- BubbleChatConfiguration — Representa la interfaz de usuario predeterminada de burbujas de chat, incluyendo su apariencia y comportamiento.
Canales, mensajes y comandos
TextChannel — Representa un canal de chat de texto que transmite mensajes de chat enviados por el usuario desde el cliente al servidor, que luego los muestra a otros usuarios según las permisos.Estas instancias deben ser padres de TextChatService para funcionar.
TextSource — Representa a un usuario en un TextChannel.Estas instancias se asignan directamente al TextChannel cuando se llama AddUserAsync().Las fuentes de texto contienen permisos detallados de un usuario en el canal, como su capacidad de enviar mensajes.Un solo usuario se puede asociar con múltiples fuentes de texto si se han agregado a múltiples canales de texto.
TextChatMessage — Representa un solo mensaje de chat en un canal de texto, con información básica como el remitente del mensaje, el mensaje original, el mensaje filtrado y el tiempo de creación.
TextChatCommand — Permite que los usuarios invoquen acciones o comportamientos específicos enviando mensajes que coincidan con PrimaryAlias o SecondaryAlias.Estas instancias deben ser padres de TextChatService para que funcionen.
Diagrama de flujo del chat
El chat de texto usa el modelo cliente-servidor , con un cliente de envío, el servidor y los clientes de recepción.

Un jugador envía un mensaje desde su dispositivo local, lo que activa el método TextChannel:SendAsync().Este método procesa el mensaje y determina si es un comando de chat o un mensaje de chat normal.
Si el mensaje es un comando de chat, se activa el evento TextChatCommand.Triggered para realizar la acción definida. No se requieren pasos adicionales.
Si el mensaje es un mensaje de chat regular, se activa el evento TextChatService.SendingMessage para mostrar el mensaje al remitente en el cliente de envío.Al mismo tiempo, TextChannel:SendAsync() envía el mensaje al servidor
El servidor lanza TextChannel.ShouldDeliverCallback para determinar si debe enviar el mensaje a otros jugadores en función de los permisos y los requisitos de filtrado de la comunidad de Roblox.
Si TextChannel.ShouldDeliverCallback determina que ese mensaje es elegible para entregar a otros jugadores, el servidor aplica cualquier filtro y dispara TextChannel.OnIncomingMessage dos veces:
La primera vez es en el cliente de envío y señala que el servidor está procesando el mensaje a través del evento TextChatService.MessageReceived.Este evento reemplaza el mensaje local del cliente de envío con el mensaje procesado del servidor.El mensaje es idéntico si el original no requiere filtrado.
La segunda vez es en los clientes receptores, que activan el evento TextChatService.MessageReceived para mostrar el mensaje a otros jugadores.
Ganchos y llamadas de devolución de texto
La API TextChatService alienta una separación clara en la apariencia y la entrega de mensajes de chat.Múltiples instancias del sistema de chat de texto proporcionan ganchos y llamadas de devolución para formatar en ubicaciones centralizadas y claras.

| Devolución de llamada | Valor de devolución | | ----------------------------------------- | ----------------------------------- | | | boolean | | | | | | | | | | | | | | | | | |
Entregar mensajes de forma condicional
El retorno de llamada TextChannel.ShouldDeliverCallback debe definirse solo en el servidor.El retorno de llamada se activa para cada TextSource hijo del canal de texto cuando se envía un mensaje para determinar si el mensaje debe ser entregado.Esta llamada de devolución se puede utilizar para implementar lógica de entrega de mensajes personalizada que puede depender de un contexto de juego adicional, como:
- Chat basado en proximidad donde los usuarios solo pueden enviar mensajes a aquellos que estén cerca de ellos.
- Impedir que los usuarios con ciertos atributos envíen mensajes a otros.
Personalizar la visualización de mensajes
La interfaz de usuario predeterminada TextChatService depende de texto enriquecido para formatear y personalizar cómo se muestran los mensajesPuedes usar las siguientes llamadas de devolución para formatear mensajes antes de que se muestren a los usuarios, por ejemplo, para agregar colores o etiquetas de chat a los nombres de usuario o para formatear el contenido del mensaje.
Los siguientes llamados de devolución se realizan cada TextChatMessage que está a punto de ser mostrado, lo que te permite personalizar la apariencia de la ventana de chat en función del contenido TextChannel, TextSource o TextChatMessage.Cuando un cliente envía un mensaje, estas llamadas de devolución se realizan una vez cuando se envía el mensaje al servidor y el valor de TextChatMessage.Status será Enum.TextChatMessageStatus.Sending.Una vez que el mensaje es recibido por el servidor y se está entregando a otros usuarios, el cliente remitente recibe el mensaje nuevamente con un valor actualizado de Enum.TextChatMessageStatus.
- TextChatService.OnIncomingMessage — Este devolución de llamada debe definirse solo en el cliente.La llamada de devolución se activa cuando se recibe un mensaje, ya sea del servidor o si el cliente local acaba de enviar un mensaje.La llamada de devolución se realiza en cada TextChatMessage recibida de todas las TextChannel instancias y es la primera en procesar el mensaje antes de que se muestre al usuario.
- TextChannel.OnIncomingMessage — Este devolución de llamada debe definirse solo en el cliente.La llamada de devolución se activa cuando se recibe un mensaje del servidor.La llamada de devolución se realiza en cada TextChatMessage recibida de la TextChannel.Las instancias predeterminadas TextChannel creadas a partir de TextChatService.CreateDefaultTextChannels tienen este llamado de devolución definido y se pueden reemplazar.
- TextChatService.OnBubbleAdded — Este devolución de llamada debe definirse solo en el cliente.Úselo para personalizar la apariencia de las burbujas de chat independientemente de la apariencia del mensaje en la interfaz de usuario de la ventana de chat.
- TextChatService.OnChatWindowAdded — Este devolución de llamada debe definirse solo en el cliente.Úselo para personalizar la apariencia de los mensajes de chat en la interfaz de usuario de la ventana de chat independientemente de la apariencia del mensaje en las burbujas de chat.
Migrar de chat legado
Esta sección le ayuda a migrar desde el sistema de chat heredado legado proporcionando métodos alternativos para implementar funcionalidades y comportamientos de chat comunes usando TextChatService .
En la ventana Explorador, seleccione TextChatService.
En la ventana Propiedades, busca el cuadro desplegable ChatVersion y selecciona TextChatService .
Funcionalidades básicas
Aunque ambos sistemas comparten las mismas funcionalidades básicas de chat, las implementaciones de TextChatService son en general más sostenibles y más fáciles de iterar.
Funcionalidad | Chat legado | Servicio de chat de texto | Diferencias |
---|---|---|---|
Enviar un mensaje de chat | Players:Chat() | TextChannel:SendAsync() | El método SendAsync() admite funciones de chat más avanzadas, como el formato de texto enriquecido y la prioridad de mensajes.También incluye filtrado integrado para ayudar a prevenir el envío de mensajes inapropiados. |
Implementar llamadas de devolución de mensaje | Chat:InvokeChatCallback()``Class.Chat:RegisterChatCallback() | Class.TextChatService.SendingMessage``Class.TextChatService.OnIncomingMessage | El sistema de chat heredado vincula una función a los eventos del sistema de chat para enviar mensajes.Los dos métodos de TextChatService ofrecen una mejor flexibilidad y personalización. |
Añade comandos de chat personalizados | ChatService/ChatCommand módulo | TextChatCommand | TextChatService tiene una clase dedicada para comandos de texto en lugar de usar un módulo de chat obsoleto. |
Mostrar un mensaje del sistema | StarterGui:SetCore() usando ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | La llamada de devolución TextChannel.OnIncomingMessage puede devolver una instancia TextChatMessageProperties para personalizar la apariencia del mensaje |
Desactivar chat | Configuración del juego en Studio y ChatWindow/ChatSettings módulo para ocultar la ventana de chat | ChatWindowConfiguration.Enabled |
Filtrado de mensajes
TextChatService filtra automáticamente los mensajes de chat en función de la información de la cuenta de cada jugador, por lo que no necesitas implementar manualmente el filtrado de texto para todos los tipos de mensajes de chat.
Funcionalidad | Chat legado | Servicio de chat de texto |
---|---|---|
Filtrar mensaje de chat para jugador individual | Chat:FilterStringAsync() | automático |
Filtre los mensajes de transmisión | Chat:FilterStringForBroadcast() | automático |
Chat de ventanas y burbujas
El comportamiento y las opciones de personalización de ventana de chat y burbuja de chat son idénticos a los del sistema de chat legado.Como el sistema de chat legado solo permite la personalización usando módulos de chat o el contenedor Players, el servicio proporciona clases dedicadas ( ChatWindowConfiguration y BubbleChatConfiguration ) para administrar todas las propiedades de ventana y burbuja de chat.Además, puedes ajustar y previsualizar fácilmente las propiedades de apariencia y comportamiento del chat de burbujas utilizando las configuraciones de Studio en lugar de tener que programarlas todas.
Funcionalidad | Chat legado | Servicio de chat de texto |
---|---|---|
Habilitar ventana de chat | Class.Chat.LoadDefaultChat``Class.Players.ClassicChat | ChatWindowConfiguration.Enabled |
Habilitar el chat de burbuja | Class.Chat.BubbleChatEnabled``Class.Players.BubbleChat | BubbleChatConfiguration.Enabled |
Establecer las propiedades de la ventana de chat | Players:SetChatStyle() | ChatWindowConfiguration |
Establecer propiedades de chat de burbuja | Chat:SetBubbleChatSettings()``Class.Chat.BubbleChatSettingsChanged()``Class.Players.BubbleChat``Class.Players:SetChatStyle() | BubbleChatConfiguration |
Habilitar burbujas de NPC | Chat:Chat() | TextChatService:DisplayBubble() |
Migrar "datos adicionales" del orador
El sistema de chat legado de Lua permitió a los desarrolladores usar SetExtraData en la clase Speaker.Esta información se utilizó para formatear el color del nombre, el color del chat o para aplicar etiquetas de nombre para un orador determinado.
Sistema de chat legado SetExtraData
-- Un ejemplo de establecer datos adicionales en un altavoz en el sistema de chat legado
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 no tiene un equivalente directo a SetExtraData.En cambio, utilice llamadas de devolución como OnWindowAdded para personalizar la apariencia de los mensajes utilizando texto enriquecido basado en el TextSource del mensaje.
A continuación, se muestra un ejemplo de emular los "datos adicionales" del chat de Lua heredado accediendo a atributos en Player objetos:
SetAttributes de TextChatService
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)
Entonces puedes usar la llamada de devolución OnChatWindowAdded para personalizar la apariencia de la ventana de chat basada en los atributos establecidos en el jugador:
TextChatService en la ventana de chat agregada
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