TextService
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
TextService เป็นบริการที่มีความรับผิดชอบภายในเกี่ยวกับการจัดการการแสดงข้อความในเกม
คลาสนี้มีสองหน้าที่สมาชิก:
การใช้งาน TextService:GetTextSize() ช่วยให้ผู้พัฒนาสามารถคํานวณพื้นที่ที่ต้องการสําหรับข้อความข้อความที่กําหนดด้วยการจัดรูปแบบที่กำหนดไว้ การให้ความใหญ่ของ Vector2 ขนาด
ฟังก์ชัน TextService:FilterStringAsync() จำเป็นต้องใช้เพื่อการกรองข้อความผู้ใช้ที่กำหนดเอง (เช่นข้อความในการแชทหรือข้อมูลอื่น ๆ ที่ผู้ใช้กรอง) ในความสนใจของความปลอดภัยข
สรุป
วิธีการ
คํานวณมิติ Vector2 ที่จะถูกนํามาใช้กับข้อความเมื่อใช้ตัวแบ่งรูปแบบและข้อจํากัดขนาดที่กําหนด
- FilterAndTranslateStringAsync(stringToFilter : string,fromUserId : number,targetLocales : Array,textContext : Enum.TextFilterContext):TextFilterTranslatedResult
การแปลบนแชทไม่สนับสนุนในแชทในอดีต วิธีนี้ไม่สนับสนุนและไม่ควรใช้
- FilterStringAsync(stringToFilter : string,fromUserId : number,textContext : Enum.TextFilterContext):TextFilterResult
กรองตัวอักษรที่ได้รับจากผู้ใช้ และส่งคืน TextFilterResult ซึ่งสามารถใช้เพื่อจัดส่งตัวอักษรที่ถูกกรองได้อย่างเหมาะสม
กลับตารางที่มีชื่อและหน้าของตระกูลอักษร
คํานวณความกว้างและความสูงของตัวแปรที่ให้
คุณสมบัติ
วิธีการ
GetTextSize
คํานวณมิติ Vector2 ที่จะถูกนํามาใช้กับข้อความเมื่อใช้ตัวแบ่งรูปแบบและข้อจํากัดขนาดที่กําหนด
หมายเหตุ, พารามิเตอร์ fontSize จะไม่ยอมรับ Enum.FontSize 枚 แทนที่จะใช้ขนาดตัวอักษรที่ตรงกันกับ Enum.FontSize เนื้อหุ้มต้องใช้ สิ่งนี
คุณสมบัตินี้เป็นตัวเลือกที่มีประโยชน์สำหรับสมบัติ TextLabel.TextBounds ของ TextLabel และ TextButton โดยใช้สมบัติ 2>Class.Text
ด้วย GetTextSize ขนาดที่ต้องการโดยคำสตริงข้อความเฉพาะใน TextLabel หรือ TextButton สามารถคำนวณได้ก่อนที่จะมีการสร้างหรือการตั้งค่าคุณสมบัติของข้อความ
ปิด
วิธีนี้จำกัดเฉพาะตัวอักษรที่ระบุใน Enum.Font เท่านั้น เพื่อรับการเข้าถึงตัวอักษรเพิ่มเติม คุณสามารถใช้ TextService:GetTextBoundsAsync() แทน
พารามิเตอร์
ตัวอักษรสำหรับขนาดข้อความ
ตัวเลขที่แทนตัวอักษรขนาด
ตัวอักษรที่ใช้
Class.TextLabel.AbsoluteSize ของวัตถุข้อความที่จะใช้ ต้องการให้คำนวณว่าข้อความจะหุ้มอย่างไร
ส่งค่ากลับ
ขนาดของพื้นที่ที่ต้องการในพิกเซลโดยสตริงที่มีการจัดรูปแบบที่กำหนด
ตัวอย่างโค้ด
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 ไม่ได้ออนไลน์ในเซิร์ฟเวอร์ปัจจุบัน เราวางแผนที่จะสนับสนุนผู้ใช้ที่ออฟไลน์หรือในเซิร์ฟเวอร์อื่นในอนาคต
พารามิเตอร์
ข้อความที่จะกรอง
รหัสผู้ใช้ของผู้กรองข้อความ
บริบทที่ข้อความกรองจะใช้
ส่งค่ากลับ
ตัวอย่างโค้ด
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, -- ตัวอย่าง: "Regular", "Book", "Italic", "Thin Italic"Weight: Enum.FontWeight,Style: Enum.FontStyle, -- อิตาลิกหรือไม่มี}type FamilyInfo = {Name: string, -- ตัวอย่าง: "Source Sans Pro", "Grenze Gotisch"Faces: {FaceInfo} -- มักจะมีอย่างน้อย 1 แต่สามารถมีได้มากถึง 18}
หากตระกูลตัวอักษรถูกโหลดโดยการโทรก่อนหน้านี้ไปยัง GetFamilyInfoAsync หรือตัวอักษรข้อความด้วยสมบัติของ ContentProvider:PreloadAsync() หรือตัวอักษรข้อความด้วยสมบัติของ Class.TextLabel.
ข้อผิดพลาด
วิธีนี้อาจล้มเหลวเนื่องจากข้อผิดพลาดในเครือข่าย คุณควร always wrap it in a pcall สำหรับการจัดการข้อผิดพลาด
ส่งข้อผิดพลาดในสถานการณ์เหล่านี้:
- ครอบครัวที่ผ่านมาเป็นสตริงว่างเปล่า
- การดาวน์โหลดครอบครัวล้มเหลว
- รหัสสินทรัพย์ไม่ถูกต้องหรือชี้ไปที่สินทรัพย์ที่ไม่มีอยู่
พารามิเตอร์
รหัสสินทรัพย์ของตระกูลตัวอักษรเพื่อดูขึ้น
ส่งค่ากลับ
ข้อมูลเกี่ยวกับตระกูลอักษร
ตัวอย่างโค้ด
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 ซึ่งมีการเข้าถึงตัวอักษรมากขึ้น
ใช้เพื่อวัดขนาดของข้อความบางส่วนที่มีสมุดค่าตัวละครเช่นสตริง ขนาด และตัวอักษร
นี่คือคุณสมบัติผลิตเพราะบางตัวอักษรอาจต้องโหลดเพื่อวัดพวกเขา หากตัวอักษรนั้นโหลดแล้ว ก็จะไม่ผลิต ContentProvider:PreloadAsync() สามารถใช้เพื่อให้แน่ใจว่าตัวอักษรนั้นโหลดได้
ข้อผิดพลาด
วิธีนี้อาจล้มเหลวเนื่องจากข้อผิดพลาดในเครือข่าย คุณควร always wrap it in a pcall สำหรับการจัดการข้อผิดพลาด
ส่งข้อผิดพลาดในสถานการณ์เหล่านี้:
- Class.GetTextBoundsProps.Font มีครอบครัวที่ว่างเปล่า
- ค่าตัวละคร params เป็น nul
- ตระกูลตัวอักษรหรือหน้าตาของตัวอักษรไม่สามารถดาวน์โหลดได้
พารามิเตอร์
อ้างอิงถึงวัตถุ GetTextBoundsParams
ส่งค่ากลับ
ตัวอย่างโค้ด
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)