Roblox menawarkan pengiriman pesan berbasis teks antara pemain dalam sesi langsung melalui TextChatService, sebuah kelas singleton yang bertanggung jawab untuk mengelola sistem obrolan secara keseluruhan, termasuk penyaringan pesan obrolan, moderasi, dan izin pengguna. Layanan ini memiliki fungsionalitas standar dan juga menyediakan serangkaian metode dan peristiwa untuk memperluas dan menyesuaikan obrolan, seperti mengirim pesan berdasarkan persyaratan yang disesuaikan, menambahkan izin khusus atau moderasi untuk pemain tertentu, dan membuat perintah khusus untuk mengeksekusi tindakan tertentu.
Konfigurasi UI
TextChatService menyediakan UI default yang dapat disesuaikan untuk memenuhi kebutuhan permainan Anda. Nonaktifkan salah satu konfigurasi ini untuk menyembunyikan elemen UI terkait. Jika diinginkan, Anda juga dapat mengganti elemen UI ini dengan antarmuka kustom:
Untuk informasi lebih lanjut, lihat Jendela obrolan dan Obrolan gelembung.
Saluran, pesan, dan perintah
TextChannel — Saluran teks mengirimkan pesan yang dikirim pengguna dari klien ke server, yang kemudian menampilkannya kepada pengguna lain berdasarkan izin. Saluran teks harus diparent ke TextChatService agar dapat berfungsi.
TextSource — Seorang pengguna dalam TextChannel. Sumber teks diparent langsung ke TextChannel ketika AddUserAsync() dipanggil. Sumber teks berisi izin terperinci dari seorang pengguna di saluran, seperti kemampuannya untuk mengirim pesan. Jika seorang pengguna berada di beberapa saluran teks, mereka terkait dengan beberapa sumber teks.
TextChatMessage — Sebuah pesan dalam saluran teks. Pesan obrolan berisi informasi dasar seperti pengirim pesan, pesan asli, pesan yang disaring, dan cap waktu pembuatan.
TextChatCommand — Memungkinkan pengguna untuk memanggil tindakan atau perilaku tertentu dengan mengirim pesan yang cocok dengan properti PrimaryAlias atau SecondaryAlias. Perintah obrolan harus diparent ke TextChatService agar dapat berfungsi.
Diagram alur obrolan
Obrolan teks menggunakan model klien-server, dengan klien pengirim, server, dan klien penerima.

Seorang pemain mengirim pesan dari perangkat lokal mereka, memicu metode TextChannel:SendAsync(). Metode ini memproses pesan dan menentukan apakah itu adalah perintah obrolan atau pesan obrolan biasa.
Jika pesan adalah perintah obrolan, itu memicu peristiwa TextChatCommand.Triggered untuk melakukan tindakan yang ditentukan. Tidak ada langkah lebih lanjut yang diperlukan.
Jika pesan adalah pesan obrolan biasa, itu memicu peristiwa TextChatService.SendingMessage untuk menampilkan pesan kepada pengirim di klien pengirim. Pada saat yang sama, TextChannel:SendAsync() mengirimkan pesan ke server.
Server memicu TextChannel.ShouldDeliverCallback untuk menentukan apakah pesan harus disampaikan kepada pemain lain berdasarkan izin dan persyaratan penyaringan komunitas Roblox.
Jika TextChannel.ShouldDeliverCallback menentukan bahwa pesan memenuhi syarat untuk disampaikan kepada pemain lain, server menerapkan filter apa pun dan memicu TextChannel.OnIncomingMessage dua kali:
Pertama kali di klien pengirim dan menandakan bahwa server sedang memproses pesan melalui peristiwa TextChatService.MessageReceived. Peristiwa ini menggantikan pesan lokal di klien pengirim dengan pesan yang diproses dari server. Pesan tersebut identik jika yang asli tidak memerlukan penyaringan.
Kedua kali di klien penerima, yang memicu peristiwa TextChatService.MessageReceived untuk menampilkan pesan kepada pemain lain.
Hook dan callback obrolan teks
API TextChatService mendorong pemisahan yang jelas pada penampilan dan pengiriman pesan obrolan. Beberapa instance dari sistem obrolan teks menyediakan hook dan callback untuk memformat di lokasi yang terpusat dan jelas.

Mengirim pesan secara bersyarat
Callback TextChannel.ShouldDeliverCallback harus didefinisikan hanya di server. Callback ini dipicu untuk setiap anak TextSource dari saluran teks ketika sebuah pesan dikirim untuk menentukan apakah pesan tersebut harus disampaikan. Callback ini dapat digunakan untuk menerapkan logika pengiriman pesan kustom yang mungkin bergantung pada konteks permainan tambahan, seperti:
- Obrolan berbasis kedekatan di mana pengguna hanya dapat mengirim pesan kepada mereka yang dekat dengan mereka.
- Mencegah pengguna dengan atribut tertentu mengirim pesan kepada orang lain.
Kustomisasi tampilan pesan
UI default TextChatService bergantung pada teks kaya untuk memformat dan menyesuaikan bagaimana pesan ditampilkan. Anda dapat menggunakan callback berikut untuk memformat pesan sebelum ditampilkan kepada pengguna, misalnya untuk menambahkan warna atau tag obrolan ke nama pengguna atau memformat konten pesan.
Callback berikut dipanggil pada setiap TextChatMessage yang akan ditampilkan, yang memungkinkan Anda menyesuaikan penampilan jendela obrolan berdasarkan TextChannel, TextSource, atau konten TextChatMessage. Ketika klien mengirim pesan, callback ini dipanggil sekali ketika pesan dikirim ke server dan nilai TextChatMessage.Status akan menjadi Enum.TextChatMessageStatus.Sending. Setelah pesan diterima oleh server dan sedang disampaikan kepada pengguna lain, klien pengirim menerima pesan lagi dengan nilai Enum.TextChatMessageStatus yang diperbarui.
- TextChatService.OnIncomingMessage — Callback ini harus didefinisikan hanya di klien. Callback ini dipicu ketika sebuah pesan diterima, baik dari server atau jika klien lokal baru saja mengirim pesan. Callback ini dipanggil pada setiap TextChatMessage yang diterima dari semua instance TextChannel dan merupakan yang pertama memproses pesan sebelum ditampilkan kepada pengguna.
- TextChannel.OnIncomingMessage — Callback ini harus didefinisikan hanya di klien. Callback ini dipicu ketika sebuah pesan diterima dari server. Callback ini dipanggil pada setiap TextChatMessage yang diterima dari TextChannel. Instance TextChannel default yang dibuat dari TextChatService.CreateDefaultTextChannels memiliki callback ini didefinisikan dan dapat ditimpa.
- TextChatService.OnBubbleAdded — Callback ini harus didefinisikan hanya di klien. Gunakan ini untuk menyesuaikan penampilan gelembung obrolan terlepas dari penampilan pesan di UI jendela obrolan.
- TextChatService.OnChatWindowAdded — Callback ini harus didefinisikan hanya di klien. Gunakan ini untuk menyesuaikan penampilan pesan obrolan di UI jendela obrolan terlepas dari penampilan pesan di gelembung obrolan.
Migrasi dari obrolan lama
Bagian ini membantu Anda dalam migrasi dari sistem obrolan lama dengan menyediakan metode alternatif untuk menerapkan fungsionalitas dan perilaku obrolan umum menggunakan TextChatService.
Di jendela Explorer, pilih TextChatService.
Di jendela Properties, temukan dropdown ChatVersion dan pilih TextChatService.

Fungsionalitas dasar
Meskipun kedua sistem memiliki fungsionalitas obrolan dasar yang sama, implementasi TextChatService umumnya lebih berkelanjutan dan lebih mudah untuk diiterasi.
| Fungsionalitas | Obrolan lama | TextChatService | Perbedaan |
|---|---|---|---|
| Kirim pesan obrolan | Players:Chat() | TextChannel:SendAsync() | Metode SendAsync() mendukung fitur obrolan yang lebih canggih, seperti pemformatan teks kaya dan prioritas pesan. Ini juga mencakup penyaringan bawaan untuk membantu mencegah pesan yang tidak pantas dikirim. |
| Implementasikan callback pesan | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | Sistem obrolan lama mengikat fungsi ke peristiwa sistem obrolan untuk mengirimkan pesan. Dua metode dari TextChatService menawarkan fleksibilitas dan kustomisasi yang lebih baik. |
| Tambahkan perintah obrolan kustom | Modul ChatService/ChatCommand | TextChatCommand | TextChatService memiliki kelas khusus untuk perintah teks daripada menggunakan modul obrolan lama. |
| Tampilkan pesan sistem | StarterGui:SetCore() menggunakan ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | Callback TextChannel.OnIncomingMessage dapat mengembalikan instance TextChatMessageProperties untuk menyesuaikan penampilan pesan. |
| Nonaktifkan obrolan | Modul ChatWindow/ChatSettings untuk menyembunyikan jendela obrolan | ChatWindowConfiguration.Enabled |
Penyaringan pesan
TextChatService secara otomatis menyaring pesan obrolan berdasarkan informasi akun masing-masing pemain, sehingga Anda tidak perlu secara manual menerapkan penyaringan teks untuk semua jenis pesan obrolan.
| Fungsionalitas | Obrolan lama | TextChatService |
|---|---|---|
| Saring pesan obrolan untuk pemain individu | Chat:FilterStringAsync() | Otomatis |
| Saring pesan siaran | Chat:FilterStringForBroadcast() | Otomatis |
Jendela dan obrolan gelembung
Baik jendela obrolan maupun perilaku dan opsi kustomisasi obrolan gelembung dari TextChatService identik dengan sistem obrolan lama. Karena sistem obrolan lama hanya memungkinkan kustomisasi menggunakan modul obrolan atau wadah Players, layanan ini menyediakan kelas khusus (ChatWindowConfiguration dan BubbleChatConfiguration) untuk mengelola semua properti jendela obrolan dan obrolan gelembung. Selain itu, Anda dapat dengan mudah menyesuaikan dan melihat properti penampilan dan perilaku obrolan gelembung Anda menggunakan pengaturan Studio alih-alih harus menyusunnya semua.
| Fungsionalitas | Obrolan lama | TextChatService |
|---|---|---|
| Aktifkan Jendela Obrolan | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
| Aktifkan Obrolan Gelembung | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
| Atur Properti Jendela Obrolan | Players:SetChatStyle() | ChatWindowConfiguration |
| Atur Properti Obrolan Gelembung | Chat:SetBubbleChatSettings() Chat.BubbleChatSettingsChanged() Players.BubbleChat Players:SetChatStyle() | BubbleChatConfiguration |
| Aktifkan Gelembung NPC | Chat:Chat() | TextChatService:DisplayBubble() |
Migrasi "data tambahan" pembicara
Sistem obrolan Lua lama memungkinkan pengembang untuk menggunakan SetExtraData pada kelas Speaker. Data ini digunakan untuk memformat warna nama, warna obrolan, atau untuk menerapkan tag nama untuk pembicara tertentu.
-- Contoh pengaturan data tambahan pada pembicara dalam sistem obrolan lama
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 tidak memiliki padanan langsung untuk SetExtraData. Sebagai gantinya, gunakan callback seperti OnWindowAdded untuk menyesuaikan penampilan pesan menggunakan teks kaya berdasarkan TextSource dari pesan tersebut.
Berikut adalah contoh meniru "data tambahan" obrolan Lua lama dengan mengakses atribut pada objek 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)Kemudian Anda dapat menggunakan callback OnChatWindowAdded untuk menyesuaikan penampilan jendela obrolan berdasarkan atribut yang ditetapkan pada pemain:
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