Sistem obrolan teks dalam permainan, yang didukung oleh TextChatService, memungkinkan pemain untuk dengan mudah berkomunikasi dan bersosialisasi satu sama lain dalam permainan langsung. Selain mendukung obrolan teks default, Anda dapat mengustomisasi antarmuka pengguna front-end.
Konfigurasi jendela obrolan
Jendela obrolan keseluruhan terdiri dari:
- Jendela obrolan
- Bilah input
- Tab saluran (opsional)

Tab saluran tidak aktif secara default dan setiap komponen dapat dihidupkan dan dimatikan di Studio atau melalui pemrograman:
Di jendela Explorer, perluas cabang TextChatService dan pilih ChatWindowConfiguration, ChatInputBarConfiguration, atau ChannelTabsConfiguration. Kemudian aktifkan atau nonaktifkan komponen di jendela Properties.

Ketika ChannelTabsConfiguration diaktifkan, setiap default TextChannel muncul dalam tab seperti yang diuraikan dalam tabel berikut. Selain itu, setiap TextChannel yang disesuaikan membuat tab yang sesuai dengan properti Name dari saluran tersebut.
| Saluran default | Nama tab |
|---|---|
| RBXGeneral | Umum |
| RBXSystem | Umum (digabungkan menjadi satu tab dengan RBXGeneral) |
| RBXTeam | Tim |
| RBXWhisper | Nama pengguna dari pemain lain |
Penampilan jendela
Penampilan jendela obrolan keseluruhan dapat disesuaikan melalui ChatWindowConfiguration.

| Properti | Deskripsi | Default |
|---|---|---|
| BackgroundColor3 | Warna latar belakang Color3 dari jendela obrolan. | [25, 27, 29] |
| BackgroundTransparency | Transparansi latar belakang jendela obrolan. | 0.3 |
| Enabled | Apakah akan menampilkan jendela obrolan default. Atur ke false untuk menyembunyikan. | true |
| FontFace | Font dari teks jendela obrolan. | BuilderSansMedium |
| TextColor3 | Color3 dari teks jendela obrolan. | [255, 255, 255] |
| TextSize | Ukuran teks jendela obrolan. | 14 |
| TextStrokeColor3 | Color3 dari stroke untuk teks jendela obrolan. | [0, 0, 0] |
| TextStrokeTransparency | Transparansi dari stroke untuk teks jendela obrolan. | 0.5 |
| HorizontalAlignment | Penyelarasan horizontal jendela obrolan. | Left |
| VerticalAlignment | Penyelarasan vertikal jendela obrolan. | Top |
| HeightScale | Skala tinggi jendela obrolan relatif terhadap ukuran layar. | 1 |
| WidthScale | Skala lebar jendela obrolan relatif terhadap ukuran layar. | 1 |
Penampilan bilah input
Penampilan bilah input obrolan dapat disesuaikan melalui ChatInputBarConfiguration.

| Properti | Deskripsi | Default |
|---|---|---|
| BackgroundColor3 | Warna latar belakang Color3 dari bilah input obrolan. | [25, 27, 29] |
| BackgroundTransparency | Transparansi latar belakang bilah input obrolan. | 0.2 |
| FontFace | Font dari teks input obrolan. | BuilderSansMedium |
| PlaceholderColor3 | Color3 dari teks input obrolan placeholder. | [178, 178, 178] |
| TextColor3 | Color3 dari teks input obrolan yang dimasukkan pemain. | [255, 255, 255] |
| TextSize | Ukuran teks input obrolan. | 14 |
| TextStrokeColor3 | Color3 warna stroke dari teks input obrolan. | [0, 0, 0] |
| TextStrokeTransparency | Transparansi dari stroke untuk teks input obrolan. | 0.5 |
| AutocompleteEnabled | Apakah sistem obrolan teks menunjukkan opsi autocompletion untuk emoji dan perintah. Emoji di-autocomplete dengan mengetik : diikuti oleh karakter non-spasi, sedangkan perintah di-autocomplete dengan mengetik /. | true |
| KeyboardKeyCode | Key tambahan yang dapat ditekan pemain untuk memicu fokus pada bilah input obrolan default. | Slash |
Penampilan tab saluran
Penampilan tab saluran dapat disesuaikan melalui ChannelTabsConfiguration.

| Properti | Deskripsi | Default |
|---|---|---|
| BackgroundColor3 | Warna latar belakang Color3 dari tab saluran. | [25, 27, 29] |
| BackgroundTransparency | Transparansi latar belakang tab saluran. | 0 |
| HoverBackgroundColor3 | Warna latar belakang Color3 dari tab saat mengarahkan kursor di atasnya. | [125, 125, 125] |
| FontFace | Font untuk teks di tab saluran. | BuilderSansBold |
| TextColor3 | Color3 dari teks di tab yang tidak dipilih. | [175, 175, 175] |
| SelectedTabTextColor3 | Color3 dari teks di tab yang dipilih. | [255, 255, 255] |
| TextSize | Ukuran teks di tab saluran. | 18 |
| TextStrokeColor3 | Color3 warna stroke dari teks di tab saluran. | [0, 0, 0] |
| TextStrokeTransparency | Transparansi dari stroke untuk teks di tab saluran. | 1 |
Kustomisasi pesan
Anda dapat mengustomisasi penampilan badan pesan obrolan dan prefix menggunakan ChatWindowMessageProperties dan TextChatService.OnChatWindowAdded callbacks tanpa menggantikan UI yang ada. Opsi kustomisasi ini memungkinkan Anda memodifikasi penampilan pesan obrolan agar sesuai dengan tema permainan Anda, dan Anda juga dapat menyortir atau menyoroti pesan dari grup pengguna yang berbeda dengan mewarnai prefix atau menambahkan tag obrolan.
Warnai nama pengguna
Ketika seorang pengguna mengirim pesan obrolan, DisplayName mereka tampil sebagai bagian prefix dari pesan tersebut. Secara default, nama setiap pengguna diberi warna sesuai dengan Player.TeamColor tetapi Anda dapat mengubah warna nama obrolan menggunakan ChatWindowMessageProperties dan OnChatWindowAdded. Skrip LocalScript berikut dalam StarterPlayerScripts mengassign warna yang telah ditentukan untuk setiap pengguna, memilih secara acak dari tabel warna RGB.

LocalScript - Warna Nama Pengguna Acak
local TextChatService = game:GetService("TextChatService")
local chatWindowConfiguration = TextChatService.ChatWindowConfiguration
local nameColors = {
Color3.fromRGB(255, 0, 0),
Color3.fromRGB(0, 255, 0),
Color3.fromRGB(0, 0, 255),
Color3.fromRGB(255, 255, 0),
}
TextChatService.OnChatWindowAdded = function(message: TextChatMessage)
local properties = chatWindowConfiguration:DeriveNewMessageProperties()
local textSource = message.TextSource
if textSource then
local index: number = (textSource.UserId % #nameColors) + 1
local randomColor: Color3 = nameColors[index]
properties.PrefixTextProperties = chatWindowConfiguration:DeriveNewMessageProperties()
properties.PrefixTextProperties.TextColor3 = randomColor
end
return properties
end
Anda juga bisa menerapkan gradien warna dan transparansi untuk mewarnai prefix pesan menggunakan UIGradient.

Warna Nama Pengguna Gradien
local TextChatService = game:GetService("TextChatService")
local chatWindowConfiguration = TextChatService.ChatWindowConfiguration
local gradient = Instance.new("UIGradient")
gradient.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 0, 0)),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(255, 255, 0)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(255, 0, 255))
}
TextChatService.OnChatWindowAdded = function(message: TextChatMessage)
local properties = chatWindowConfiguration:DeriveNewMessageProperties()
local textSource = message.TextSource
if textSource then
properties.PrefixTextProperties = chatWindowConfiguration:DeriveNewMessageProperties()
gradient:Clone().Parent = properties.PrefixTextProperties
end
return properties
end
Kustomisasi teks kaya
Tag warna font teks kaya dapat digunakan untuk memformat pesan obrolan, berguna jika Anda ingin menerapkan pemformatan pada bagian tertentu dari pesan. Perlu dicatat bahwa teks kaya tidak mendukung gradien, tetapi contoh kode berikut menunjukkan bagaimana Anda dapat memindahkan nama pengguna (disimpan dalam TextChatMessage.PrefixText) ke dalam badan pesan dan kemudian menerapkan tagging teks kaya hanya pada bagian nama.

Kustomisasi Teks Kaya
local TextChatService = game:GetService("TextChatService")
local Players = game:GetService("Players")
local chatWindowConfiguration = TextChatService.ChatWindowConfiguration
local gradient = Instance.new("UIGradient")
gradient.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 0, 0)),
ColorSequenceKeypoint.new(0.5, Color3.fromRGB(255, 255, 0)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(255, 0, 255))
}
TextChatService.OnChatWindowAdded = function(message: TextChatMessage)
local properties = chatWindowConfiguration:DeriveNewMessageProperties()
if message.TextSource then
properties.PrefixText = "[VIP]"
properties.Text = string.format("<font color='#00ffff'>%s</font>", message.PrefixText) .. " " .. message.Text
properties.PrefixTextProperties = chatWindowConfiguration:DeriveNewMessageProperties()
gradient:Clone().Parent = properties.PrefixTextProperties
end
return properties
end
Pesan dari sumber non-pemain
Ketika TextChatService.CreateDefaultTextChannels adalah true, salah satu saluran teks default adalah saluran RBXSystem. Skrip obrolan default secara otomatis menampilkan pesan sistem dalam saluran ini. Anda dapat mengustomisasi penampilan pesan ini menggunakan callback TextChannel.OnIncomingMessage.
Anda mungkin ingin menyesuaikan atau mengubah pesan sistem yang secara otomatis dikeluarkan oleh sistem obrolan. Karena pesan sistem default dilokalisasi untuk pengguna, Anda harus merujuknya dengan TextChatMessage.Metadata dalam callback obrolan teks jika Anda ingin menyesuaikan penampilannya. Misalnya, Anda bisa menggunakan Metadata untuk mengidentifikasi pesan sistem, pesan kesalahan, atau pesan dari sistem tertentu dalam permainan Anda.
Sistem
Untuk mengirim pesan sistem kepada pemain lokal, seperti "pidato" dari sistem pengumuman umum, panggil DisplaySystemMessage() dari saluran default RBXGeneral dengan prefix sebelum nama tampilan pemain.
Skrip Klienlocal Players = game:GetService("Players")local TextChatService = game:GetService("TextChatService")local player = Players.LocalPlayerlocal generalChannel: TextChannel = TextChatService:WaitForChild("TextChannels").RBXGenerallocal PREFIX = "[Panduan] Selamat datang "-- Kirim "pesan sistem" ke pemain dengan nama tampilan mereka dilampirkangeneralChannel:DisplaySystemMessage(PREFIX .. player.DisplayName)

NPC/objek
Anda juga dapat menata dialog non-pemain dan menambahkan gelembung obrolan untuk membuatnya tampak seolah pesan datang dari NPC atau objek dalam dunia 3D.
Skrip Klien
local TextChatService = game:GetService("TextChatService")
local Workspace = game:GetService("Workspace")
local generalChannel: TextChannel = TextChatService:WaitForChild("TextChannels").RBXGeneral
TextChatService.OnIncomingMessage = function(textChatMessage: TextChatMessage)
local properties = Instance.new("TextChatMessageProperties")
-- Periksa pesan sistem yang mengandung metadata
if not textChatMessage.TextSource and textChatMessage.Metadata ~= "" then
-- Tambahkan prefix agar pesan terlihat seolah dikirim oleh pemain
properties.PrefixText = string.format("<font color='#%s'>%s: </font>", "#50C999", textChatMessage.Metadata)
-- Tambahkan gelembung obrolan
TextChatService:DisplayBubble(Workspace.Statue, textChatMessage.Text)
end
return properties
end
local message = "Selamat datang! Saya akan menjadi panduan Anda."
local speakerName = "Ksatria Kuno"
generalChannel:DisplaySystemMessage(message, speakerName)
