Roblox เสนอกระบวนการส่งข้อความระหว่างผู้เล่นในเซสชันสดผ่าน TextChatService ซึ่งเป็นคลาสเดียวที่รับผิดชอบในการจัดการระบบแชททั้งหมด รวมถึงการกรองข้อความแชท การควบคุม และสิทธิ์ของผู้ใช้ บริการนี้มีฟังก์ชันการทำงานมาตรฐานและยังมีชุดของวิธีการและเหตุการณ์สำหรับการขยายและปรับแต่งแชท เช่น การส่งข้อความตาม ข้อกำหนดที่กำหนดเอง การเพิ่มสิทธิ์พิเศษหรือการควบคุมให้กับผู้เล่นเฉพาะ และการสร้าง คำสั่งที่กำหนดเอง เพื่อดำเนินการตามการกระทำเฉพาะ
การกำหนดค่า UI
TextChatService มี UI เริ่มต้นที่สามารถปรับแต่งให้เหมาะกับความต้องการของเกมของคุณ ปิดการกำหนดค่าใด ๆ เหล่านี้เพื่อซ่อนองค์ประกอบ UI ที่เกี่ยวข้อง หากต้องการ คุณยังสามารถแทนที่องค์ประกอบ UI เหล่านี้ด้วยอินเทอร์เฟซที่กำหนดเอง:
สำหรับข้อมูลเพิ่มเติม โปรดดูที่ Chat window และ Bubble chat
ช่องข้อความ คำสั่ง และข้อความ
TextChannel — ช่องข้อความจะส่งข้อความที่ผู้ใช้ส่งจากไคลเอนต์ไปยังเซิร์ฟเวอร์ ซึ่งจะแสดงให้ผู้ใช้คนอื่นตามสิทธิ์ ช่องข้อความต้องถูกจัดให้อยู่ภายใต้ TextChatService เพื่อให้ทำงานได้
TextSource — ผู้ใช้ใน TextChannel แหล่งข้อความจะถูกจัดให้อยู่ภายใต้ TextChannel โดยตรงเมื่อเรียกใช้ AddUserAsync() แหล่งข้อความจะมีรายละเอียดสิทธิ์ของผู้ใช้ในช่อง เช่น ความสามารถในการส่งข้อความ หากผู้ใช้คนเดียวอยู่ในหลายช่องข้อความ พวกเขาจะเชื่อมโยงกับแหล่งข้อความหลายแห่ง
TextChatMessage — ข้อความในช่องข้อความ ข้อความแชทจะมีข้อมูลพื้นฐาน เช่น ผู้ส่งข้อความ ข้อความต้นฉบับ ข้อความที่กรอง และเวลาที่สร้าง
TextChatCommand — ช่วยให้ผู้ใช้สามารถเรียกใช้การกระทำหรือพฤติกรรมเฉพาะโดยการส่งข้อความที่ตรงกับคุณสมบัติ PrimaryAlias หรือ SecondaryAlias คำสั่งแชทต้องถูกจัดให้อยู่ภายใต้ TextChatService เพื่อให้ทำงานได้
แผนผังการไหลของแชท
การแชทด้วยข้อความใช้โมเดล client‑server โดยมี ไคลเอนต์ที่ส่งข้อความ เซิร์ฟเวอร์ และ ไคลเอนต์ที่รับข้อความ

ผู้เล่นส่งข้อความจากอุปกรณ์ท้องถิ่นของตน ซึ่งจะกระตุ้นให้เรียกใช้วิธี TextChannel:SendAsync() วิธีนี้จะประมวลผลข้อความและกำหนดว่ามันเป็นคำสั่งแชทหรือข้อความแชทปกติ
หากข้อความเป็นคำสั่งแชท จะมีการเรียกเหตุการณ์ TextChatCommand.Triggered เพื่อดำเนินการตามการกระทำที่กำหนด ไม่ต้องมีขั้นตอนเพิ่มเติม
หากข้อความเป็นข้อความแชทปกติ จะมีการเรียกเหตุการณ์ TextChatService.SendingMessage เพื่อแสดงข้อความให้กับผู้ส่งในไคลเอนต์ที่ส่งข้อความ ในขณะเดียวกัน TextChannel:SendAsync() จะส่งข้อความไปยังเซิร์ฟเวอร์
เซิร์ฟเวอร์จะเรียก TextChannel.ShouldDeliverCallback เพื่อตัดสินใจว่าจะส่งข้อความไปยังผู้เล่นคนอื่นตามสิทธิ์และข้อกำหนดการกรองชุมชนของ Roblox หรือไม่
หาก TextChannel.ShouldDeliverCallback ตัดสินใจว่าข้อความนั้นมีสิทธิ์ที่จะส่งไปยังผู้เล่นคนอื่น เซิร์ฟเวอร์จะใช้การกรองใด ๆ และเรียก TextChannel.OnIncomingMessage สองครั้ง:
ครั้งแรกจะเกิดขึ้นในไคลเอนต์ที่ส่งข้อความและสัญญาณว่าเซิร์ฟเวอร์กำลังประมวลผลข้อความผ่านเหตุการณ์ TextChatService.MessageReceived เหตุการณ์นี้จะเปลี่ยนข้อความในท้องถิ่นในไคลเอนต์ที่ส่งข้อความด้วยข้อความที่ประมวลผลจากเซิร์ฟเวอร์ ข้อความจะเหมือนกันหากข้อความต้นฉบับไม่ต้องการการกรอง
ครั้งที่สองจะเกิดขึ้นในไคลเอนต์ที่รับข้อความ ซึ่งจะกระตุ้นเหตุการณ์ TextChatService.MessageReceived เพื่อแสดงข้อความให้กับผู้เล่นคนอื่น
ฮุคและการเรียกกลับของการแชทด้วยข้อความ
API ของ TextChatService ส่งเสริมการแยกแยะที่ชัดเจนเกี่ยวกับลักษณะและการส่งข้อความแชท หลายอินสแตนซ์ของระบบแชทด้วยข้อความให้ฮุคและการเรียกกลับเพื่อจัดรูปแบบในสถานที่ที่ชัดเจนและรวมศูนย์

การส่งข้อความตามเงื่อนไข
การเรียกกลับ TextChannel.ShouldDeliverCallback ควรกำหนดไว้เฉพาะในเซิร์ฟเวอร์ การเรียกกลับจะถูกเรียกสำหรับแต่ละ TextSource ลูกของช่องข้อความเมื่อมีการส่งข้อความเพื่อตัดสินใจว่าข้อความควรจะถูกส่งหรือไม่ การเรียกกลับนี้สามารถใช้เพื่อดำเนินการตรรกะการส่งข้อความที่กำหนดเองซึ่งอาจขึ้นอยู่กับบริบทการเล่นเกมเพิ่มเติม เช่น:
- การแชทตามระยะทาง ซึ่งผู้ใช้สามารถส่งข้อความไปยังผู้ที่อยู่ใกล้เคียงเท่านั้น
- ป้องกันไม่ให้ผู้ใช้ที่มีคุณสมบัติบางอย่างส่งข้อความไปยังผู้อื่น
ปรับแต่งการแสดงข้อความ
UI เริ่มต้นของ TextChatService ขึ้นอยู่กับ rich text เพื่อจัดรูปแบบและปรับแต่งวิธีการแสดงข้อความ คุณสามารถใช้การเรียกกลับต่อไปนี้เพื่อจัดรูปแบบข้อความก่อนที่จะถูกแสดงให้ผู้ใช้ เช่น การเพิ่มสีหรือ แท็กแชท ให้กับชื่อผู้ใช้หรือจัดรูปแบบเนื้อหาข้อความ
การเรียกกลับต่อไปนี้จะถูกเรียกในทุก TextChatMessage ที่กำลังจะถูกแสดง ซึ่งช่วยให้คุณปรับแต่งลักษณะของหน้าต่างแชทตาม TextChannel, TextSource, หรือเนื้อหาของ TextChatMessage เมื่อไคลเอนต์ส่งข้อความ การเรียกกลับเหล่านี้จะถูกเรียกเพียงครั้งเดียวเมื่อข้อความถูกส่งไปยังเซิร์ฟเวอร์และค่าของ TextChatMessage.Status จะเป็น Enum.TextChatMessageStatus.Sending เมื่อข้อความถูกส่งถึงเซิร์ฟเวอร์และกำลังถูกส่งไปยังผู้ใช้คนอื่น ไคลเอนต์ที่ส่งข้อความจะได้รับข้อความอีกครั้งพร้อมกับค่าที่อัปเดตของ Enum.TextChatMessageStatus
- TextChatService.OnIncomingMessage — การเรียกกลับนี้ควรกำหนดไว้เฉพาะในไคลเอนต์ การเรียกกลับจะถูกเรียกเมื่อมีการรับข้อความ ไม่ว่าจะมาจากเซิร์ฟเวอร์หรือหากไคลเอนต์ท้องถิ่นเพิ่งส่งข้อความ การเรียกกลับจะถูกเรียกในทุก TextChatMessage ที่ได้รับจากอินสแตนซ์ TextChannel ทั้งหมดและเป็นครั้งแรกที่ประมวลผลข้อความก่อนที่จะถูกแสดงให้ผู้ใช้
- TextChannel.OnIncomingMessage — การเรียกกลับนี้ควรกำหนดไว้เฉพาะในไคลเอนต์ การเรียกกลับจะถูกเรียกเมื่อมีการรับข้อความจากเซิร์ฟเวอร์ การเรียกกลับจะถูกเรียกในทุก TextChatMessage ที่ได้รับจาก TextChannel อินสแตนซ์ TextChannel เริ่มต้นที่สร้างจาก TextChatService.CreateDefaultTextChannels มีการกำหนดการเรียกกลับนี้และสามารถถูกเขียนทับได้
- TextChatService.OnBubbleAdded — การเรียกกลับนี้ควรกำหนดไว้เฉพาะในไคลเอนต์ ใช้เพื่อปรับแต่งลักษณะของฟองแชทโดยไม่ขึ้นอยู่กับลักษณะของข้อความใน UI ของหน้าต่างแชท
- TextChatService.OnChatWindowAdded — การเรียกกลับนี้ควรกำหนดไว้เฉพาะในไคลเอนต์ ใช้เพื่อปรับแต่งลักษณะของข้อความแชทใน UI ของหน้าต่างแชทโดยไม่ขึ้นอยู่กับลักษณะของข้อความในฟองแชท
การย้ายจากแชทเก่า
ส่วนนี้ช่วยคุณในการย้ายจากระบบแชทเก่าโดยการให้วิธีการทางเลือกในการดำเนินการฟังก์ชันและพฤติกรรมแชททั่วไปโดยใช้ TextChatService
ในหน้าต่าง Explorer ให้เลือก TextChatService
ในหน้าต่าง Properties ให้ค้นหาตัวเลือกดรอปดาวน์ ChatVersion และเลือก TextChatService

ฟังก์ชันการทำงานพื้นฐาน
แม้ว่าทั้งสองระบบจะแบ่งปันฟังก์ชันการทำงานพื้นฐานเดียวกัน แต่การใช้งาน TextChatService โดยทั่วไปมีความยั่งยืนมากกว่าและง่ายต่อการพัฒนา
| ฟังก์ชันการทำงาน | แชทเก่า | TextChatService | ความแตกต่าง |
|---|---|---|---|
| ส่งข้อความแชท | Players:Chat() | TextChannel:SendAsync() | วิธี SendAsync() รองรับฟีเจอร์แชทที่มีความก้าวหน้ามากขึ้น เช่น การจัดรูปแบบข้อความที่มีความซับซ้อนและลำดับความสำคัญของข้อความ นอกจากนี้ยังรวมถึงการกรองในตัวเพื่อช่วยป้องกันไม่ให้มีการส่งข้อความที่ไม่เหมาะสม |
| ดำเนินการเรียกกลับข้อความ | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | ระบบแชทเก่าผูกฟังก์ชันกับเหตุการณ์ของระบบแชทเพื่อส่งข้อความ ฟังก์ชันทั้งสองของ TextChatService เสนอความยืดหยุ่นและการปรับแต่งที่ดีกว่า |
| เพิ่มคำสั่งแชทที่กำหนดเอง | โมดูล ChatService/ChatCommand | TextChatCommand | TextChatService มีคลาสเฉพาะสำหรับคำสั่งข้อความแทนที่จะใช้โมดูลแชทเก่า |
| แสดงข้อความระบบ | StarterGui:SetCore() โดยใช้ ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | การเรียกกลับ TextChannel.OnIncomingMessage สามารถส่งคืนอินสแตนซ์ TextChatMessageProperties เพื่อปรับแต่งลักษณะของข้อความ |
| ปิดการแชท | โมดูล ChatWindow/ChatSettings สำหรับซ่อนหน้าต่างแชท | ChatWindowConfiguration.Enabled |
การกรองข้อความ
TextChatService จะกรองข้อความแชทโดยอัตโนมัติตามข้อมูลบัญชีของผู้เล่นแต่ละคน ดังนั้นคุณจึงไม่จำเป็นต้องดำเนินการกรองข้อความด้วยตนเองสำหรับข้อความแชททุกรูปแบบ
| ฟังก์ชันการทำงาน | แชทเก่า | TextChatService |
|---|---|---|
| กรองข้อความแชทสำหรับผู้เล่นแต่ละคน | Chat:FilterStringAsync() | อัตโนมัติ |
| กรองข้อความที่ออกอากาศ | Chat:FilterStringForBroadcast() | อัตโนมัติ |
หน้าต่างและแชทฟอง
ทั้งพฤติกรรมและตัวเลือกการปรับแต่งของ หน้าต่างแชท และ แชทฟอง ของ TextChatService เหมือนกับระบบแชทเก่า เนื่องจากระบบแชทเก่าอนุญาตให้ปรับแต่งได้เฉพาะโดยใช้โมดูลแชทหรือคอนเทนเนอร์ Players บริการนี้จึงมีคลาสเฉพาะ (ChatWindowConfiguration และ BubbleChatConfiguration) เพื่อจัดการคุณสมบัติของหน้าต่างแชทและแชทฟองทั้งหมด นอกจากนี้คุณยังสามารถปรับแต่งและดูตัวอย่างลักษณะและพฤติกรรมของแชทฟองได้อย่างง่ายดายโดยใช้การตั้งค่าใน Studio แทนที่จะต้องเขียนสคริปต์ทั้งหมด
| ฟังก์ชันการทำงาน | แชทเก่า | TextChatService |
|---|---|---|
| เปิดใช้งานหน้าต่างแชท | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
| เปิดใช้งานแชทฟอง | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
| ตั้งค่าคุณสมบัติของหน้าต่างแชท | Players:SetChatStyle() | ChatWindowConfiguration |
| ตั้งค่าคุณสมบัติของแชทฟอง | Chat:SetBubbleChatSettings() Chat.BubbleChatSettingsChanged() Players.BubbleChat Players:SetChatStyle() | BubbleChatConfiguration |
| เปิดใช้งานฟอง NPC | Chat:Chat() | TextChatService:DisplayBubble() |
ย้ายข้อมูล "เพิ่มเติม" ของผู้พูด
ระบบแชท Lua เก่าอนุญาตให้ผู้พัฒนาสามารถใช้ SetExtraData บนคลาส Speaker ข้อมูลนี้ถูกใช้เพื่อจัดรูปแบบสีชื่อ สีแชท หรือใช้แท็กชื่อสำหรับผู้พูดที่กำหนด
-- ตัวอย่างการตั้งค่าข้อมูลเพิ่มเติมบนผู้พูดในระบบแชทเก่า
ChatService.SpeakerAdded:Connect(function(playerName)
local speaker = ChatService:GetSpeaker(playerName)
speaker:SetExtraData("NameColor", Color3.fromRGB(255, 255, 55))
speaker:SetExtraData("ChatColor", Color3.fromRGB(212, 175, 55))
speaker:SetExtraData("Tags", {{TagText = "YourTagName", TagColor = Color3.fromRGB(0, 255, 0)}, {TagText = "OtherTagName", TagColor = Color3.fromRGB(255, 0, 0)}})
end)TextChatService ไม่มีสิ่งที่เทียบเท่ากับ SetExtraData โดยตรง แทนที่จะใช้ การเรียกกลับ เช่น OnWindowAdded เพื่อปรับแต่งลักษณะของข้อความโดยใช้ rich text ตาม TextSource ของข้อความ
ต่อไปนี้เป็นตัวอย่างการเลียนแบบ "ข้อมูลเพิ่มเติม" ของแชท Lua เก่าด้วยการเข้าถึงคุณสมบัติในวัตถุ Player:
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
player:SetAttribute("NameColor", Color3.fromRGB(255, 255, 55))
player:SetAttribute("ChatColor", Color3.fromRGB(212, 175, 55))
player:SetAttribute("isYourTag", true)
player:SetAttribute("isOtherTag", true)
end)จากนั้นคุณสามารถใช้การเรียกกลับ OnChatWindowAdded เพื่อปรับแต่งลักษณะของหน้าต่างแชทตามคุณสมบัติที่ตั้งค่าไว้ในผู้เล่น:
local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
TextChatService.OnChatWindowAdded = function(textChatMessage)
local textSource = textChatMessage.TextSource
if textSource then
local player = Players:GetPlayerByUserId(textSource.UserId)
if player then
local overrideProperties = TextChatService.ChatWindowConfiguration:DeriveNewMessageProperties()
overrideProperties.PrefixText = textChatMessage.PrefixText
overrideProperties.Text = textChatMessage.Text
local nameColor = player:GetAttribute("NameColor")
if nameColor and typeof(nameColor) == "Color3" then
overrideProperties.PrefixTextProperties.TextColor3 = nameColor
end
local chatColor = player:GetAttribute("ChatColor")
if chatColor and typeof(chatColor) == "Color3" then
overrideProperties.TextColor3 = chatColor
end
local isYourTag = player:GetAttribute("isYourTag")
if isYourTag == true then
overrideProperties.PrefixText = `<font color='rgb(0, 255, 0)'>[YourTag]</font> {overrideProperties.PrefixText}`
end
local isOtherTag = player:GetAttribute("isOtherTag")
if isOtherTag == true then
overrideProperties.PrefixText = `<font color='rgb(255, 0, 0)'>[OtherTag]</font> {overrideProperties.PrefixText}`
end
return overrideProperties
end
end
return nil
end