文本聊天概述

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

Roblox 通过 TextChatService 提供玩家之间的基于文本的消息传递,这是一个负责管理整体聊天系统的单例类,包括聊天消息过滤、管理和用户权限。该服务具有其标准功能,并提供一组方法和事件以扩展和自定义聊天,例如根据 自定义要求 发送消息、为特定玩家添加特殊权限或管理,以及创建 自定义命令 来执行特定操作。

UI 配置

TextChatService 提供一个默认的 UI,可以根据您的游戏需求进行自定义。禁用这些配置中的任何一个以隐藏其相关的 UI 元素。如果需要,您还可以用自定义界面替换这些 UI 元素:

有关更多信息,请参见 聊天窗口气泡聊天

频道、消息和命令

聊天流程图

文本聊天使用 客户端-服务器 模型,包括 发送客户端服务器接收客户端

游戏内文本聊天的流程图。
  1. 玩家从其本地设备发送消息,触发 TextChannel:SendAsync() 方法。该方法处理消息并确定它是聊天命令还是常规聊天消息。

  2. 服务器触发 TextChannel.ShouldDeliverCallback 以根据权限和 Roblox 社区过滤要求确定是否将消息传递给其他玩家。

  3. 如果 TextChannel.ShouldDeliverCallback 确定消息可以传递给其他玩家,服务器将应用任何过滤器并触发 TextChannel.OnIncomingMessage 两次:

    1. 第一次是在发送客户端上,表示服务器正在通过 TextChatService.MessageReceived 事件处理消息。此事件用来自服务器的处理消息替换发送客户端上的本地消息。如果原始消息不需要过滤,则消息是相同的。

    2. 第二次是在接收客户端上,触发 TextChatService.MessageReceived 事件以将消息显示给其他玩家。

文本聊天钩子和回调

TextChatService API 鼓励在聊天消息的外观和传递之间进行清晰的分离。多个文本聊天系统实例提供钩子和回调,以在集中、清晰的位置格式化。

TextChatService 回调顺序的流程图

有条件地传递消息

TextChannel.ShouldDeliverCallback 回调应仅在服务器上定义。每当发送消息时,该回调会为文本频道的每个 TextSource 子项触发,以确定消息是否应传递。此回调可用于实现可能依赖于额外游戏上下文的自定义消息传递逻辑,例如:

  • 基于接近的聊天,用户只能向靠近他们的人发送消息。
  • 防止具有某些属性的用户向其他人发送消息。

自定义消息显示

默认的 TextChatService UI 依赖于 富文本 来格式化和自定义消息的显示方式。您可以使用以下回调在消息显示给用户之前格式化消息,例如添加颜色或 聊天标签 到用户名或格式化消息内容。

以下回调在每个即将显示的 TextChatMessage 上调用,这使您可以根据 TextChannelTextSourceTextChatMessage 内容自定义聊天窗口外观。当客户端发送消息时,这些回调在消息发送到服务器时调用一次,TextChatMessage.Status 值将为 Enum.TextChatMessageStatus.Sending。一旦消息被服务器接收并正在传递给其他用户,发送客户端将再次接收到消息,并带有更新的 Enum.TextChatMessageStatus 值。

从遗留聊天迁移

本节通过提供替代方法来帮助您从遗留聊天系统迁移,以使用 TextChatService 实现常见聊天功能和行为。

  1. 资源管理器 窗口中,选择 TextChatService

  2. 属性 窗口中,找到 ChatVersion 下拉菜单并选择 TextChatService

基本功能

尽管两个系统共享相同的基本聊天功能,但 TextChatService 的实现通常更可持续且更易于迭代。

功能遗留聊天TextChatService差异
发送聊天消息Players:Chat()TextChannel:SendAsync()SendAsync() 方法支持更高级的聊天功能,例如富文本格式和消息优先级。它还包括内置过滤器,以帮助防止不当消息的发送。
实现消息回调Chat:InvokeChatCallback()
Chat:RegisterChatCallback()
TextChatService.SendingMessage
TextChatService.OnIncomingMessage
遗留聊天系统将函数绑定到聊天系统事件以传递消息。TextChatService 的这两种方法提供了更好的灵活性和自定义。
添加自定义聊天命令ChatService/ChatCommand 模块TextChatCommandTextChatService 有一个专门的类用于文本命令,而不是使用遗留聊天模块。
显示系统消息StarterGui:SetCore() 使用 ChatMakeSystemMessageTextChannel:DisplaySystemMessage()TextChannel.OnIncomingMessage 回调可以返回 TextChatMessageProperties 实例以自定义消息外观。
禁用聊天ChatWindow/ChatSettings 模块用于隐藏聊天窗口ChatWindowConfiguration.Enabled

消息过滤

TextChatService 会根据每个玩家的帐户信息自动过滤聊天消息,因此您无需手动实现所有类型聊天消息的文本过滤。

功能遗留聊天TextChatService
为单个玩家过滤聊天消息Chat:FilterStringAsync()自动
过滤广播消息Chat:FilterStringForBroadcast()自动

窗口和气泡聊天

TextChatService聊天窗口气泡聊天 行为和自定义选项与遗留聊天系统相同。由于遗留聊天系统仅允许使用聊天模块或 Players 容器进行自定义,因此该服务提供专门的类(ChatWindowConfigurationBubbleChatConfiguration)来管理所有聊天窗口和气泡聊天属性。此外,您可以轻松调整和预览气泡聊天的外观和行为属性,使用 Studio 设置,而不必全部编写脚本。

迁移发言者“额外数据”

遗留 Lua 聊天系统允许开发者在 Speaker 类上使用 SetExtraData。这些数据用于格式化名称颜色、聊天颜色或为给定发言者应用名称标签。

遗留聊天系统 SetExtraData
-- 在遗留聊天系统中设置发言者的额外数据的示例
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 没有直接等同于 SetExtraData 的方法。相反,使用 回调 例如 OnWindowAdded 来根据消息的 TextSource 使用富文本自定义消息的外观。

以下是通过访问 Player 对象上的属性来模拟遗留 Lua 聊天的“额外数据”的示例:

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)

然后,您可以使用 OnChatWindowAdded 回调根据设置在玩家上的属性自定义聊天窗口的外观:

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、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。