Sesli sohbet, oyuncuların 3D alanda birbirine yaklaşırken veya uzaklaşırken konuşma seslerinin hacmini ayarlayarak gerçekçi iletişimi simüle eden bir yakınlık tabanlı sohbet özelliğidir. Oyuncuların mikrofonlarıyla birbirleriyle konuşmalarına izin vererek, oyun hedeflerinizi tamamlamak için dünya genelinde gerçek zamanlı olarak sosyalleşmelerini ve strateji geliştirmelerini sağlar.
Gingerbread Island - Sesli Sohbet .rbxl dosyasını referans alarak, bu eğitimde oyununuza sesli sohbetin farklı biçimlerini nasıl entegre edeceğinizi gösteriyoruz. Aşağıdaki konularda rehberlik sağlanmaktadır:
- Oyuncuları yalnızca takım arkadaşlarıyla sesli sohbet edebilecekleri takımlara ayırma.
- Oyuncuların belirli bir düğmeye basarken mikrofonlarını geçici olarak etkinleştirmelerine izin verme.
- Sesli sohbetin etkin veya devre dışı olduğu zaman dilimlerini yapılandırma.
Aşağıdaki bölümleri örnekle birlikte gözden geçirirken, her kod örneğini kendi sesli sohbet gereksinimlerinize daha iyi uyacak şekilde ayarlayabilirsiniz.
Ayarları yapılandır
Takım sohbeti, butona basarak sohbet veya zaman tabanlı sohbetin uygun şekilde çalışabilmesi için, sesli sohbeti etkinleştirmek ve 3D ortamda ses alıp yaymak için gerekli uygun ses nesnelerini oluşturmak üzere sesli sohbet ayarınızı yapılandırmalısınız.
Oyuncular oyununuza katıldığında, sesli sohbet ayarınız artık:
- Sesli sohbet için uygun olan oyuncuların mikrofonlarını kullanmalarına izin verir.
- Her sesli sohbet için uygun Player nesnesinin altına bir AudioDeviceInput nesnesi oluşturur ve ilişkilendirir.
- Her sesli sohbet için uygun Player.Character altına bir AudioEmitter nesnesi oluşturur ve ilişkilendirir.
- Workspace.CurrentCamera altında bir AudioListener oluşturur ve ilişkilendirir.
Aşağıdaki bölümler, bu ayarları kullanarak üç benzersiz sesli sohbet yapılandırmasını detaylandırmaktadır. Örnek Gingerbread Island - Sesli Sohbet yer dosyası ile birlikte ilerlerken, Explorer penceresinde ilgili devre dışı bırakılmış betiği etkinleştirerek davranışlarını test edebilirsiniz. Her birinin düzgün çalıştığından emin olmak için, bir sonraki yapılandırmaya geçmeden önce betiği tekrar devre dışı bırakmayı unutmayın.

Takım sohbeti ekle
Takım sohbeti, yalnızca aynı takımda bulunan oyuncuların bir oyunda birbirleriyle konuşabildiği veya birbirlerini duyabildiği bir sesli sohbet yapılandırmasıdır. Takım sohbetini oyununuza entegre etmek, oyuncuların oyundaki sorunları çözmek için işbirliği yapmalarını ve strateji geliştirmelerini istediğinizde faydalıdır; örneğin, düşman takım pozisyonları, kaynaklar ve görevler hakkında bilgi koordine etmek.
Örnek Gingerbread Island - Sesli Sohbet yer dosyasında takım sesli sohbetini yeniden oluşturmak için:
Explorer penceresinde, ServerScriptService içine bir Script ekleyin.
Betiği TeamChat olarak yeniden adlandırın, ardından aşağıdaki kodu betiğe yapıştırın:
local Teams = game:GetService("Teams")local Players = game:GetService("Players")local redTeam = Instance.new("Team", Teams)redTeam.TeamColor = BrickColor.new("Bright red")redTeam.AutoAssignable = trueredTeam.Name = "Kırmızı Takım"local blueTeam = Instance.new("Team", Teams)blueTeam.TeamColor = BrickColor.new("Bright blue")blueTeam.AutoAssignable = trueblueTeam.Name = "Mavi Takım"local function getUserIds(team : Team) : {number}local userIds = {}for _, player : Player in team:GetPlayers() dotable.insert(userIds, player.UserId)endreturn userIdsendlocal function getDevices(team : Team) : {AudioDeviceInput}local devices = {}for _, player : Player in team:GetPlayers() dolocal device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")if not device thencontinueendtable.insert(devices, device)endreturn devicesendlocal function updateTeam(team : Team)local users = getUserIds(team)for _, device in getDevices(team) dodevice.AccessType = Enum.AccessModifierType.Allowdevice:SetUserIdAccessList(users)endendlocal function onDeviceAdded(device : AudioDeviceInput)local player : Player = device.Parentif player.Team thenupdateTeam(player.Team)endendlocal function onPlayerAdded(player : Player)local device = player:FindFirstChild("AudioDeviceInput")if device thenonDeviceAdded(device)endplayer.ChildAdded:Connect(function(child)if child.Name == "AudioDeviceInput" thenonDeviceAdded(child)endend)endupdateTeam(blueTeam)updateTeam(redTeam)for _, player in Players:GetPlayers() doonPlayerAdded(player)endPlayers.PlayerAdded:Connect(onPlayerAdded)blueTeam.PlayerAdded:Connect(function() updateTeam(blueTeam) end)blueTeam.PlayerRemoved:Connect(function() updateTeam(blueTeam) end)redTeam.PlayerAdded:Connect(function() updateTeam(redTeam) end)redTeam.PlayerRemoved:Connect(function() updateTeam(redTeam) end)Kod açıklamasıBetik, oyuncuları oyuna katıldıklarında takımlara ayırmak için Teams ve Players hizmetlerini alarak başlar. Örneğin, ek bir betik çabası olmadan, Teams hizmeti şu gibi işlemleri yönetir:
- Oyuncuları her takıma eşit şekilde ayırma ve dengeleme.
- Oyuncuları liderlik tablosunda kendi takımları altında gruplama.
- 3D alanda oyuncu isimlerini karşılık gelen takım rengine göre renklendirme.
Bu hizmeti kullanarak, betik her takım için farklı Color özellik değerlerine sahip iki ayrı Team nesnesi oluşturur: bir takım için parlak kırmızı ve diğer takım için parlak mavi.
Betik daha sonra takım sesli sohbet yapılandırmasını ayarlamak için işlerin büyük kısmının gerçekleştiği üç işlev tanımlar:
- getUserIds - Bir takımda bulunan tüm oyuncuların userID'lerini içeren bir dizi döndürür.
- getDevices - Bir takımda bulunan tüm oyuncular için AudioDeviceInput nesnelerini içeren bir dizi döndürür. Her AudioDeviceInput nesnesi, bir oyuncunun gerçek dünyadaki fiziksel mikrofonunu temsil eder.
- updateTeam - getUserIds'dan tüm userID'leri alır, getDevices'dan AudioDeviceInput nesneleri üzerinde döngü yapar, Enum.AccessModifierType özelliğini Allow olarak ayarlar, böylece her takımda yalnızca userID'lerin mikrofonlarından duyulmasına izin verir ve ardından SetUserIdAccessList'i takımın userID'leri ile günceller.
Betiğin geri kalanı, bu işlevlerin ve olay dinleyicilerinin nasıl birlikte çalıştığını kontrol eder:
- Yeni bir oyuncu oyuna katıldığında, betik oyuncunun bir mikrofonu olup olmadığını doğrular ve takımını günceller.
- Betik yeni bir AudioDeviceInput nesnesi algıladığında, ilgili kırmızı veya mavi takım için updateTeam çağrılır.
- Oyuncular oyuna katıldıkça veya ayrıldıkça, betik her takımın ayarlarını güncellemek için PlayerAdded ve PlayerRemoved olaylarına bağlanır.
Oyunu birkaç arkadaşınızla test edin ve her takımın takım arkadaşlarının yalnızca sesli sohbet aracılığıyla birbirlerini duyabildiğini doğrulayın.
Butona basarak sohbet ekle
Butona basarak sohbet, oyuncuların bir oyunda yalnızca belirli bir düğmeye basıp tuttuğunda mikrofonlarını etkinleştirebildiği bir sesli sohbet yapılandırmasıdır. Butona basarak sohbeti oyununuza entegre etmek, oyuncuların diğer oyuncular ve çevresel gürültü üzerinde duyulma kontrolü ve gizlilik sağlamalarını istediğinizde faydalıdır.
Örnek Gingerbread Island - Sesli Sohbet yer dosyasında butona basarak sesli sohbeti yeniden oluşturmak için:
Explorer penceresinde, ReplicatedStorage içine bir Script ekleyin.
Properties penceresinde, RunContext'i Client olarak ayarlayın, böylece betik yalnızca yerel oyuncunun mikrofonunu kontrol eder.
Betiği PushToChat olarak yeniden adlandırın, ardından aşağıdaki kodu betiğe yapıştırın:
local Players = game:GetService("Players")local UserInputService = game:GetService("UserInputService")local audioIn: AudioDeviceInput = Players.LocalPlayer:WaitForChild("AudioDeviceInput")local pushToTalkKey = Enum.KeyCode.VaudioIn.Muted = trueUserInputService.InputBegan:Connect(function(input: InputObject)if input.KeyCode == pushToTalkKey thenaudioIn.Muted = falseendend)UserInputService.InputEnded:Connect(function(input: InputObject)if input.KeyCode == pushToTalkKey thenaudioIn.Muted = trueendend)Kod açıklamasıBetik, şunları alarak başlar:
- Oyundaki tüm oyuncuları referans alabilmek için Players hizmeti.
- Oyuncunun cihazındaki düğmelere basıldığında kontrol edebilmek için UserInputService hizmeti.
- Yerel oyuncunun AudioDeviceInput nesnesi, yani cihazındaki fiziksel mikrofon.
Betik daha sonra:
- Oyuncunun mikrofonuna konuşabilmesi için basıp tutması gereken düğme olarak V tuşunu ayarlar.
- Oyuncunun mikrofonunu sessize alır.
Betiğin geri kalanı, UserInputService'den InputBegan ve InputEnded için iki olay dinleyicisi ayarlar. Oyuncu V tuşuna bastığında, InputBegan olayı oyuncunun mikrofonunu açar ve V tuşunu bıraktığında, InputEnded olayı mikrofonunu tekrar sessize alır.
Oyunu test edin ve oyuncuların yalnızca V tuşuna bastıklarında sesli sohbet aracılığıyla birbirlerini duyabildiğini doğrulayın.
Zaman tabanlı sohbet ekle
Zaman tabanlı sohbet, oyuncuların yalnızca belirli bir zaman diliminde birbirleriyle konuşabildiği ve duyabildiği bir sesli sohbet yapılandırmasıdır. Zaman tabanlı sohbeti oyununuza entegre etmek, oyuncuların belirli aşamalarda, örneğin tur tabanlı tartışmalar veya kesitlerden sonra, birbirleriyle nasıl iletişim kuracaklarını dikkatlice planlamalarını istediğinizde faydalıdır.
Örnek Gingerbread Island - Sesli Sohbet yer dosyasında zaman tabanlı sesli sohbeti yeniden oluşturmak için:
Explorer penceresinde, ServerScriptService içine bir Script ekleyin.
Betiği TimeBasedChat olarak yeniden adlandırın, ardından aşağıdaki kodu betiğe yapıştırın:
local Players = game:GetService("Players")local muteAll = falselocal function toggleMuteAll()muteAll = not muteAllfor _, player in Players:GetPlayers() dolocal device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")if not device thencontinueenddevice.Muted = muteAllendendwhile true dotask.wait(15) -- her 15 saniyede birtoggleMuteAll() -- ya insanların konuşmasına izin ver, ya da konuşmalarını engelleendKod açıklamasıBu betik, oyundaki tüm oyuncuları yönetmek için Players hizmetini alarak başlar. Ardından, sesli sohbeti açıp kapatmak için kullanılan muteAll bayrağını false olarak ayarlar.
toggleMuteAll fonksiyonunu inceleyelim:
- Players.GetPlayers kullanarak oyundaki tüm oyuncular arasında döngüye başlar.
- Her oyuncu için, cihazındaki bir AudioDeviceInput nesnesi, yani fiziksel mikrofonu olup olmadığını kontrol eder.
- Eğer varsa, fonksiyon AudioDeviceInput nesnesinin Muted özelliğini muteAll değerine ayarlar. Örneğin, muteAll true ise, oyuncunun mikrofonu devre dışı kalır; muteAll false ise, oyuncunun mikrofonu etkinleştirilir.
Betik daha sonra sonsuz bir döngüye girer, her 15 saniyede bir tüm AudioDeviceInput nesnelerini sessize alır veya sessizden çıkarır.
Oyunu test edin ve oyuncuların yalnızca 15 saniyelik aralıklarla sesli sohbet aracılığıyla birbirlerini duyabildiğini doğrulayın.