在体验中聊天

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

在 Roblox 上使用 文字聊天 系统,玩家可以使用文本基础消息在实时会话中与 друг们通信。 系统提供一系列方法和事件来扩展和自定义聊天功能,例如根据 自定义要求 发送消息,为特定玩家添加特殊权限或禁止,或创建 自定义命令 以执行特定操作。

本指南涵盖聊天工作流程和方法,用于扩展聊天系统的功能。对于聊天用户界面(UI)的自定义,请参阅自定义文字聊天

聊天工作流程

体验内嵌文字聊天系统由两个 可变类 组成,可以为自定义聊天交付行为提供可扩展的聊天交付功能,并且由特定 数据对象 代表。

可变的聊天类

体验内的聊天系统提供以下可变类别:

  • TextChatService — 此单独类是负责管理整个聊天系统,包括处理聊天消息过滤器、管理和用户权限。 从服务器访问可以访问一系列方法和事件,通过聊天交付工作流程中的其他文字聊天 API 或玩家操作。
  • TextChannel — 此类代表一个文本聊天频道,将玩家发送的聊天消息从客户端服务器传递到其他玩家,并根据权限显示给其他玩家。您可以使用它来在您的体验中创建 or 创作、修改和管理文本频道。还可以创建多个文本频道以组合玩家以进行聊天,例如允许玩家与其群组成员聊天不可见于其他人。
  • TextChatCommand — 此类可让您创建自定义聊天命令,允许玩家通过输入特殊角色并跟随命令名称来调用特定操作或行为。聊天命令有助于添加额外的功能和交互性到聊天体验。您也可以使用它们来创建管理员命令来管理和调度您的体验使用快捷方式。

不可更改的聊天对象

体验内的聊天系统包含以下不可修改的 immutable 对象,它们具有仅读取的属性:

  • TextChatMessage : 此对象代表一个单个聊天消息在文本聊天频道中,具有基本信息,例如发送者的消息、原始消息、过滤消息和创建时间。
  • TextSource : 此对象代表一个文字聊天频道中的消息发件人,具有详细权限的玩家在频道中。如果玩家在多个文字聊天频道中,他们可以有多个文字源。

聊天流程图

通过聊天消息发送和交付过程中,方法,回调和事件的可变聊天类别在三个方面的 客户端-服务器 模型中与不可变的聊天对象共同工作:

  • 发送客户端,这是玩家发送消信息的本地设备。
  • 正在接收客户,这是其他玩家的本地设备。
  • 服务器,是接收发送客户端消息的中心处理器,并且负责将交付交付给收件客户端。
A flowchart of the in-experience text chat workflow

如果您的流程图示示,经验文本聊天系统通过以下步骤处理聊天消息:

  1. 玩家从本地设备发送消息,触发 TextChannel:SendAsync() 方法。此方法处理消息并确定是否为聊天命令或是否为普通聊天信息。
  2. 如果玩家输入是聊天命令,它会触发 TextChatCommand.Triggered 事件,执行您为命令定义的行动。
  3. 如果玩家输入是普通聊天信息,它会发射 TextChatService.SendingMessage 来显示原始消息给发件人。同时, TextChannel:SendAsync() 通过将消息传递给服务器。
  4. 服务器会发射 TextChannel.ShouldDeliverCallback 来确定是否向其他玩家发送消息,根据您设置的权限和 Roblox 社区过滤要求。
  5. 如果 TextChannel.ShouldDeliverCallback 确定该消息可以发送给其他玩家,服务器将适用任何过滤器并且触发 TextChannel.OnIncomingMessage 两次:
    1. 第一次在发送客户端上使用 TextChatService.MessageReceived 事件向服务器发送信号,这也会替换发送客户端上的本地消息以显示在接收客户端上。如果原始消息不需要过滤,这个消息和原始消息无需过滤。
    2. 第二次是在接收客户端触发 TextChatService.MessageReceived 事件,显示消息给其他玩家。

聊天系统的工作流程有几个区域,您可以扩展和自定义聊天系统的行为,但系统的操作步骤仍然保持不变。

自定义消息交付行为

除了遵守默认聊天消息交付行为外,您可以使用 TextChannel.ShouldDeliverCallback 来添加权限和特定行为,以确定玩家是否可以收到自定义互动互方式的消息,例如:

  • 支持只有同组玩家或小队成员之间才能聊天的群组聊天。
  • 支持基于接近度的聊天,玩家只能向那些靠近他们的人发送消息。
  • 防止玩家使用特定属性向其他玩家发送消息。例如,禁止死亡状态的玩家向活跃玩家发送消息。
  • 添加猜测比赛功能,其中聊天中的正确答案不会对其他玩家可见。

下面的例子显示了如何为离地而坐的玩家角色在地点上实现独家聊天。它使用 TextSource 函数来识别地点上可能是消息接收者的玩家角色,并使用 false 函数来扩展回调。如果该函数返回 false,它意味着玩家角色在接收器


local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
-- 此示例使用了通用频道;您可以将其替换为专用频道
local generalChannel: TextChannel = TextChatService:WaitForChild("TextChannels").RBXGeneral
-- 定义一个函数,获取玩家角色的位置
local function getPositionFromUserId(userId: number)
-- 获取与指定用户ID 关联的玩家
local targetPlayer = Players:GetPlayerByUserId(userId)
-- 如果玩家存在,请获取其角色的位置。
if targetPlayer then
local targetCharacter = targetPlayer.Character
if targetCharacter then
return targetCharacter:GetPivot().Position
end
end
-- 返回默认位置,如果玩家或角色无法找到
return Vector3.zero
end
-- 设置通用频道的回调来控制消息发送
generalChannel.ShouldDeliverCallback = function(textChatMessage: TextChatMessage, targetTextSource: TextSource)
-- 获取消息发件人和目标的位置
local sourcePos = getPositionFromUserId(textChatMessage.TextSource.UserId)
local targetPos = getPositionFromUserId(targetTextSource.UserId)
-- 如果发送者和目标之间的距离小于 50 单位,请将消信息发送
return (targetPos - sourcePos).Magnitude < 50
end

创建自定义命令

体验文本聊天系统有内置聊天命令,例如创建团队聊天频道和播放虚拟形象动作。您可以通过设置 TextChatService.CreateDefaultCommandsTextChatService.CreateDefaultTextChannels

下面的例子显示了如何创建一个允许玩家增加或减少角色大小时输入 /super/mini 的聊天命令。

  1. TextChatCommand 内插入一个 TextChatService 实例。

  2. 将其命名为 大小命令

  3. 将其 主要别名 属性设置为 /super 和其 SecondaryAlias 为 1> /mini1>。

  4. Script 内,将 ServerScriptService 插入,为角色大小提供调整,并为其命令提供调用。

    脚本

    local TextChatService = game:GetService("TextChatService")
    local Players = game:GetService("Players")
    local sizeCommand: TextChatCommand = TextChatService:WaitForChild("SizeCommand")
    sizeCommand.Triggered:Connect(function(textSource, message)
    local scaleMult = 1
    local messageWords = string.split(message, " ")
    if messageWords[1] == "/super" then
    scaleMult = 2
    elseif messageWords[1] == "/mini" then
    scaleMult = 0.5
    end
    local player = Players:GetPlayerByUserId(textSource.UserId)
    if player then
    local character = player.Character
    if character then
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    for _, child in humanoid:GetChildren() do
    if child:IsA("NumberValue") then
    child.Value *= scaleMult
    end
    end
    end
    end
    end
    end)

从传统聊天迁移

此部分将助您从传统聊天系统迁移,为您提供使用体验文本聊天系统实现常见聊天功能和行为的替代方法。

要从传统聊天系统切换到现有体验的聊天系统:

  1. 在 Explorer 窗口中,选择 TextChatService。

  2. 属性 窗口中,找到 聊天版本 下拉菜单,然后选择 TextChatService

基础功能

虽然两个系统都共享相同的基本聊天功能,但在体验中的聊天系统实现是更持久和更容易迭代的。

功能传奇聊天在体验中聊天差异
发送聊天消息Players:Chat()TextChannel:SendAsync()Class.TextChatService:SendAsync() 方法支持更高级的聊天功能,例如对话框式格式和消息优先级。它还包括内置过滤器来帮助防止发送不当的消息。
实现消息传递回调Chat:InvokeChatCallback() Chat:RegisterChatCallback()TextChatService.SendingMessage TextChatService.OnIncomingMessage传统聊天系统将函数绑定到聊天系统事件以提交消息。体验内容聊天系统的两种方法有更多灵活性和定制选项。
添加自定义聊天指令ChatService/ChatCommand 模块TextChatCommand体验内的文字聊天系统有一个专用类,该类代表一个文本命令的自定义,而不是使用 legacy 聊天模块。
显示系统消息StarterGui:SetCore() 使用 "ChatMakeSystemMessage"TextChannel:DisplaySystemMessage()Class.TextChannel.OnIncomingMessage 回调可以返回一个 TextChatMessageProperties 实例来自定义消息外观。
禁用聊天游戏设置 在Studio 和 ChatWindow/ChatSettings 模块可用于隐藏聊天窗口ChatWindowConfiguration.Enabled

消息过滤

在体验中,文字聊天系统会自动根据每个玩家的帐户信息过滤聊天消息,以便您不需要手动为所有类型的聊天消息过滤文本过滤器。

功能传奇聊天在体验中聊天
为个人玩家过滤消息Chat:FilterStringAsync()
过滤广播消息Chat:FilterStringForBroadcast()

窗口和泡泡聊天

聊天窗口和泡泡聊天行为和自定义选项都与传统聊天系统相同。 由于传统聊天系统只允许使用聊天模块或 Class.