2D ses, belirli bir yerden yayımlanmayan yönlendirmeyen ses olup, dinleyicinin 3D ortamda bulunduğu konum veya yönelime bağlı olarak aynı kalır. Bu, oyuncular çevre içinde dinleyicilerini hareket ettirdikçe, döndükleri her yerden 2D sesi sürekli olarak duyabilecekleri anlamına gelir.
Zencefilli Ev - Başlangıç .rbxl dosyasını bir başlangıç noktası olarak ve Zencefilli Ev - Tam Ses dosyasını bir referans olarak kullanarak, bu öğretici hem döngüsel hem de tek atımlık 2D sesleri deneyimlerinize nasıl ekleyeceğinizi gösterir, ayrıca:
- Oyuncular sunucuya bağlandıklarında çalmaya başlayan döngüsel arka plan müziği.
- Oyunculara oyun hedeflerine göre anlık geri bildirim sağlamak için seslerin tetiklenmesi.
- Farklı kullanıcı arayüzü etkileşimlerini belirtmek için çeşitli seslerin aktif edilmesi.
Süreç içinde herhangi bir noktada sıkışıp kalırsanız, ilerlemenizi karşılaştırmak için mevcut olan Zencefilli Ev - Tam Ses dosyasını referans olarak kullanabilirsiniz.
2D ses nesneleri
Yönlendirmeyen ses oluşturmak için, bu öğreticide çalışacağınız ses nesnelerini anlamak önemlidir. 2D ses için üç ana ses nesnesi türü bulunmaktadır:
- AudioPlayer nesnesi ses dosyasını yükler ve çalar.
- AudioDeviceOutput nesnesi, gerçek dünyada bir donanım aygıtıdır, örneğin bir hoparlör veya kulaklık.
- Wires, ses akışlarını bir nesneden diğerine taşır.
Tüm bu ses nesneleri, sesin dosya çalımından her oyuncunun donanımına taşınmasında birlikte çalışır. Şimdi, bir oyuncunun kulaklık taktığı ve dizüstü bilgisayarıyla bir deneyim oynadığı bir örnek kullanarak bunun nasıl çalıştığını inceleyelim:
- AudioPlayer, 127645268874265 ses varlık kimliğini deneyime bir para satın alma sesi için yükler.
- Bir Wire, akışı AudioPlayer'dan AudioDeviceOutput'a taşıyarak akışın oyuncunun kulaklığından çıkmasını sağlar.
- AudioDeviceOutput nesnesi sesi oyuncunun fiziksel hoparlörüne, veya bu durumda kulaklıklarına taşır.
Aşağıdaki bölümler, bu nesneleri daha derinlemesine inceleyecek ve döngüsel ve tek atımlık 2D sesleri çalmak öğrenirken bu nesnelere referans verecektir. Bu nesneleri, önümüzdeki tekniklerle gözden geçirirken, deneyimden oyuncuya ses taşımak için daha doğru bir şekilde nasıl ses yakalayacağınızı ve ileteceğinizi öngörebilirsiniz.
Döngüsel ses
Döngüsel 2D ses, ya da oyuncular sunucuya bağlandığında anında tekrar eden yönlendirmeyen ses, oyuncular ne yapıyor olurlarsa olsunlar veya 3D ortamda nereye yerleşmiş olurlarsa olsunlar tutarlı bir işitsel arka plan sağlamanın yaygın bir ses tasarımı tekniğidir. Ayrıca, döngüsel 2D ses, deneyiminizin asla tamamen sessiz kalmamasını sağladığından, bu oyuncuları hedeflerinden saptırabilecek bir durumdur.
Bu konsepti göstermek için, aşağıdaki 2D sesin Tehlikeli Uzay İstasyonu örneğinin kalitesini nasıl önemli ölçüde artırdığını gözden geçirelim. Arka plan müziği olmadan, uzay istasyonu boş ve cansız hissediyor. Ancak, uzay istasyonu arka plan müziği içerdiğinde, uzay istasyonu hem tehditkar hem de tehlikeli hissediyor, genel ürkütücü atmosfere katkıda bulunuyor.
Döngüsel ses, oyuncuların deneyiminize katıldıkları anda nasıl hissetmelerini istediğinizi belirlemek için özellikle faydalıdır. Örneğin, örnek oyunculara kış harikalar diyarında neşeli bir macera sunmayı amaçladığı için, ortama girdikleri anda moral durumlarını olumlu yönde etkilemek için neşeli bir ses parçası kullanmaktadır. Bu tekniğin etkili olduğunu görmek için, döngüsel sesi bir metal parça ile değiştirmenin oyuncunun deneyimini nasıl değiştireceğini düşünün.
Örnek Zencefilli Ev - Tam Ses dosyasındaki döngüsel 2D sesi yeniden oluşturmak için:
Oyuncu karakterinize bağlı varsayılan bir dinleyiciyi etkinleştirin.
- Explorer penceresinde, SoundService'yi seçin.
- Properties penceresinde, DefaultListenerLocation 'u Character olarak ayarlayın. Deneyimi çalıştırdığınızda, motor otomatik olarak SoundService altında bir AudioDeviceOutput oluşturur.
Explorer penceresinde, SoundService'ye gidin ve:
- Bir ses kaynağı oluşturmak için bir AudioPlayer nesnesi ekleyin.
- Deneyim boyunca çalan bir hoparlör oluşturmak için bir AudioDeviceOutput nesnesi ekleyin.
- Ses oyuncusundan hoparlöre akışı taşımak için bir Wire nesnesi ekleyin.

AudioPlayer'ı seçin, ardından Properties penceresinde,
- AssetID'yi rbxassetid://1841461968 olarak ayarlayarak neşeli bir ses parçası çalması için ayarlayın.
- Sesin kesintisiz tekrar etmesi için Looping özelliğini etkinleştirin.
- Sesin deneyim içindeki diğer ses kaynaklarını duyduğunuzdan emin olmak için Volume'u 0.2 olarak ayarlayın.
Wire'ı seçin, ardından Properties penceresinde,
- SourceInstance'ı yeni AudioPlayer'ınıza ayarlayarak, bu belirli ses oyuncusundan ses taşımak istediğinizi belirtin.
- TargetInstance'ı yeni AudioDeviceOutput'ınıza ayarlayarak, bu belirli hoparlöre ses taşımak istediğinizi belirtin.
Explorer penceresinde, AudioPlayer'a bir Script ekleyin, adını LoopBackgroundMusic olarak değiştirin, RunContext özelliğini Client olarak ayarlayın ve 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. Bu script daha sonra oyuncu deneyime katıldığı andan oyuncu deneyimden ayrıldığı ana kadar ses kaynağını çalmaya ayarlar.
Deneyimi test edin ve döngüsel arka plan müziğini duyun.
Tek atım sesi
Tek atım 2D sesi, ya da belirli bir zaman ve konumda bir kez çalan yönlendirmeyen ses, oyunculara kaçırmak istemediğiniz her şey hakkında önemli bir bağlam sağlar. Deneyimlerinizde bu tür bir işitsel geri bildirimi kullanmak önemlidir çünkü bu, kritik oyun fonksiyonları ve oyuncu eylemleri için anlık, net bir yanıt sağlar, örneğin bir patron savaşına başlama ya da önemli miktarda sağlık kaybetme gibi.
Aşağıdaki bölümler, oyuncuların zamanında, yönlendirmeyen geri bildirim alması gereken yaygın oyun senaryoları için uygulama detayları sağlamaktadır; bu senaryolar arasında oyun geri bildirimi, UI öğeleri etkileşimleri ve öğreticiler için sesli anlatım bulunmaktadır.
Oyun geri bildirimi
Oyuncular deneyiminizde ilerlediği sürece, oyunlarını etkileyen her şey hakkında (örneğin, puanları, sağlık durumları veya seviye ilerlemeleri gibi) hemen işitsel geri bildirim almaları önemlidir. Bu tür bir ses, oyuncu hedefleriyle doğrudan bağlantılı olduğundan, bu seslerin net, duyulabilir ve kullanışlı ve doğru bilgi iletmesi önemlidir.
Bu konsepti göstermek için, aşağıdaki tek atım 2D ses örneğini Platformer şablonundan gözden geçirelim; bu ses oyuncular zıpladığında ve madeni paraları topladıklarında çalmaktadır:
- Oyuncu, cihazındaki zıplama tuşuna bastığında havadar bir woosh sesi çalar.
- Oyuncunun karakteri bir madeni paraya dokunduğunda, yüksek frekansta bir ding ve madeni paraların çarpışma sesi çalar.
Her iki ses de 3D alanın bağlamında anında tanınır ve oyuncuların görsel ipuçlarına tamamen bel bağlamadan eylemlerinin başarısını anlamalarına yardımcı olur.
Birden fazla ses çaldığınızda, bazı sesler oyuncuların duyması için diğerlerinden daha önemli olabilir. Bu durumda, madeni para toplama sesi, zıplama sesinden daha değerli oyun bilgilerini ilettiğinden, deneyim bunu biraz daha yüksek bir ses seviyesinde çalar. Ancak mükemmel bir karışım elde etmek için standartlar veya kurallar yoktur, bu nedenle deneyiminizdeki sesleri en önemli olduğunu düşündüğünüz şekilde ayarlayın.
Örneğin, örnek, deneyim boyunca çeşitli ses tetikleyicileri içerir, ancak bunların hepsi deneyimin ana hedefinin anlaşılmasında aynı düzeyde önem taşımaz: şekerlemeleri toplayarak zencefilli evi açmak. Oyuncuların ne yapmaları gerektiğini bilmelerini sağlamak için, örnek, oyuncu bir şekerlemi topladığında işitsel geri bildirimi üç katına çıkarır.
Örnek Zencefilli Ev - Tam Ses dosyasında tek atım durum geri bildirimi sesini yeniden oluşturmak için:
Explorer penceresinde, Workspace ⟩ Gumdrops ⟩ Gumdrop'a gidin, ardından:
- Bir ses kaynağı oluşturmak için bir AudioPlayer nesnesi ekleyin.
- Deneyim boyunca çalan bir hoparlör oluşturmak için bir AudioDeviceOutput nesnesi ekleyin.
- Ses oyuncusundan hoparlöre akışı taşımak için bir Wire nesnesi ekleyin.

AudioPlayer'ı seçin, ardından Properties penceresinde,
- Nazik bir çiğneme ses parçası çalmak için AssetID'yi rbxassetid://9113723699 olarak ayarlayın.
- Ses parçasını çiğneme sesine daha yakın bir yerde başlatmak için TimePosition'ı 0.15 olarak ayarlayın.
- Diğer ses kaynaklarının üstünde şekerleme sesini duyabilmeniz için sesi yüksek bir ses seviyesinde çalması için Volume'u 3 olarak ayarlayın.
Wire'ı seçin, ardından Properties penceresinde,
- SourceInstance'ı yeni AudioPlayer'ınıza ayarlayarak, bu belirli ses oyuncusundan ses taşımak istediğinizi belirtin.
- TargetInstance'ı yeni AudioDeviceOutput'ınıza ayarlayarak, bu belirli hoparlöre ses taşımak istediğinizi belirtin.
Gumdrop'ı çoğaltın ve üç şekerleme elde edene kadar mutlaka çoğaltıp etrafa serpiştirin.
Explorer penceresinde, ServerScriptService'ye gidin, ardından bir Script ekleyin, adını GumdropService olarak değiştirin, RunContext özelliğini Server olarak ayarlayın ve ardından aşağıdaki kodu script'e yapıştırın:
-- Hizmetleri 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 liderliğini güncelleLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Oyuncunun üç şekerleme topladığını kontrol etif newGumdropAmount >= 3 then-- Oyuncu üç şekerleme topladığında kapı etkinliği sesini çalmalocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- Kapının aşağı doğru hareket etmesini animasyonlayınlocal 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-- Etkinlik işleyicisini tanımlamalocal function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Active") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Oyuncu bir şekerlemeye dokunmuşlocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Active", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)endendend-- Etkinlik dinleyicilerini ayarlamafor _, gumdrop in gumdrops dogumdrop:SetAttribute("Active", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endKod açıklamasıBu script, Workspace, Players, ServerStorage ve TweenService hizmetlerini başlatarak, çocuklarını ve işlevselliğini referans alabilir. Ardından, ServerStorage'da bulunan Leaderboard ve PlayerData modüllerini çağırır; bu modüller, oyuncunun deneyim içinde topladığı şekerleme miktarını üst sağ köşede izleyen bir liderlik tablosu oluşturmaktan ve güncellemekten sorumludur.
Script'in updatePlayerGumdrops fonksiyonu, oyuncu bir şekerleme topladıkça liderliği güncellemeye ve üç şekerleme toplandığında bir yönlendirme sesi ve animasyon tetiklemeye büyük ölçüde sorumludur. Script'in bu kısmı hakkında daha fazla bilgi için, 3D ses ekleme - Etkinlik geri bildirimi sayfasına bakınız.
Script'in onGumdropTouched fonksiyonu, oyun geri bildirimi için 2D ses tetikleme işlemlerinin çoğunun gerçekleştiği yerdir ve iki argüman alır:
- otherPart - Şekerlemeye çarpan bir parça.
- gumdrop - Bir şekerlemeyi temsil eden bir küresel parça.
Şekerleme parçasına çarpan herhangi bir şey, önce şekerlemenin aktif olup olmadığını kontrol eder. Eğer öyleyse, çarpan nesnenin bir oyuncu olup olmadığını doğrular. Eğer öyleyse, script:
- Ses oyuncusundan 2D ses parçasını çalar.
- Şekerlemeyi görünmez hale getirir.
- Oyuncuların görünmez şekerlemeyle etkileşimde bulunamayacak şekilde şekerlemeyi devre dışı bırakır.
- Şekerlemeye dokunan oyuncunun liderliğini günceller.
Son olarak, script, her şekerleme için, bir oyuncu şekerlemeye dokunduğunda Touched olayına bir işlev bağlantısı kurar.
Deneyimi test edin ve bir şekerleme topladığınızda çiğneme sesini duyun.
UI etkileşimi
Oyuncular kullanıcı arayüzü (UI) ögeleriyle etkileşimde bulunduğunda, örneğin bir onay kutusunun üzerine gelmek veya bir satın alma düğmesine tıklamak gibi, etkileşimlerinin nasıl olduğunu anlamaları için anlık geri bildirim sağlamak önemlidir. Örneğin, birçok tasarımcı, oyuncular ayarları etkinleştirdiğinde veya devre dışı bıraktığında, ayarın durumunu iletmek için UI'nın görsel özelliklerini değiştirir.
Ancak, renk değişimleri veya animasyonları kendi başına anlamak daha zor olan görme engelli oyuncular için, UI etkileşimlerinizin çok sayıda duyusal geri bildirim biçimi sağlaması faydalıdır, böylece olabildiğince çok oyuncuya erişilebilir ve sezgisel kalabilir. Bu konsepti genişletmek için, UGC Homestore şablonundaki satın alma düğmelerinin önemli olan UI durumlarını göz önünde bulunduralım:
- Odaklanmış - Oyuncunun, seçmek üzere olduğu bir UI ögesini vurguladığını gösterir.
- Üzerinde - Oyuncunun imleciyle bir UI ögesinin üzerine geldiğini gösterir.
- Seçili - Oyuncunun etkileşimiyle bir UI ögesini seçtiğini gösterir.
Bu üç etkileşim, şablondaki oyuncuların avatar kıyafetleri ve aksesuarlarını gözden geçirdiği, seçtiği ve satın aldığı ana kullanıcı akışı için hayati önem taşır, bu nedenle hiç kimsenin UI ile nasıl etkileşim kurması gerektiği konusunda kafa karışıklığı yaşamaması önemlidir. Oyuncuların başarıya ulaşmaları için, şablon, her UI etkileşimi için hem görsel hem de işitsel geri bildirim sağlar.




Birden fazla duyusal geri bildirim biçimi yapılandırmanın nasıl yapılabileceğine bir örnek vermek gerekirse, örnek, oyuncular ekran üzerindeki nane düğmesine tıkladığında her zaman hem görsel hem de işitsel geri bildirim sağlar. Oyuncular düğmeyle etkileşime girmediklerinde, normal bir nane şekeri gibi görünür; ancak, düğmeye bastıklarında, örnek:
- Keyifli bir jingle ses parçası çalar.
- Düğmeyi bir mavi tonuyla renklendirir.
- Düğmeyi ekran üzerinde hafifçe aşağı kaydırır.
Bu etkileşimi, bir menüyü açmak veya bir öğe satın almak gibi yararlı oyun işlemleriyle bağlayabilirsiniz.


Tek atım UI etkileşimi sesini Zencefilli Ev - Tam Ses dosyasında yeniden oluşturmak için:
Explorer penceresinde, StarterGui ⟩ 2DAudioButton'a gidin, ardından:
- Bir ses kaynağı oluşturmak için bir AudioPlayer nesnesi ekleyin.
- Deneyim boyunca çalan bir hoparlör oluşturmak için bir AudioDeviceOutput nesnesi ekleyin.
- Ses akışını ses oyuncusundan hoparlöre taşımak için bir Wire nesnesi ekleyin.

AudioPlayer'ı seçin, ardından Properties penceresinde AssetID'yi rbxassetid://3422389728 olarak ayarlayarak retro bir jingle ses parçası çalmasını sağlayın.
Wire'ı seçin, ardından Properties penceresinde,
- SourceInstance'ı yeni AudioPlayer'ınıza ayarlayarak, bu belirli ses oyuncusundan ses taşımak istediğinizi belirtin.
- TargetInstance'ı yeni AudioDeviceOutput'ınıza ayarlayarak, bu belirli hoparlöre ses taşımak istediğinizi belirtin.
Explorer penceresinde, 2DAudioButton'a bir LocalScript ekleyin, adını PlayAudioWhenPressed olarak değiştirin ve ardından aşağıdaki kodu script'e yapıştırın:
local TweenService = game:GetService("TweenService")local buttonGui = script.Parentlocal buttonImageButton = buttonGui.ButtonFrame.ButtonImageButtonlocal buttonAudioPlayer = buttonGui.AudioPlayerlocal tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)local buttonTweenByIsPressed = {-- Basıldı[true] = TweenService:Create(buttonImageButton, tweenInfo, {Position = buttonImageButton.Position + UDim2.fromScale(0, .1),ImageColor3 = Color3.fromRGB(117, 255, 255),}),-- Varsayılan[false] = TweenService:Create(buttonImageButton, tweenInfo, {Position = buttonImageButton.Position,ImageColor3 = Color3.fromRGB(255, 255, 255),}),}local function onIsPlayingChanged()local isPlaying = buttonAudioPlayer.IsPlayinglocal tween = buttonTweenByIsPressed[isPlaying]tween:Play()endonIsPlayingChanged()buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)buttonAudioPlayer.Ended:Connect(onIsPlayingChanged)buttonImageButton.Activated:Connect(function(_hit)buttonAudioPlayer:Play()end)Kod açıklamasıScript, şunları alarak başlar:
- UI öğelerini animasyonlandırmak için TweenService.
- Script'in ebeveyni olan 2DAudioButton ScreenGui nesnesi.
- Nane şekeri ImageButton.
- İlgili ses kaynağı ile jingle ses parçası.
Script daha sonra şunları tanımlar:
- Düğmenin animasyonunun üssel bir animasyon tarzıyla çalınacağını belirten bir TweenInfo nesnesi.
- Düğmenin basılı veya basılmamış durumunu temsil eden iki tween.
- true basılı durum, düğmeyi ekran üzerinde hafifçe aşağı hareket ettirir ve yeşil bir ton ile renklendirir.
- false basılmamış durum, düğmeyi ekranın orijinal konumuna geri döndürür ve önceki gölgeyi kaldırır.
Script'in geri kalan kısmı, 2D UI etkileşim geri bildirimini tetikleme noktasında daha fazla işlevsellik sağladığı için, onIsPlayingChanged fonksiyonunu ve olay dinleyicilerini nasıl bir araya getirdiğimizi inceleyelim:
- buttonImageButton.Activated, bir oyuncunun düğmeye tıklamasını dinler ve ardından birlikteliği sağlamak için Play() işlevini çağırarak ses kaynağından ilgili sesi başlatır. Bu işlem, AudioPlayer.IsPlaying özelliğini false'dan true'ya değiştirir.
- buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying"), ses oyuncusunun IsPlaying özelliği değiştiğinde dinler ve ardından onIsPlayingChanged fonksiyonunu çağırır.
- onIsPlayingChanged fonksiyonu, bu bilgiyi kullanarak düğmenin görsel görünümünü ekran üzerinde değiştiren tweeni tetikler.
- Oyuncunun, düğmeye hızlı bir şekilde tıklanması durumunda, sesi tekrar başlatmasını engellemek için buttonAudioPlayer.Ended, ses oyuncusunun çalmayı bitirmesini dinler ve ardından tekrar onIsPlayingChanged fonksiyonunu çağırır.
onIsPlayingChanged etkinliği yalnızca false'dan true'ya geçerken tetiklendiğinden, true'dan false'ya geçerken tetiklenmez. Bu, sunucudan istemciye özelliklerin çoğaltılmasıyla ilgili sıkıntılar nedeniyle istenen bir davranıştır. Bu nedenle, Ended olayı örnekte her iki durumu da kapsamak için sağlanmış ve dinlenmiştir.
Deneyimi test edin ve ekrandaki düğmeye her bastığınızda jingli duyun.