TextService
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
บริการ TextService เป็นบริการที่รับผิดชอบในการจัดการการแสดงข้อความในเกมภายในองค์กร
คลาสนี้มีสมาชิกสองฟังก์ชัน:
ฟังก์ชัน TextService:GetTextSize() ให้นักพัฒนาความสามารถในการคำนวณพื้นที่ที่จําเป็นสําหรับข้อความที่เฉพาะด้วยรูปแบบที่กําหนดไว้ และส่งคืนขนาดพิกเซล Vector2
ฟังก์ชัน TextService:FilterStringAsync() จำเป็นต้องกรองข้อความที่กำหนดโดยผู้ใช้อย่างถูกต้อง (เช่นข้อความแชทหรือการป้อนข้อมูลอื่นๆ) เพื่อประโยชน์ในการปกป้องความปลอดภัยของผู้ใช้นักพัฒนาที่ไม่ใช้ Roblox เริ่มต้น Chat หรืออนุญาตให้ผู้ใช้ป้อนข้อความอื่นต้องใช้ฟังก์ชันนี้
สรุป
วิธีการ
คำนวณมิติ Vector2 ที่จะถูกนำไปใช้กับข้อความเมื่อใช้พารามิเตอร์และข้อจำกัดขนาดการจัดรูปแบบที่กำหนดไว้
- FilterAndTranslateStringAsync(stringToFilter : string,fromUserId : number,targetLocales : Array,textContext : Enum.TextFilterContext):TextFilterTranslatedResult
การแปลแชทไม่ได้รับการสนับสนุนในแชทรุ่นเก่า วิธีนี้ไม่ได้รับการสนับสนุนแล้วและไม่ควรใช้
- FilterStringAsync(stringToFilter : string,fromUserId : number,textContext : Enum.TextFilterContext):TextFilterResult
กรองสตริงที่ได้รับจากผู้ใช้และส่งคืน TextFilterResult ซึ่งสามารถใช้เพื่อจัดส่งข้อความที่กรองอย่างถูกต้องตามไปด้วย
คืนตารางที่มีชื่อและใบหน้าของฟอนต์ที่มีชื่อเสียง
คำนวณความกว้างและความสูงของข้อความที่มีพารามิเตอร์ที่กำหนด
คุณสมบัติ
วิธีการ
GetTextSize
คำนวณมิติ Vector2 ที่จะถูกนำไปใช้กับข้อความเมื่อใช้พารามิเตอร์และข้อจำกัดขนาดการจัดรูปแบบที่กำหนดไว้
โปรดทราบว่าพารามิเตอร์ขนาดฟอนต์จะไม่ยอมรับ Enum Enum.FontSizeแทนที่ขนาดตัวเลขที่ตรงกับ Enum.FontSize Enum ควรใช้นี้ไม่เท่ากับค่าของ Enum.FontSize Enumตัวอย่างเช่นสำหรับฟอนต์ Size11 ตัวเลข 11 ควรใช้
ฟังก์ชันนี้เป็นทางเลือกที่มีประโยชน์สำหรับคุณสมบัติ TextLabel.TextBounds ของ TextLabel และ TextButton วัตถุการใช้คุณสมบัติ TextLabel.TextBounds เพื่อคำนวณข้อความมิติที่ต้องการมักจะไม่สะดวกเนื่องจากต้องสร้างวัตถุ TextLabel ที่จะสร้าง
ด้วย GetTextSize มิติที่จำเป็นสำหรับข้อความเฉพาะในข้อความเฉพาะ TextLabel หรือ TextButton สามารถคำนวณได้ก่อนที่จะสร้างวัตถุหรือตั้งค่าคุณสมบัติข้อความ
ขอแนะนำให้นักพัฒนาเพิ่มพิกเซลของการจัดเตรียมให้กับผลลัพธ์เพื่อให้แน่ใจว่าไม่มีข้อความถูกตัดออก
วิธีนี้จำกัดเฉพาะฟอนต์ที่ระบุไว้ใน Enum.Font เท่านั้น เพื่อรับการเข้าถึงฟอนต์เพิ่มเติม คุณสามารถใช้ TextService:GetTextBoundsAsync() แทนได้
พารามิเตอร์
สตริงที่ขนาดข้อความจะถูกคำนวณสำหรับ
ตัวเลขที่แทนขนาดฟอนต์ที่ใช้
ฟอนต์ที่ใช้
The TextLabel.AbsoluteSize ของวัตถุข้อความที่จะใช้ จำเป็นต้องคำนวณวิธีที่ข้อความจะห่อ
ส่งค่ากลับ
ขนาดของพื้นที่ที่ต้องการในพิกเซลโดยสตริงที่มีรูปแบบที่กำหนดไว้
ตัวอย่างโค้ด
This example showcases a possible usage of the GetTextSize function.
It computes the possible Vector2 dimensions (in pixels) of the string "Hello World" when the font size is 12, the font size SourceSans and the frame size is (1,1).
The expected return of this function is the Vector2 value 9, 13.
local TextService = game:GetService("TextService")
local function getTextBounds()
local message = "Hello World"
local size = Vector2.new(1, 1)
local bounds = TextService:GetTextSize(message, 12, "SourceSans", size)
return bounds + Vector2.new(1, 1)
end
print(getTextBounds())
FilterAndTranslateStringAsync
การแปลแชทไม่สนับสนุนในแชทรุ่นเก่าวิธีนี้ไม่ได้รับการสนับสนุนอีกต่อไปและไม่ควรใช้การโทรทั้งหมดจะคืนวัตถุว่างเปล่าการแปลข้อความแชทมีให้บริการเฉพาะผ่าน TextChatService
พารามิเตอร์
ส่งค่ากลับ
FilterStringAsync
ฟังก์ชัน FilterStringAsync จะกรองสตริงที่ได้รับจากผู้ใช้โดยใช้ TextService และส่งคืน TextFilterResult ซึ่งสามารถใช้เพื่อจัดส่งข้อความที่กรองอย่างถูกต้องตามไปด้วย
การใช้งาน
วิธีนี้ควรเรียกใช้เมื่อผู้ใช้ส่งข้อความครั้งเดียวอย่าบันทึกผลลัพธ์ของฟังก์ชันนี้และใช้ซ้ำสำหรับข้อความที่แยกจากกันหากผู้ใช้ส่งข้อความเดียวกันหลายครั้งวิธีนี้ต้องเรียกอีกครั้งทุกครั้งที่ส่งข้อความหากผลลัพธ์ถูกบันทึกและใช้ซ้ำการตรวจจับสแปมและรูปแบบการกรองที่ตระหนักถึงบริบทจะถูกทำลายและอาจทำให้ความปลอดภัยของผู้ใช้เสี่ยงได้เกมที่ใช้ผลลัพธ์ที่บันทึกไว้ไม่ถูกต้องอาจต้องเผชิญกับการควบคุม
อย่างไรก็ตาม ขอแนะนำให้เก็บวัตถุผลลัพธ์เหล่านี้ไว้เพื่อแสดงข้อความเดียวกันให้กับผู้ใช้ที่เข้าร่วมเซิร์ฟเวอร์ในภายหลังตัวอย่างเช่น: สิ่งนี้สามารถใช้เพื่อนำไปใช้อย่างปลอดภัยและมีประสิทธิภาพในการใช้บันทึกการแชทของเซิร์ฟเวอร์ที่ใช้ตัวกรองที่จำกัดน้อยที่สุดสำหรับผู้ใช้ที่เข้าร่วมในภายหลังหรือสำหรับการแสดงข้อความเช่นชื่อสัตว์เลี้ยงให้กับผู้ใช้ที่เข้าร่วมเกมหลังจากสัตว์เลี้ยงถูกสร้างขึ้นครั้งแรกและการกรองชื่อได้อย่างมีประสิทธิภาพ
พารามิเตอร์ทางเลือก Enum.TextFilterContext จะไม่ส่งผลต่อผลลัพธ์ที่กรองของคำถาม ค่านี้จะถูกใช้เพื่อปรับปรุงการกรองข้อความของ Roblox
ข้อความส่วนตัวคือสิ่งที่เห็นได้เฉพาะผู้เล่นบางคนเท่านั้น ไม่ใช่ผู้เล่นทุกคนตัวอย่างเช่น หากการแชทถูกเห็นโดยผู้เล่นคนเดียวหรือโดยกลุ่มผู้เล่นที่เลือกแล้ว การแชทจะถือว่าเป็นส่วนตัวการแชทสำหรับทีมหรือการแชทที่อาจเป็นที่มองเห็นได้กว้างขึ้นสำหรับกลุ่มที่กว้างขึ้น เช่นเซิร์ฟเวอร์ ถือว่าเป็นสาธารณะหากคุณไม่แน่ใจว่าข้อความของคุณมีคุณสมบัติตามอะไร ให้ปล่อยฟิลด์ที่เลือกว่างเปล่า
หมายเหตุ:
- วิธีนี้มักจะให้ผลเพื่อทำการเรียกบริการการกรองข้อความ
- วิธีนี้อาจโยนหากมีข้อผิดพลาดบริการที่ไม่สามารถแก้ไขได้หากฟังก์ชันนี้โยนข้อผิดพลาดโปรดอย่าพยายามรียูเทิร์นคำขออีกครั้ง; วิธีนี้ดําเนินการตามล็อกิกรียูเทิร์นของตัวเองภายในองค์กรหากวิธีนี้ล้มเหลวจะไม่แสดงข้อความให้กับผู้ใช้ใดๆ
- วิธีนี้ขณะนี้โยนหาก จาก userId ไม่ได้ออนไลน์บนเซิร์ฟเวอร์ปัจจุบันเราวางแผนที่จะสนับสนุนผู้ใช้ที่ออฟไลน์หรืออยู่บนเซิร์ฟเวอร์ที่แตกต่างกันในอนาคต
พารามิเตอร์
ข้อความที่จะถูกกรอง
ID ของผู้เล่นที่กรองข้อความ
บริบทที่ข้อความที่กรองจะใช้ใน
ส่งค่ากลับ
ตัวอย่างโค้ด
This code sample includes a simple demonstration of how TextService:FilterStringAsync() should be implemented in a system where players are allowed to name their pets.
Note, this code sample includes the server-side implementation only (to be placed in a Script). Examples of how to implement the client-side of this system are included under the RemoteEvent and RemoteFunction examples.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TextService = game:GetService("TextService")
local Players = game:GetService("Players")
local Remotes = Instance.new("Folder")
Remotes.Name = "PetNamingRemotes"
Remotes.Parent = ReplicatedStorage
local UserNamedPet = Instance.new("RemoteEvent")
UserNamedPet.Name = "UserNamedPet"
UserNamedPet.Parent = Remotes
local SendPetName = Instance.new("RemoteEvent")
SendPetName.Name = "SendPetName"
SendPetName.Parent = Remotes
local RequestAllPetNames = Instance.new("RemoteFunction")
RequestAllPetNames.Name = "RequestAllPetNames"
RequestAllPetNames.Parent = Remotes
local filterResults = {}
local function broadcastPetName(userId)
local filterResult = filterResults[userId]
if filterResult then
for _, player in pairs(Players:GetPlayers()) do
if player then
-- spawn a new thread so as to not yield the update
task.spawn(function()
-- grab the filtered string for this user
local toUserId = player.UserId
local filteredString = filterResult:GetNonChatStringForUserAsync(toUserId)
filteredString = filteredString or ""
SendPetName:FireClient(player, userId, filteredString)
end)
end
end
end
end
UserNamedPet.OnServerEvent:Connect(function(player, petName)
local fromUserId = player.UserId
-- pcall to catch errors
local success, result = pcall(function()
return TextService:FilterStringAsync(petName, fromUserId)
end)
if success then
filterResults[fromUserId] = result
broadcastPetName(fromUserId)
else
print("Could not filter pet name")
end
end)
RequestAllPetNames.OnServerInvoke = function(player)
local toUserId = player.UserId
local petNames = {}
-- go through filter results and filter the pet name to be sent
for fromUserId, filterResult in pairs(filterResults) do
local filteredString = filterResult:GetNonChatStringForUserAsync(toUserId)
filteredString = filteredString or ""
-- need to convert userId to string so it can't be sent via a remote function
petNames[tostring(fromUserId)] = filteredString
end
return petNames
end
Players.PlayerRemoving:Connect(function(oldPlayer)
local userId = oldPlayer.UserId
filterResults[userId] = nil
end)
GetFamilyInfoAsync
คืนตารางที่มีชื่อและใบหน้าของฟอนต์ที่มีชื่อเสียง
ตารางที่ส่งคืนมีโครงสร้างเช่นนี้:
type FaceInfo = {Name: string, -- ตัวอย่าง: "ปกติ", "หนังสือ", "อิตาลิค", "อิตาลิคบาง"Weight: Enum.FontWeight,Style: Enum.FontStyle, -- ปกติหรืออิตาลิค}type FamilyInfo = {Name: string, -- ตัวอย่าง: "Source Sans Pro", "Grenze Gotisch"Faces: {FaceInfo} -- มีอย่างน้อย 1 เสมอ แต่อาจมีถึง 18}
หากครอบครัวฟอนต์ถูกโหลดแล้วโดยการเรียกก่อนหน้านี้ไปที่ GetFamilyInfoAsync , ContentProvider:PreloadAsync() ตั้งค่าTextLabel.FontFace แล้ววิธีการจะกลับโดยไม่ยอมแพ้
ข้อผิดพลาด
วิธีนี้อาจล้มเหลวเนื่องจากข้อผิดพลาดในเครือข่าย คุณควรห่อมันใน pcall เสมอสำหรับการจัดการข้อผิดพลาด
โยนข้อผิดพลาดในสถานการณ์เหล่านี้:
- ครอบครัวที่ส่งมาเป็นสตริงว่างเปล่า
- ดาวน์โหลดครอบครัวล้มเหลว
- รหัสสินทรัพย์ไม่ถูกต้องหรือชี้ไปที่สินทรัพย์ที่ไม่มีอยู่
พารามิเตอร์
รหัสทรัพย์สินของครอบครัวฟอนต์ที่จะค้นหา
ส่งค่ากลับ
ข้อมูลเกี่ยวกับครอบครัวฟอนต์
ตัวอย่างโค้ด
This example showcases a possible usage of the TextService:GetFamilyInfoAsync() method.
It prints out information about a font family to the output window.
local TextService = game:GetService("TextService")
local familyToCheck = "rbxasset://fonts/families/Arial.json"
-- This is a yield function which may take up to a few seconds to download the font.
local info = TextService:GetFamilyInfoAsync(familyToCheck)
print("Name of the font:", info.Name)
print("Faces:")
for _, face in info.Faces do
print("--------")
print("Name:", face.Name)
print("Weight:", face.Weight.Name)
print("Style:", face.Style.Name)
end
GetTextBoundsAsync
วิธีนี้คล้ายกับ TextService:GetTextSize() แต่ใช้วัตถุ Font แทนที่จะเป็น Enum.Font ซึ่งมีการเข้าถึงฟอนต์เพิ่มเติม
ใช้เพื่อวัดขนาดของข้อความบางส่วนที่จะได้รับชุดคุณสมบัติเช่นสตริง ขนาด และฟอนต์
นี่คือฟังก์ชัน yield เพราะฟอนต์บางตัวอาจต้องโหลดเพื่อวัดมันหากฟอนต์ถูกโหลดแล้ว จะไม่สามารถให้ผลได้ContentProvider:PreloadAsync() สามารถใช้เพื่อให้แน่ใจว่าฟอนต์ถูกโหลด
ข้อผิดพลาด
วิธีนี้อาจล้มเหลวเนื่องจากข้อผิดพลาดในเครือข่าย คุณควรห่อมันใน pcall เสมอสำหรับการจัดการข้อผิดพลาด
โยนข้อผิดพลาดในสถานการณ์เหล่านี้:
- The GetTextBoundsParams.Font มีครอบครัวว่างเปล่า
- อาร์กิวเมนต์ params เป็น nil
- ครอบครัวฟอนต์หรือหน้าฟอนต์ไม่สามารถดาวน์โหลดได้
พารามิเตอร์
การอ้างอิงถึงวัตถุ GetTextBoundsParams
ส่งค่ากลับ
ตัวอย่างโค้ด
This example shows how you can use TextService:GetTextBoundsAsync().
It measures the size of some text in a specific font, then prints the result.
local TextService = game:GetService("TextService")
local params = Instance.new("GetTextBoundsParams")
params.Text = "hello world!"
params.Font = Font.new("rbxasset://fonts/families/GrenzeGotisch.json", Enum.FontWeight.Thin)
params.Size = 20
params.Width = 200
local size = TextService:GetTextBoundsAsync(params)
print("The size of the text is:", size)