该技能面向需要为 Roblox 游戏构建自定义聊天(多个命名频道、以可切换标签页展示、跨服务器消息)的开发者,说明现代 TextChatService 中几个不直观的关键点。
用途与前提:现代聊天使用 TextChatService(ChatVersion = TextChatService)。默认聊天会把内容合并到一个窗口,除非启用频道标签。
关键设置:设为场所属性(Edit 模式)最可靠——TextChatService.CreateDefaultTextChannels = false(去掉默认 RBXGeneral/System 标签,只保留自定义频道)、TextChatService.ChannelTabsConfiguration.Enabled = true(让频道以标签形式出现;开启后每个自定义 TextChannel 按其 Name 自动成为标签,无需逐频道配置)。两项都是场所属性,需要保存场所才能跨会话生效;同时可在 ChatService.start() 运行时作为回退设置,但启动时可靠生效的是 Edit 模式/场所值。
创建频道(服务端):CreateDefaultTextChannels = false 时 TextChannels 容器不会自动创建,需要自行创建 Folder;标签顺序即创建顺序,没有重排 API,因此先创建想放最左侧的频道;玩家加入时对每个频道调用 channel:AddUserAsync(player.UserId) 以创建其 TextSource,需 pcall 保护,调用会让出线程、按顺序执行。
向频道显示消息(客户端):textChannel:DisplaySystemMessage(richText) 仅在调用客户端该频道标签中显示,可用于把游戏事件流(抽取、公告)渲染到指定标签;支持 RichText,但须先转义用户文本(& < >),防止注入标签。
跨服务器(MessagingService):DisplaySystemMessage 仅本地,普通频道投递按服务器隔离。事件流(如向所有服务器广播稀有掉落):事件发生时 PublishAsync(TOPIC, payload)(payload.j = game.JobId),各服务器 SubscribeAsync,当 data.j ~= game.JobId(来自其他服)时用 RemoteEvent 发给本地客户端再 DisplaySystemMessage;本地副本用 FireAllClients 即时发出,并在订阅端跳过自身 JobId 避免重复。跨服玩家聊天:设置频道的 ShouldDeliverCallback(服务端按接收者运行),按 message.MessageId 去重后经 MessagingService 转发一次,并返回 true 以仍本地投递;其他服收到后对客户端 DisplaySystemMessage(本地为原生消息、远程为系统消息,可接受)。MessagingService 必须 pcall 保护——API 关闭(Studio)或限流(约每主题每分钟 150 + 60×玩家数 条)时会报错,此时功能降级为仅服务器内。
测试注意:跨服务器无法在单人 Studio 测试(只有一个服务器),MessagingService 只会回环到自身;应验证服务器内路径(频道存在、玩家是成员、DisplaySystemMessage 渲染)并谨慎接通跨服路径。可从 Server 数据模型用 Net.event("X"):FireAllClients(payload) 触发模拟事件,再截图聊天(新消息时窗口弹出)确认格式与落点标签。
限制与建议:声明“平台做不到某功能”前先查 create.roblox.com/docs 与 devforum,现代聊天比看起来更能干(频道标签、渐变、配置均存在)。文档:create.roblox.com/docs/chat/chat-window;devforum 文章“Channel Tabs & UI Gradient Now Available in TextChatService”。