Stosowane w różnych źródłach i danych wejściowych, filtrowanie tekstu zapobiega użytkownikom widzenia niewłaściwego języka oraz informacji umożliwiających identyfikację osobistą, takich jak numery telefonów. Roblox automatycznie filtruje powszechne wyjścia tekstowe, takie jak wiadomości, które przeszły przez czat tekstowy w doświadczeniach, ale to Ty jesteś odpowiedzialny za filtrowanie wszelkiego wyświetlanego tekstu, nad którym nie masz wyraźnej kontroli.
Scenariusze filtrowania
Tekst może być zbierany i/lub wyświetlany użytkownikom w różnych scenariuszach, w tym:
Doświadczenie, które zbiera dane wejściowe tekstowe użytkowników przez wpisy TextBox, niestandardowy interfejs GUI z przyciskami, takimi jak interfejs klawiatury, lub interaktywny model klawiatury w przestrzeni 3D.
Doświadczenie, które generuje słowa z losowych znaków i wyświetla je użytkownikom, ponieważ istnieje szansa, że stworzy niewłaściwe słowa.
Doświadczenie, które łączy się z zewnętrznym serwerem internetowym, aby pobrać treści, które są wyświetlane w doświadczeniu. Często nie masz kontroli nad treścią zewnętrznej witryny, a osoba trzecia może edytować informacje.
Doświadczenie, które przechowuje teksty, takie jak imiona zwierząt użytkowników, przy użyciu magazynów danych, gdzie przechowywany tekst może zawierać niewłaściwe słowa, które powinny być filtrowane podczas ich pobierania.
Proces filtrowania
TextService:FilterStringAsync() filtruje tekst w doświadczeniu, przyjmując jako argument ciąg tekstowy oraz UserId użytkownika, który utworzył ten tekst. Zwraca obiekt TextFilterResult, który ma dwie dodatkowe metody, które możesz wywołać w różnych scenariuszach:
- TextFilterResult:GetNonChatStringForBroadcastAsync() do filtrowania tekstu widocznego dla wszystkich użytkowników w doświadczeniu, na przykład do dialogu, który pozwala użytkownikowi napisać wiadomość na znaku widocznym dla wszystkich użytkowników na serwerze.
- TextFilterResult:GetNonChatStringForUserAsync() do wyświetlania filtrowanego tekstu dla jednego konkretnego użytkownika, w zależności od wieku i innych szczegółów.
W kontekście danych wejściowych TextBox, poniższy przykład zbiera dane wejściowe na zdarzeniu FocusLost i wysyła je do serwera przez RemoteEvent. Na serwerze jest najpierw filtrowany przez FilterStringAsync(), a następnie GetNonChatStringForBroadcastAsync(), mając na celu wyświetlenie tekstu wszystkim użytkownikom na obiekcie po stronie serwera, takim jak SurfaceGui w świecie 3D.
Filtrowanie danych wejściowych tekstu - Skrypt kliencki
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local textBox = script.Parent
textBox.ClearTextOnFocus = false
textBox.PlaceholderText = "..."
textBox.TextXAlignment = Enum.TextXAlignment.Left
textBox.TextScaled = true
-- RemoteEvent do wysyłania danych wejściowych tekstu do serwera do filtrowania
local inputRemoteEvent = ReplicatedStorage:FindFirstChild("InputRemoteEvent")
-- Obsługuje zdarzenie utraty focusu i naciśnięcia klawisza Enter
local function onFocusLost(enterPressed, inputObject)
if enterPressed then
print("ZGŁOSZONE:", textBox.Text)
if inputRemoteEvent then
inputRemoteEvent:FireServer(textBox.Text)
end
end
end
textBox.FocusLost:Connect(onFocusLost)
Filtrowanie danych wejściowych tekstu - Skrypt serwerowy
local TextService = game:GetService("TextService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- RemoteEvent do odbierania danych wejściowych tekstu od klienta do filtrowania
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("Błąd podczas generowania TextFilterResult:", errorMessage)
end
end
-- Uruchamiane, gdy klient przesyła dane wejściowe z 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("FILTROWANE:", filteredText)
else
warn("Błąd podczas filtrowania tekstu!")
end
end
end
end
inputRemoteEvent.OnServerEvent:Connect(onInputReceived)