3D ses, 3D alandaki belirli bir yerden yayılan yönlü ses olup, ses yayıcı ile dinleyici arasındaki mesafe ve yönelime bağlı olarak sesin yüksekliğinin artması veya azalmasıdır. Bu, dinleyiciler veya yayıcılar çevrede hareket ettikçe, oyuncuların o sesi farklı yönlerden ve ses seviyelerinden dinleyebileceği anlamına gelir.
Gingerbread House - Başlangıç .rbxl dosyasını başlangıç noktası olarak ve Gingerbread House - Tamamlanmış Ses dosyasını referans olarak kullanarak, bu eğitimde oyunlarınıza hem döngüsel hem de tek seferlik 3D ses eklemeyi öğreneceksiniz. Aşağıdaki konularda rehberlik sağlanmaktadır:
- Oyuncular sunucuya bağlandıklarında çalmaya başlayan döngüsel çevresel sesler.
- Oyuncuların oyun deneyimleri için önemli olan ana durum olayları hakkında bilgi vermek için tetiklenen sesler.
- Oyuncuların 3D nesnelerle etkileşime girdiğinde işitsel geri bildirim sağlamak için etkinleştirilen sesler.
- Oyuncuları çevrelerindeki ilgi noktalarına yönlendiren karakter ses kayıtları.
Herhangi bir noktada süreçte takılırsanız, ilerlemenizi karşılaştırmak için Gingerbread House - Tamamlanmış Ses dosyasını referans olarak kullanabilirsiniz.
Ses nesneleri
Yönlü ses oluşturmak için, bu eğitim boyunca çalışacağınız ses nesnelerini anlamak önemlidir. 3D ses için altı ana ses nesnesi türü vardır:
- AudioPlayer nesnesi ses dosyasını yükler ve çalar.
- AudioEmitter nesnesi, 3D ortamda ses yayan bir sanaldır hoparlör.
- AudioListener nesnesi, 3D ortamdan ses alan bir sanaldır mikrofon.
- AudioDeviceOutput nesnesi, gerçek dünyada bir fiziksel donanım cihazı, örneğin bir hoparlör veya kulaklık.
- AudioDeviceInput nesnesi, gerçek dünyada bir fiziksel mikrofon.
- Wires ses akışlarını bir nesneden diğerine taşır.
Tüm bu ses nesneleri, gerçek dünyadaki karşılıkları gibi ses yaymak için birlikte çalışır. Bir oyuncunun bir oyun oynarken kulaklık takarak nasıl çalıştığını gösteren bir örneğe bakalım:
- AudioPlayer, yağmur parçası için 1516791621 ses varlık kimliğini oyuna yükler.
- AudioEmitter, 3D ortama yağmur parçası sesinin bir akışını yayar.
- Bir Wire, akışın AudioPlayer'dan AudioEmitter'a gelmesini sağlar, böylece akış 3D hoparlörden çıkar.
- Karakterin çocuk AudioListener nesnesi, 3D ortamda o sesi dinler ve kulaklığa geri besler.
- AudioDeviceOutput nesnesi, sesi AudioListener'dan oyuncunun fiziksel hoparlörüne veya bu durumda kulaklıklarına taşır.
- AudioDeviceInput nesnesi, gerçek dünyadan sesi yakalar ve sesli sohbet için oyuna geri besler.


Aşağıdaki bölümler, bu nesneleri daha derinlemesine inceleyecek ve hem döngüsel hem de tek seferlik 3D ses çalmayı öğrenirken bu nesneleri referans alacaktır. Bu nesneleri gelecek tekniklerle gözden geçirirken, oyundan oyuncuya ve tersine ses yakalama ve besleme konusunda daha doğru tahminlerde bulunabilirsiniz.
Döngüsel ses
Döngüsel 3D ses, oyuncular sunucuya bağlanır bağlanmaz kesintisiz olarak tekrar eden yönlü ses, 3D alanın atmosferini canlandırmak ve dinamik hissettirmek için yaygın bir ses tasarım tekniğidir. Ayrıca, döngüsel 3D ses, çevresel ses kaynaklarınızı tutarlı tutar; örneğin, bir televizyonun statik sesi veya bir şelalenin gürültüsü; bu sesler aniden durursa, çevre gerçekçi hissettirmeyecektir.
Bu kavramı göstermek için, iki büyük şelalenin döngüsel olmayan ses parçası tamamlandığında durduğunu gözden geçirin. Su sesleri başlangıçta oyuncuları dış mekan ortamına daldırırken, ani işitsel değişim, bir şelalenin gerçek dünyada nasıl davrandığına göre rahatsız edici ve doğaldan uzaktır.
Benzer şekilde, örnek, akışkan çikolata şelalesi için bu tekniği kullanır ve sesin yüksekliğini oyuncunun ses yayıcısına olan mesafesine göre ayarlar. Oyuncu 20 studdan daha az bir mesafedeyken, yayıcı sesi tam yüksek sesle yayar. Oyuncu daha da uzaklaştıkça, sesin yüksekliği ses yayıcısından her 20 studda bir azalır. Bu, gerçek dünyada sesin kaynağından uzaklaştıkça nasıl azaldığını taklit eder.
Gingerbread House - Tamamlanmış Ses örneğinde döngüsel 3D sesi yeniden oluşturmak için:
Oyuncu karakterinize bağlı varsayılan bir dinleyici etkinleştirin.
- Explorer penceresinde SoundService'i seçin.
- Properties penceresinde DefaultListenerLocation'ı Character olarak ayarlayın. Oyunu çalıştırdığınızda, motor otomatik olarak:
- Her oyuncu karakterinin Humanoid.RootPart altında bir AudioListener oluşturur, böylece ses kaynaklarının konumuna ve ölçeğine göre gerçek dünyadaki hoparlörlerinizde seslerin kaymasını duyabilirsiniz.
- SoundService altında bir AudioDeviceOutput oluşturur.
Explorer penceresinde Workspace ⟩ WaterfallAudioObject'a gidin, ardından:
- Şelale için bir ses kaynağı oluşturmak üzere bir AudioPlayer nesnesi ekleyin.
- WaterfallAudioObject'tan yönlü bir akış yaymak için bir AudioEmitter nesnesi ekleyin.
- Ses oyuncusundan ses yayıcıya akışı taşımak için bir Wire nesnesi ekleyin.

AudioPlayer'ı seçin, ardından Properties penceresinde,
- AssetID'yi rbxassetid://1516791621 olarak ayarlayın, böylece yağmur ses parçasını çalar.
- Sesin kesintisiz tekrar etmesi için Looping'i etkinleştirin.
AudioEmitter'ı seçin, ardından Properties penceresinde DistanceAttenuation'ı {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} olarak ayarlayın, böylece ses her 20 studda bir ses yayıcısından uzaklaştıkça kademeli olarak azalır.
Wire'ı seçin, ardından Properties penceresinde,
- Bu belirli ses oyuncusundan ses taşımak için SourceInstance'ı yeni AudioPlayer'ınıza ayarlayın.
- Bu belirli ses yayıcısına ses taşımak için TargetInstance'ı yeni AudioEmitter'ınıza ayarlayın.
Explorer penceresinde, WaterfallAudioObject'a bir Script ekleyin, adını LoopWaterfallMusic olarak değiştirin, RunContext özelliğini Client olarak ayarlayın, ardından aşağıdaki kodu script'e yapıştırın:
local audioPlayer = script.ParentaudioPlayer:Play()Kod açıklamasıScript, script'in ebeveynini temsil etmek için bir değişken tanımlayarak başlar AudioPlayer. Script daha sonra, oyuncu oyuna katıldığı andan itibaren ses kaynağını çalmaya ayarlar.
Oyunu test edin ve karakteriniz şelaleye yakınken döngüsel çikolata yağmur sesini duyun. Karakterinizin başını farklı bir yöne çevirdiğinizde, ses, 3D alandaki yayıcının konumuna göre gerçek dünyadaki hoparlörlerinizde dinamik olarak kayar.
Tek seferlik ses
Tek seferlik 3D ses, belirli bir zamanda ve konumda bir kez çalan yönlü ses, oyunculara eylemleri, çevreleri ve etraflarındaki karakterler hakkında bağlam sağlar. Oyunlarınızda bu tür işitsel geri bildirim kullanmak önemlidir çünkü oyuncuların gelen düşmanlardan kaçınmak veya yararlı nesneleri almak gibi stratejik kararlar vermelerine olanak tanır.
Aşağıdaki bölümler, oyuncuların zamanında yönlü geri bildirim alması gereken yaygın oyun senaryoları için uygulama detayları sağlar; bunlar arasında durum oyun olayları, nesne etkileşimi ve oynanabilir olmayan karakter diyalogları bulunmaktadır.
Olay geri bildirimi
Oyuncular, çevrelerinde yeni oyun alanlarını açmak veya düşman ateşini tetiklemek gibi ana durum olaylarını tetiklediklerinde, 3D alanda dikkatlerini ve odaklarını nereye yönlendirmeleri gerektiğini anlamaları önemlidir. Hızlı bir işitsel geri bildirim almazlarsa, oyun deneyimleri için önemli olan bilgileri kaçırabilirler ve nereye gideceklerini veya ne yapacaklarını bilmemekten dolayı hayal kırıklığı yaşayabilirler.
Bunun neden önemli olduğunu göstermek için, her oyuncunun blaster'ından çalan Laser Tag şablonundaki tek seferlik 3D sesi gözden geçirelim:
- Her oyuncunun blaster'ından ateşlediği her patlama için derin bir patlama sesi çalar.
- Oyuncu blaster'ını yeni bir mermiyle doldurduğunda tıklama ve robotik bip sesi çalar.
Bu seslerin her ikisi de, tüm yakın oyunculara patlamaların nereden geldiği hakkında bilgi vererek, eğlenceye katılma veya potansiyel tehlikeden kaçınma gibi bilinçli kararlar vermelerine yardımcı olur.
Örnek, oyunculara oyundaki ana hedefi tamamladıklarında ödülleri hakkında durum farkındalığı sağlamak için bu aynı tekniği kullanır. Üç şekerleme topladıklarında, zencefilli evin kapısı açılır ve oyuncuların içindeki hediyeye erişim sağlamasına izin verir.
Oyuncuların şekerlemeleri toplarken belirli bir sıraya ihtiyaçları olmadığından, hangi şekerlemeyi en son toplarlarsa toplasınlar, kapının açıldığını bilmeleri önemlidir. Konumsal ses, oyuncuların başarılarını ve nereye gitmeleri gerektiğini, mesafeleri ve kapıya olan yönleri ne olursa olsun bilmelerini sağlar.
Gingerbread House - Tamamlanmış Ses örneğinde tek seferlik olay geri bildirimi 3D sesini yeniden oluşturmak için:
Explorer penceresinde Workspace ⟩ Door'a gidin, ardından:
- Ses hacmi için bir ses kaynağı oluşturmak üzere bir AudioPlayer nesnesi ekleyin.
- Door'dan yönlü bir akış yaymak için bir AudioEmitter nesnesi ekleyin.
- Ses oyuncusundan ses yayıcıya akışı taşımak için bir Wire nesnesi ekleyin.

AudioPlayer'ı seçin, ardından Properties penceresinde AssetID'yi rbxassetid://5930776613 olarak ayarlayın, böylece kayar metal kapı ses parçasını çalar.
Wire'ı seçin, ardından Properties penceresinde,
- Bu belirli ses oyuncusundan ses taşımak için SourceInstance'ı yeni AudioPlayer'ınıza ayarlayın.
- Bu belirli ses yayıcısına ses taşımak için TargetInstance'ı yeni AudioEmitter'ınıza ayarlayın.
Explorer penceresinde, ServerScriptService'ye gidin, ardından bir Script ekleyin, adını GumdropService olarak değiştirin, RunContext özelliğini Server olarak ayarlayın, ardından aşağıdaki kodu script'e yapıştırın:
-- Değişkenleri başlatmalocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local TweenService = game:GetService("TweenService")-- Modüllerlocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Değişkenlerlocal gumdropsFolder = Workspace.Gumdropslocal gumdrops = gumdropsFolder:GetChildren()local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAMElocal GUMDROP_AMOUNT_TO_ADD = 1local function updatePlayerGumdrops(player, updateFunction)-- Şekerleme tablosunu güncellelocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Şekerleme lider tahtasını güncelleLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Oyuncunun üç şekerleme topladığını kontrol etif newGumdropAmount >= 3 then-- Oyuncu üç şekerleme topladığında kapı olay sesini çallocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- Kapıyı aşağı doğru hareket ettirmek için animasyonlocal doorPart = Workspace.Doorlocal tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})tween:Play()endend-- Olay işleyicisini tanımlamalocal function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Oyuncu bir şekerlemeye dokundulocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Enabled", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)print("Oyuncu şekerleme topladı")endendend-- Olay dinleyicilerini ayarlamafor _, gumdrop in gumdrops dogumdrop:SetAttribute("Enabled", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endKod açıklamasıScript, Workspace, Players, ServerStorage ve TweenService hizmetlerini başlatarak, çocuklarını ve işlevselliklerini referans alabilmesi için başlar. Ardından, Leaderboard ve PlayerData modüllerini ServerStorage'de gerektirir; bu modüller, oyuncunun çevrede topladığı şekerleme miktarını takip eden ekranın sağ üst köşesinde bir lider tahtası oluşturmak ve güncellemekten sorumludur.
Script'in updatePlayerGumdrops fonksiyonu, olay geri bildirimi için 3D ses tetikleme işleminin büyük kısmının gerçekleştiği yerdir ve iki argüman alır:
- player - Bir şekerleme toplayan oyuncu.
- updateFunction - Oyuncunun topladığı şekerleme miktarını güncelleyen bir geri çağırma fonksiyonu.
Bir oyuncu bir şekerlemeyle çarpıştığında, script:
- Oyuncunun yeni şekerleme toplama miktarını PlayerData.updateValue fonksiyonunu çağırarak alır.
- Bu yeni miktarı Leaderboard.setStat fonksiyonunu çağırarak lider tahtasına günceller.
- Miktarın 3 veya daha fazla olup olmadığını kontrol eder.
Bu değer 3 veya daha fazla olduğunda, script:
- Ses oyuncusundan ses yayıcısına 3D ses parçasını çalar.
- Kapıyı mevcut konumunun 15 stud aşağısına doğru hareket ettirir.
Script'in geri kalanı, şekerlemeye çarpan herhangi bir şeyin bir oyuncu olup olmadığını tespit etmekle ilgilidir, böylece toplama geri bildirimi için konumsal olmayan bir ses tetikleyebilir. Script'in bu kısmı hakkında daha fazla bilgi için 2D ses ekleme - Oynanış geri bildirimi sayfasına bakın.
Oyunu test edin ve çevredeki üç şekerlemeyi topladığınızda kayar kapı sesini duyun. Kamerayı döndürdüğünüzde, ses, 3D alandaki yayıcının konumuna göre gerçek dünyadaki hoparlörlerinizde dinamik olarak kayar.
Nesne etkileşimi
Oyuncular, çevrelerindeki 3D nesnelerle etkileşime girdiklerinde, örneğin bir ışık anahtarını açmak veya bir silah almak gibi, anında geri bildirim sağlamak önemlidir, böylece nesneyle nasıl etkileşime girdiklerini sezgisel olarak anlayabilirler. Hem görsel hem de işitsel geri bildirimin eşleştirilmesi, oyuncunun eylemleri ile çevresel tepki arasındaki neden-sonuç ilişkisini pekiştirir.
Bu kavramı genişletmek için, Plant örneğinden bir lahana yetiştirme kullanıcı akışında aşağıdaki tek seferlik 3D sesleri gözden geçirelim:
- Oyuncu bir tohum ektiğinde hafif bir tıklama sesi çalar.
- Oyuncu büyüyen bitkisini suladığında ıslak, sıçrama benzeri bir ses çalar.
- Oyuncu tam büyümüş bitkiyi topladığında bir kesme sesi çalar.
- Oyuncu lahanayı arabanın içine koyduğunda yumuşak bir düşme sesi çalar.
Bu seslerin tümü, oyuncunun 3D alandaki nesnenin şekil değiştirmesiyle ilgili yakınlık istemi ana etkileşimlerini pekiştirir. Görme engelli oyuncular için renk değişiklikleri veya animasyonların kendi başlarına daha zor anlaşılabilir olduğu durumlarda, bu çoklu duyusal geri bildirim biçimlerini sağlamak, 3D nesne etkileşimlerinizin mümkün olduğunca erişilebilir ve sezgisel kalmasına yardımcı olur.
Nesne etkileşimini birden fazla duyusal geri bildirim biçimiyle nasıl yapılandırabileceğinize dair farklı bir örnek vermek için, örnek, oyuncular 3D nane butonuna bastıklarında hem görsel hem de işitsel geri bildirim sağlar. Oyuncular butona etkileşimde bulunmadıklarında, bu tipik bir nane şekeri gibi görünür, ancak butona bastıklarında örnek:
- Bir kutlama jingle ses parçası çalar.
- Butonun kenarları yeşil bir tonla renklendirilir.
- Buton yere doğru hareket eder.
Buradan, bu etkileşimi bir nesneyi kilitlemek veya özel bir yeteneği tetiklemek gibi çeşitli benzersiz oyun eylemlerine bağlayabilirsiniz.


Gingerbread House - Tamamlanmış Ses örneğinde tek seferlik nesne etkileşimi 3D sesini yeniden oluşturmak için:
Explorer penceresinde Workspace ⟩ 3DAudioButton'a gidin, ardından:
- Buton için bir ses kaynağı oluşturmak üzere bir AudioPlayer nesnesi ekleyin.
- 3DAudioButton'dan yönlü bir akış yaymak için bir AudioEmitter nesnesi ekleyin.
- Ses oyuncusundan ses yayıcıya akışı taşımak için bir Wire nesnesi ekleyin.

AudioPlayer'ı seçin, ardından Properties penceresinde AssetID'yi rbxassetid://1846248593 olarak ayarlayın, böylece neşeli, kutlama ses parçasını çalar.
Wire'ı seçin, ardından Properties penceresinde,
- Bu belirli ses oyuncusundan ses taşımak için SourceInstance'ı yeni AudioPlayer'ınıza ayarlayın.
- Bu belirli ses yayıcısına ses taşımak için TargetInstance'ı yeni AudioEmitter'ınıza ayarlayın.
Explorer penceresinde, 3DAudioButton'a bir Script ekleyin, adını PlayAudioWhenPressed olarak değiştirin, ardından aşağıdaki kodu script'e yapıştırın:
local TweenService = game:GetService("TweenService")local buttonModel = script.Parent.Parentlocal buttonPart = buttonModel.ButtonPartlocal buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayerlocal tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)local buttonTweenByIsPressed = {-- Bastırılmış[true] = TweenService:Create(buttonPart, tweenInfo, {Size = buttonPart.Size / Vector3.new(2, 1, 1),Color = Color3.fromRGB(75, 151, 75),}),-- Varsayılan[false] = TweenService:Create(buttonPart, tweenInfo, {Size = buttonPart.Size,Color = Color3.fromRGB(196, 40, 28),}),}local function onIsPlayingChanged()local isPlaying = buttonPressedAudioPlayer.IsPlayinglocal tween = buttonTweenByIsPressed[isPlaying]tween:Play()endonIsPlayingChanged()buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)buttonPart.Touched:Connect(function(_hit)buttonPressedAudioPlayer:Play()end)Kod açıklamasıScript, aşağıdakileri alarak başlar:
- Butonun yerden çıkan parçasını animasyon yapabilmesi için TweenService.
- Script'in ebeveyni olan 3DAudioButton modelini.
- Yerden çıkan butonun parçasını.
- İlgili ses oyuncusunu, kutlama ses parçasıyla.
Script daha sonra şunları tanımlar:
- Butonun animasyonunun üstel bir animasyon stili ile oynatılacağını belirten bir TweenInfo nesnesi.
- Butonun bastırılmış veya bastırılmamış durumunu temsil eden iki tween.
- true bastırılmış durumu, butonu hafifçe yere doğru hareket ettirir ve parçanın kenarlarını yeşil bir tonla renklendirir.
- false bastırılmamış durumu, butonu orijinal konumuna geri döndürür ve önceki rengi kaldırır.
Script'in geri kalanı, nesne etkileşimi geri bildirimi için işlerin büyük kısmının gerçekleştiği yerdir, bu nedenle onIsPlayingChanged fonksiyonu ve olay dinleyicilerinin nasıl birlikte çalıştığını gözden geçirelim:
- buttonPart.Touched, bir oyuncunun butona dokunmasını dinler, ardından Play() fonksiyonunu çağırarak ilgili sesin ses oyuncusundan çalmaya başlamasını sağlar. Bu işlem, AudioPlayer.IsPlaying özelliğini false'dan true'ya değiştirir.
- buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"), ses oyuncusunun IsPlaying özelliğinin değişmesini dinler, ardından onIsPlayingChanged fonksiyonunu çağırır.
- onIsPlayingChanged fonksiyonu, bu bilgiyi kullanarak 3D alandaki görsel görünümünü değiştiren tween'i tetikler.
- Oyuncunun butona hızlı bir şekilde ardışık olarak zıplaması durumunda sesin yanlışlıkla yeniden başlamasını önlemek için, buttonPressedAudioPlayer.Ended, ses oyuncusunun çalmayı bitirmesini dinler ve ardından onIsPlayingChanged fonksiyonunu tekrar çağırır.
onIsPlayingChanged olayının yalnızca false'dan true'ya geçerken tetiklendiğini belirtmek önemlidir; bu, true'dan false'ya geçerken tetiklenmediği anlamına gelir. Bu, sunucudan istemciye özelliklerin çoğaltılmasıyla ilgili zamanlama sorunları nedeniyle istenen bir davranıştır. Bu nedenle, bu örnekte her iki durumu kapsamak için Ended olayı sağlanır ve dinlenir.
Oyunu test edin ve zencefilli evdeki 3D butona dokunduğunuzda kutlama sesini duyun. Butondan uzaklaştığınızda, sesin yüksekliği azalır.
Karakter diyalogu
Oynanabilir olmayan karakterlerinizden (NPC) yönlü ses sağlamak, oyuncuları çevrelerindeki ilgi noktalarına yönlendirmek ve diğer karakterlerle etkileşimlerine derinlik katmak için faydalıdır. Aslında, anlatı odaklı oyunlarda birçok tasarımcı, karakter diyaloglarını oyunculara karakterleri, müttefik ve düşman karakterleri veya dünyayı dolaylı olarak öğretmek için stratejik olarak kullanır.
Bu tekniğin yaygın örnekleri şunları içerir:
- Oyununuzun tonunu belirlemek için Diyalog tarzı.
- Oyunculara karakter ilişkilerini öğretmek için Sohbet.
- Düşmanların motivasyonlarını veya oyuncuya olan konumlarını itiraf etmek için Düşman konuşmaları.
- Oyuncu karakterlerin düşüncelerini yüksek sesle ifade etmesi, oyuncuyu ne yapmaları gerektiği konusunda nazikçe yönlendirmek için, örneğin kendilerini iyileştirmek, başka bir yere gitmek veya bir nesne bulmak gibi.
- Müttefik karakterlerin oyuncu karakterle konuşması, oyun içi dünya detaylarını, tarihini, kültürünü ve sosyal sorunlarını ortaya çıkarmak için.
Bunun pratikte nasıl görünebileceğini göstermek için, oyuncular uzay istasyonunun ana lobisinde bulunduklarında periyodik olarak çalan Beyond the Dark gösteriminden aşağıdaki tek seferlik 3D sesleri gözden geçirelim.
Uzay istasyonunu bir karakter olarak kullanarak, bu diyalog klibi oyunculara genel ortam hakkında önemli bağlam ve bilgi sağlar. Örneğin, bu tek cümleden oyuncular şunları öğrenir:
- Dış uzaydalar, özellikle Kerr-Newman Derin Uzay İletişim İstasyonu'ndalar.
- Ortamları geleceğe yönelik ve davetkardır.
- Bir ziyaretçi olarak, muhtemelen yakında ayrılacaklardır.
Bu detaylar, oyuncuları çevrelerine daldırır ve görevlerine bir aciliyet hissi katar. Ancak, oyuncular ana görevlerinin ne olduğunu bilmiyorlarsa, karakter diyaloglarını kullanarak oyunculara oyununuzda ne yapmalarını istediğinizi de bildirebilirsiniz.
Örneğin, örnek, oyuncuları üç şekerleme toplamaya yönlendirmek için kar adamından karakter diyalogunu tetiklemek üzere 3D alanda bir hacim veya görünmez bir bölge kullanır. Oyuncular oyuna katıldıklarında gördükleri ilk şeylerden biri olduğundan, oyuncuların diyalogu tetikleme ve başarılı olmak için ne yapmaları gerektiğini bilme olasılıkları daha yüksektir.

Gingerbread House - Tamamlanmış Ses örneğinde tek seferlik karakter diyalogu 3D sesini yeniden oluşturmak için:
Explorer penceresinde Workspace ⟩ DialogueVolume'a gidin, ardından:
- Hacim için bir ses kaynağı oluşturmak üzere bir AudioPlayer nesnesi ekleyin.
- DialogueVolume'dan yönlü bir akış yaymak için bir AudioEmitter nesnesi ekleyin.
- Ses oyuncusundan ses yayıcıya akışı taşımak için bir Wire nesnesi ekleyin.

AudioPlayer'ı seçin, ardından Properties penceresinde AssetID'yi rbxassetid://92917410841704 olarak ayarlayın, böylece oyunun amacı için bir talimat ses parçası çalar.
Wire'ı seçin, ardından Properties penceresinde,
- Bu belirli ses oyuncusundan ses taşımak için SourceInstance'ı yeni AudioPlayer'ınıza ayarlayın.
- Bu belirli ses yayıcısına ses taşımak için TargetInstance'ı yeni AudioEmitter'ınıza ayarlayın.
Explorer penceresinde, StarterPlayer ⟩ StarterCharacterScripts'e gidin, bir LocalScript ekleyin, adını PlayAudioWhenInVolume olarak değiştirin ve aşağıdaki kodu yerel script'e yapıştırın:
local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local humanoid = script.Parent:WaitForChild("Humanoid")local volumeDetector = Workspace.DialogueVolumelocal trigger = humanoid:WaitForChild("Animator")local debounce = falselocal localPlayer = Players.LocalPlayervolumeDetector.Touched:Connect(function(hit)if debounce thenreturnendlocal hitCharacter = hit:FindFirstAncestorWhichIsA("Model")local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)if hitPlayer ~= localPlayer thenreturnenddebounce = truelocal audioPlayer = Workspace.DialogueVolume.AudioPlayeraudioPlayer:Play()audioPlayer.Ended:Wait()debounce = falseend)Kod açıklamasıBu script, Workspace ve Players hizmetlerini alarak, çocuklarını ve işlevselliklerini referans alabilmesi için başlar. Her oyuncu karakteri oyuna yüklendiğinde veya yeniden doğduğunda, script şunları bekler:
- Workspace'deki DialogueVolume adlı hacim nesnesi.
Hacme çarpan herhangi bir şey çarptığında, Touched olay işleyici fonksiyonu, çarpışan BasePart nesnesinin bir karakter modelinin alt öğesi olup olmadığını kontrol eder. Eğer öyleyse, fonksiyon:
- Debounce'u true olarak ayarlar.
- Ses çalar ve bitene kadar bekler.
- Debounce'u tekrar false olarak ayarlar.
Debounce'un false'dan true'ya ve tekrar false'a geçmesi, oyuncuların hacimle sürekli çarpıştıklarında sesin tekrar tekrar tetiklenmesini önleyen bir debounce desenidir. Bu debounce deseni hakkında daha fazla bilgi için Debounce - Çarpışmaları tespit etme sayfasına bakın.
Oyunu test edin ve kar adamının etrafındaki hacme dokunduğunuzda talimat karakter diyalogunu duyun.