适用于各种源和输入,文本过滤器 防止用户看到不当的语言和个人身份信息,例如电话号码。 但 Roblox 会自动过滤常见的文本输出,例如通过“在体验中文字聊天”发送的消息,但你有责任过滤任何显示在体验中的文本,你不能控制 。
过滤场景
文本可以被收集并/或显示给用户在各种场景中,包括:
一个体验,通过 Class.Toolbar 条目收集用户的 TextBox,一个自定义 GUI with 按钮,例如键盘/键盘/键盘界面或 3D 空间中的交互键盘模型。
一个生成随机角色从字符中生成字词并将其显示给用户的体验,因为有可能会创建不当的字词。
连接到外部网服务器的体验,以获取体验中显示的内容。 通常你不会有控制外部网站的内容,而第三方可以编辑信息。
使用 数据存储 存储用户的宠物名称,在检索时可能包含不当的字符串,需要过滤。
过滤过程
TextService:FilterStringAsync() 在体验中文本的过滤器,取得一个串文本和用户创建文本为输入的 UserId 的用户。它返回一个带有两个额外方法的对象,可以在不同场景中调用:
- TextFilterResult:GetNonChatStringForBroadcastAsync() 用于在体验中对所有用户可见的文本进行过滤,例如对于允许用户在服务器上的标志上写下消息的对话框。
- TextFilterResult:GetNonChatStringForUserAsync() 显示特定用户的过滤文本,根据年龄和其他细节。
在 TextBox 输服务器上,以下示例收集输入在 FocusLost 事件
过滤文本输入 - 客户端脚本
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local textBox = script.Parent
textBox.ClearTextOnFocus = false
textBox.PlaceholderText = "..."
textBox.TextXAlignment = Enum.TextXAlignment.Left
textBox.TextScaled = true
-- 远程事件将文本输入发送到服务器进行过滤
local inputRemoteEvent = ReplicatedStorage:FindFirstChild("InputRemoteEvent")
-- 事件处理器失焦和按Enter
local function onFocusLost(enterPressed, inputObject)
if enterPressed then
print("SUBMITTED:", textBox.Text)
if inputRemoteEvent then
inputRemoteEvent:FireServer(textBox.Text)
end
end
end
textBox.FocusLost:Connect(onFocusLost)
过滤文本输入 - 服务器脚本
local TextService = game:GetService("TextService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- 远程事件接收客户端输入的文本以进行过滤
local inputRemoteEvent = ReplicatedStorage:FindFirstChild("InputRemoteEvent")
local function getFilterResult(text, fromUserId)
local filterResult
local success, errorMessage = pcall(function()
filterResult = TextService:FilterStringAsync(text, fromUserId)
end)
if success then
return filterResult
else
warn("Error generating TextFilterResult:", errorMessage)
end
end
-- 客户端从 TextBox 提交输入时发射
local function onInputReceived(player, text)
if text ~= "" then
local filterResult = getFilterResult(text, player.UserId)
if filterResult then
local success, filteredText = pcall(function()
return filterResult:GetNonChatStringForBroadcastAsync()
end)
if success then
print("FILTERED:", filteredText)
else
warn("Error filtering text!")
end
end
end
end
inputRemoteEvent.OnServerEvent:Connect(onInputReceived)