Roblox, oyuncular arasında canlı oturumlarda metin tabanlı mesajlaşma sunar. Bu, genel sohbet sistemini yönetmekten sorumlu olan TextChatService adlı tekil bir sınıf aracılığıyla gerçekleştirilir. Bu sınıf, sohbet mesajı filtreleme, moderasyon ve kullanıcı izinleri gibi işlevsellikler sunar. Bu hizmet, standart işlevselliğinin yanı sıra, özelleştirilmiş gereksinimlere dayalı olarak mesaj iletme, belirli oyunculara özel izinler veya moderasyon ekleme ve belirli eylemleri gerçekleştirmek için özel komutlar oluşturma gibi sohbeti genişletmek ve özelleştirmek için bir dizi yöntem ve olay sağlar.
UI yapılandırması
TextChatService, oyununuzun ihtiyaçlarına uyacak şekilde özelleştirilebilen varsayılan bir UI sağlar. Bu yapılandırmalardan herhangi birini devre dışı bırakmak, ilişkili UI öğesini gizler. İsterseniz, bu UI öğelerini özel arayüzlerle de değiştirebilirsiniz:
Daha fazla bilgi için Sohbet penceresi ve Baloncuk sohbeti sayfalarına bakın.
Kanallar, mesajlar ve komutlar
TextChannel — Metin kanalları, kullanıcı tarafından gönderilen mesajları istemciden sunucuya iletir ve sunucu, bu mesajları izinlere göre diğer kullanıcılara gösterir. Metin kanalları, işlevsellik kazanabilmek için TextChatService'e bağlı olmalıdır.
TextSource — TextChannel içindeki bir kullanıcı. Metin kaynakları, AddUserAsync() çağrıldığında doğrudan TextChannel'a bağlıdır. Metin kaynakları, kanaldaki bir kullanıcının mesaj gönderme yeteneği gibi ayrıntılı izinleri içerir. Bir kullanıcı birden fazla metin kanalında bulunuyorsa, birden fazla metin kaynağı ile ilişkilendirilir.
TextChatMessage — Bir metin kanalındaki bir mesaj. Sohbet mesajları, mesajın göndericisi, orijinal mesaj, filtrelenmiş mesaj ve oluşturulma zaman damgası gibi temel bilgileri içerir.
TextChatCommand — Kullanıcıların PrimaryAlias veya SecondaryAlias özellikleriyle eşleşen mesajlar göndererek belirli eylemleri veya davranışları tetiklemesine olanak tanır. Sohbet komutları, işlevsellik kazanabilmek için TextChatService'e bağlı olmalıdır.
Sohbet akış diyagramı
Metin sohbeti, istemci-sunucu modelini kullanır; bir gönderen istemci, sunucu ve alıcı istemciler vardır.

Bir oyuncu, yerel cihazından bir mesaj gönderir ve bu, TextChannel:SendAsync() yöntemini tetikler. Bu yöntem, mesajı işler ve bunun bir sohbet komutu mu yoksa normal bir sohbet mesajı mı olduğunu belirler.
Eğer mesaj bir sohbet komutuysa, tanımlı eylemi gerçekleştirmek için TextChatCommand.Triggered olayını tetikler. Başka bir adım gerekmemektedir.
Eğer mesaj normal bir sohbet mesajıysa, gönderen istemcide mesajı görüntülemek için TextChatService.SendingMessage olayını tetikler. Aynı zamanda, TextChannel:SendAsync() mesajı sunucuya iletir.
Sunucu, izinler ve Roblox topluluk filtreleme gereksinimlerine göre mesajı diğer oyunculara iletip iletmeyeceğine karar vermek için TextChannel.ShouldDeliverCallback olayını tetikler.
Eğer TextChannel.ShouldDeliverCallback, mesajın diğer oyunculara iletilmeye uygun olduğunu belirlerse, sunucu herhangi bir filtre uygular ve TextChannel.OnIncomingMessage olayını iki kez tetikler:
İlk olarak, gönderen istemcide ve sunucunun mesajı işlediğini bildiren TextChatService.MessageReceived olayını tetikler. Bu olay, gönderen istemcideki yerel mesajı sunucudan alınan işlenmiş mesajla değiştirir. Mesaj, orijinal mesaj filtreleme gerektirmediyse aynıdır.
İkinci kez, alıcı istemcilerde, diğer oyunculara mesajı göstermek için TextChatService.MessageReceived olayını tetikler.
Metin sohbeti kancaları ve geri çağırmaları
TextChatService API'si, sohbet mesajlarının görünümü ve iletimi arasında net bir ayrım teşvik eder. Metin sohbeti sisteminin birden fazla örneği, merkezi ve net yerlerde biçimlendirme için kancalar ve geri çağırmalar sağlar.

Şartlı mesaj iletimi
TextChannel.ShouldDeliverCallback geri çağırması yalnızca sunucuda tanımlanmalıdır. Bir mesaj gönderildiğinde, metin kanalının her TextSource çocuğu için geri çağırma tetiklenir ve mesajın iletilip iletilmeyeceğine karar verilir. Bu geri çağırma, ek oyun bağlamına bağlı olabilecek özel mesaj iletme mantığını uygulamak için kullanılabilir, örneğin:
- Yakınlık tabanlı sohbet kullanıcıların yalnızca kendilerine yakın olanlara mesaj göndermesine izin verir.
- Belirli özelliklere sahip kullanıcıların diğerlerine mesaj göndermesini engellemek.
Mesaj görüntüleme özelleştirme
Varsayılan TextChatService UI'sı, mesajların nasıl görüntüleneceğini biçimlendirmek ve özelleştirmek için zengin metin kullanır. Mesajlar kullanıcıya gösterilmeden önce biçimlendirmek için aşağıdaki geri çağırmaları kullanabilirsiniz; örneğin, kullanıcı adlarına renkler veya sohbet etiketleri eklemek için.
Aşağıdaki geri çağırmalar, görüntülenecek her TextChatMessage için çağrılır ve bu, TextChannel, TextSource veya TextChatMessage içeriğine göre sohbet penceresi görünümünü özelleştirmenizi sağlar. Bir istemci bir mesaj gönderdiğinde, bu geri çağırmalar, mesaj sunucuya gönderildiğinde bir kez çağrılır ve TextChatMessage.Status değeri Enum.TextChatMessageStatus.Sending olur. Mesaj sunucu tarafından alındığında ve diğer kullanıcılara iletilirken, gönderen istemci güncellenmiş Enum.TextChatMessageStatus değeri ile mesajı tekrar alır.
- TextChatService.OnIncomingMessage — Bu geri çağırma yalnızca istemcide tanımlanmalıdır. Bir mesaj alındığında, ya sunucudan ya da yerel istemcinin yeni bir mesaj gönderdiğinde tetiklenir. Bu geri çağırma, tüm TextChannel örneklerinden alınan her TextChatMessage için çağrılır ve kullanıcıya gösterilmeden önce mesajı işlemek için ilk olanıdır.
- TextChannel.OnIncomingMessage — Bu geri çağırma yalnızca istemcide tanımlanmalıdır. Bir mesaj sunucudan alındığında tetiklenir. Bu geri çağırma, TextChannel'dan alınan her TextChatMessage için çağrılır. TextChatService.CreateDefaultTextChannels ile oluşturulan varsayılan TextChannel örneklerinde bu geri çağırma tanımlıdır ve üzerine yazılabilir.
- TextChatService.OnBubbleAdded — Bu geri çağırma yalnızca istemcide tanımlanmalıdır. Sohbet penceresi UI'sindeki mesajın görünümünden bağımsız olarak sohbet baloncuklarının görünümünü özelleştirmek için kullanın.
- TextChatService.OnChatWindowAdded — Bu geri çağırma yalnızca istemcide tanımlanmalıdır. Sohbet baloncuklarındaki mesajın görünümünden bağımsız olarak sohbet penceresindeki sohbet mesajlarının görünümünü özelleştirmek için kullanın.
Eski sohbetten geçiş
Bu bölüm, TextChatService kullanarak yaygın sohbet işlevselliklerini ve davranışlarını uygulamak için alternatif yöntemler sunarak eski sohbet sisteminden geçiş yapmanıza yardımcı olur.
Explorer penceresinde TextChatService'i seçin.
Properties penceresinde, ChatVersion açılır menüsünü bulun ve TextChatService'yi seçin.

Temel işlevsellikler
Her iki sistem de aynı temel sohbet işlevselliklerini paylaşmasına rağmen, TextChatService uygulamaları genel olarak daha sürdürülebilir ve üzerinde iterasyon yapması daha kolaydır.
| İşlevsellik | Eski sohbet | TextChatService | Farklar |
|---|---|---|---|
| Bir sohbet mesajı gönder | Players:Chat() | TextChannel:SendAsync() | SendAsync() yöntemi, zengin metin biçimlendirmesi ve mesaj önceliği gibi daha gelişmiş sohbet özelliklerini destekler. Ayrıca, uygunsuz mesajların gönderilmesini önlemeye yardımcı olmak için yerleşik filtreleme içerir. |
| Mesajlaşma geri çağırmalarını uygulayın | Chat:InvokeChatCallback() Chat:RegisterChatCallback() | TextChatService.SendingMessage TextChatService.OnIncomingMessage | Eski sohbet sistemi, mesajları iletmek için sohbet sistemi olaylarına bir işlev bağlar. TextChatService'in iki yöntemi, daha iyi esneklik ve özelleştirme sunar. |
| Özel sohbet komutları ekle | ChatService/ChatCommand modülü | TextChatCommand | TextChatService, eski bir sohbet modülü kullanmak yerine metin komutları için özel bir sınıfa sahiptir. |
| Bir sistem mesajı görüntüle | StarterGui:SetCore() kullanarak ChatMakeSystemMessage | TextChannel:DisplaySystemMessage() | TextChannel.OnIncomingMessage geri çağırması, mesajın görünümünü özelleştirmek için bir TextChatMessageProperties örneği döndürebilir. |
| Sohbeti devre dışı bırak | ChatWindow/ChatSettings modülü sohbet penceresini gizlemek için | ChatWindowConfiguration.Enabled |
Mesaj filtreleme
TextChatService, sohbet mesajlarını her oyuncunun hesap bilgilerine göre otomatik olarak filtreler, bu nedenle tüm sohbet mesajları için metin filtrelemeyi manuel olarak uygulamanıza gerek yoktur.
| İşlevsellik | Eski sohbet | TextChatService |
|---|---|---|
| Bireysel oyuncu için sohbet mesajını filtrele | Chat:FilterStringAsync() | Otomatik |
| Yayın mesajlarını filtrele | Chat:FilterStringForBroadcast() | Otomatik |
Pencere ve baloncuk sohbeti
TextChatService'in sohbet penceresi ve baloncuk sohbeti davranışları ve özelleştirme seçenekleri, eski sohbet sisteminin özellikleriyle aynıdır. Eski sohbet sistemi yalnızca sohbet modülleri veya Players konteyneri kullanarak özelleştirmeye izin verdiğinden, hizmet, tüm sohbet penceresi ve baloncuk sohbeti özelliklerini yönetmek için özel sınıflar (ChatWindowConfiguration ve BubbleChatConfiguration) sağlar. Ayrıca, tüm bu özellikleri kod yazmak zorunda kalmadan Studio ayarlarını kullanarak kolayca ayarlayabilir ve önizleyebilirsiniz.
| İşlevsellik | Eski sohbet | TextChatService |
|---|---|---|
| Sohbet Penceresini Etkinleştir | Chat.LoadDefaultChat Players.ClassicChat | ChatWindowConfiguration.Enabled |
| Baloncuk Sohbetini Etkinleştir | Chat.BubbleChatEnabled Players.BubbleChat | BubbleChatConfiguration.Enabled |
| Sohbet Penceresi Özelliklerini Ayarla | Players:SetChatStyle() | ChatWindowConfiguration |
| Baloncuk Sohbeti Özelliklerini Ayarla | Chat:SetBubbleChatSettings() Chat.BubbleChatSettingsChanged() Players.BubbleChat Players:SetChatStyle() | BubbleChatConfiguration |
| NPC Baloncuklarını Etkinleştir | Chat:Chat() | TextChatService:DisplayBubble() |
Konuşmacı "ekstra verileri" geçişi
Eski Lua sohbet sistemi, geliştiricilerin Speaker sınıfında SetExtraData kullanmasına izin veriyordu. Bu veri, bir konuşmacının adının rengini, sohbet rengini biçimlendirmek veya belirli bir konuşmacı için ad etiketleri uygulamak için kullanılıyordu.
-- Eski sohbet sisteminde bir konuşmacıya ekstra veri ayarlama örneği
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'in SetExtraData için doğrudan bir karşılığı yoktur. Bunun yerine, mesajın TextSource'una dayalı olarak zengin metin kullanarak mesajların görünümünü özelleştirmek için geri çağırmaları kullanın.
Aşağıda, Player nesneleri üzerindeki özelliklere erişerek eski Lua sohbetinin "ekstra verilerini" taklit etmenin bir örneği verilmiştir:
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)Ardından, oyuncuda ayarlanan özelliklere dayalı olarak sohbet penceresinin görünümünü özelleştirmek için OnChatWindowAdded geri çağırmasını kullanabilirsiniz:
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