关于 roblox-textchat-channels
roblox-textchat-channels 是一份技能指南,介绍如何在 Roblox 游戏中使用 TextChatService 创建自定义聊天频道并跨服务器传递消息。它面向配置频道标签、玩家成员关系,以及事件动态或聊天转发的开发者。
主要功能
- 01配置频道标签
- 02创建 TextChannel 并添加成员
- 03显示客户端系统消息
- 04跨服务器转发事件
- 05跨服务器转发玩家聊天
- 06为 MessagingService 调用添加保护
适用场景
- 01设置独立的游戏内聊天标签
- 02在频道中显示游戏事件
- 03向多个服务器广播稀有掉落通知
- 04在游戏服务器间转发聊天
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ flatbedj/ roblox-skills --skill roblox-textchat-channels安装后在 Claude Code 中输入/roblox-textchat-channels确认已加载。
详细介绍
Roblox 自定义聊天:频道、标签页、跨服务器
现代游戏使用 TextChatService(ChatVersion = TextChatService)。以下介绍如何实现真正可切换的频道标签页和跨服务器消息传递,以及其中不太显而易见的部分。
将两个频道显示为标签页(默认关闭的关键设置)
现代默认聊天会把所有内容合并到一个窗口中,除非你启用了频道标签页。需要设置两项,最好在编辑模式下将其设为 场景属性(运行时再设置就太晚了——聊天服务端会先启动——还可能破坏默认连接):
TextChatService.CreateDefaultTextChannels = false— 移除默认的 RBXGeneral/System 标签页,这样就只会显示你的频道。TextChatService.ChannelTabsConfiguration.Enabled = true— 这个开关会让频道以标签页的形式显示。ChannelTabsConfiguration是 TextChatService 下自动创建的子级。开启后,每个自定义TextChannel都会自动变成以其Name命名的标签页,无需单独配置频道。
⚠️ 这两项都是 场景属性 → 必须保存场景才能在不同会话间保留。也可以在运行时的 ChatService.start() 中设置,作为后备方案,但编辑模式/场景中的值才能确保在启动时可靠生效。
创建频道(服务端)
当 CreateDefaultTextChannels = false 时,系统不会自动创建 TextChannels 容器。因此:
local container = TextChatService:FindFirstChild("TextChannels")
if not container then
local f = Instance.new("Folder"); f.Name = "TextChannels"; f.Parent = TextChatService; container = f
end
-- Tab order = CREATION order (there is NO reorder API — it's an open devforum feature request).
-- Create the channel you want leftmost FIRST.
local here = Instance.new("TextChannel"); here.Name = "Here"; here.Parent = container
local global = Instance.new("TextChannel"); global.Name = "Global"; global.Parent = container
玩家加入时,将每位玩家添加到每个频道,使其可以阅读和发送消息:channel:AddUserAsync(player.UserId)(这会创建其 TextSource;请用 pcall 保护调用;此调用会让出执行,因此要按顺序调用)。
将消息显示到频道中(客户端)
textChannel:DisplaySystemMessage(richText) 会仅在调用它的客户端上,将消息显示在对应频道的标签页中。可用它将游戏事件动态内容(抽取结果、公告)显示到指定标签页。支持 RichText,但请先转义用户提供的文本(s:gsub("&","&"):gsub("<","<"):gsub(">",">")),否则玩家可以注入 </font> 标签。
通过 MessagingService 实现跨服务器聊天或事件动态内容
DisplaySystemMessage 仅在本地显示,普通频道消息也只会发送到当前服务器。若要实现跨服务器:
- 事件动态内容(例如向所有服务器广播稀有掉落): 事件发生时,使用
MessagingService:PublishAsync(TOPIC, payload)发布消息,其中payload.j = game.JobId。在每台服务器上调用SubscribeAsync(TOPIC, ...);当data.j ~= game.JobId(来自另一台服务器)时,向本地客户端触发 RemoteEvent → 客户端调用DisplaySystemMessage。通过FireAllClients立即发送本地副本,并在订阅处理程序中跳过自己的 JobId,以免重复显示。 - 跨服务器玩家聊天: 设置频道的
ShouldDeliverCallback(在服务端针对每位收件人运行)——只中继一次消息(使用message.MessageId去重),通过MessagingService:PublishAsync发布,并return true以继续在本地发送。其他服务器接收消息后,调用DisplaySystemMessage将其显示给各自的客户端(本地消息 = 原生消息,远程消息 = 系统消息;可以接受)。 - 始终使用
pcall保护 MessagingService — API 访问关闭时(Studio 中)或达到速率限制时(每个主题每分钟约 150 + 60×玩家数条消息),调用会报错。这样功能会退化为仅在服务器内可用,而不会导致崩溃。
测试注意事项
- 无法在 Studio 单人模式下测试跨服务器功能(只有一台服务器)——MessagingService 只会向自身发送消息。请验证服务器内的流程(频道已创建、玩家已加入频道、DisplaySystemMessage 能正常显示),并谨慎接入跨服务器流程。
- 从 Server 数据模型中调用
Net.event("X"):FireAllClients(payload)触发一个模拟事件,然后对聊天窗口执行screen_capture(收到新消息时窗口会弹出),以确认格式和消息所在的标签页。
经验总结
在断言聊天/UI“平台做不到某事”之前,先查看 create.roblox.com/docs 和 devforum——现代聊天的能力比乍看之下更强(频道标签页、渐变、配置都已支持)。文档:create.roblox.com/docs/chat/chat-window;devforum“Channel Tabs & UI Gradient Now Available in TextChatService”。