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

ผู้เล่นส่งข้อความจากอุปกรณ์ส่วนตัวของเขา ซึ่งกระตุ้นให้เรียกใช้เมธอด 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 พึ่งพา ข้อความที่มีรูปแบบ เพื่อจัดรูปแบบและปรับแต่งการแสดงผลข้อความ คุณสามารถใช้การเรียกกลับต่อไปนี้เพื่อตกแต่งข้อความก่อนที่จะแสดงให้ผู้ใช้ เช่น เพื่อเพิ่มสีหรือ แท็กแชท ไปยังชื่อผู้ใช้หรือตกแต่งเนื้อหาข้อความ
การเรียกกลับต่อไปนี้จะถูกเรียกใช้ในทุก 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() สนับสนุนฟีเจอร์แชทขั้นสูงมากขึ้น เช่น การจัดรูปแบบข้อความที่มีสีและลำดับชั้นของข้อความ นอกจากนี้ยังรวมถึงการกรองที่มาพร้อมกับการช่วยป้องกันไม่ให้มีข้อความที่ไม่เหมาะสมถูกส่งออก |
| Implement messaging callbacks | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | ระบบแชทยุคเก่าผูกฟังก์ชันกับเหตุการณ์ระบบแชทเพื่อส่งข้อความ การใช้งานด้านต่าง ๆ ของ TextChatService มีความยืดหยุ่นและปรับแต่งได้ดีกว่า |
| เพิ่มคำสั่งแชทที่กำหนดเอง | โมดูล ChatService/ChatCommand | TextChatCommand | TextChatService มีคลาสต dedicated สำหรับคำสั่งข้อความแทนที่จะใช้โมดูลแชทยุคเก่า |
| แสดงข้อความระบบ | StarterGui:SetCore() โดยใช้ ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | การเรียกกลับ TextChannel.OnIncomingMessage สามารถส่งคืนอินสแตนซ์ของ TextChatMessageProperties เพื่อตกแต่งลักษณะของข้อความ |
| ปิดการแชท | การตั้งค่าประสบการณ์ ใน Studio และโมดูล 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 ข้อมูลนี้ถูกใช้เพื่อตกแต่งสีของชื่อ สีข้อความแชท หรือกำหนดแท็กชื่อสำหรับผู้พูดที่กำหนด
ระบบแชทยุคเก่า SetExtraData
-- ตัวอย่างการตั้งค่าข้อมูลเสริมสำหรับผู้พูดในระบบแชทยุคเก่า
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 เพื่อปรับแต่งรูปลักษณ์ของข้อความโดยใช้ข้อความที่มีรูปแบบตาม TextSource ของข้อความ
ตัวอย่างด้านล่างแสดงการทำงานของ "ข้อมูลเสริม" ในแชทยุคเก่าโดยการเข้าถึงคุณสมบัติต่าง ๆ บนวัตถุ Player:
TextChatService SetAttributes
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 เพื่อตกแต่งรูปลักษณ์ของหน้าต่างแชตตามคุณสมบัติที่ตั้งค่าในผู้เล่น:
TextChatService 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