2D ses, belirli bir konumdan yayılmayan, dinleyicinin 3D alandaki konumuna veya yönüne bağlı olarak değişmeyen yönlendirilmemiş seslerdir. Bu, oyuncular çevredeki dinleyicilerini hareket ettirdikçe, 2D sesi döndükleri her yerden tutarlı bir şekilde duyabilecekleri anlamına gelir.
Gingerbread House - Start .rbxl dosyasını başlangıç noktası olarak ve Gingerbread House - Complete Audio dosyasını referans olarak kullanarak, bu eğitimde oyunlarınıza hem döngüsel hem de tek seferlik 2D ses eklemeyi öğreneceksiniz. Bu süreçte aşağıdaki konularda rehberlik sağlanacaktır:
- Oyuncular sunucuya bağlandıklarında çalmaya başlayan döngüsel arka plan müziği.
- Oyuncuların oyun hedeflerine göre anlık geri bildirim sağlamak için ses tetikleme.
- Farklı kullanıcı arayüzü etkileşimlerini belirtmek için çeşitli seslerin etkinleştirilmesi.
Herhangi bir noktada süreçte takılırsanız, ilerlemenizi karşılaştırmak için Gingerbread House - Complete Audio dosyasını referans olarak kullanabilirsiniz.
2D ses nesneleri
Yönlendirilmemiş ses oluşturmak için, bu eğitim boyunca çalışacağınız ses nesnelerini anlamak önemlidir. 2D ses için üç ana ses nesnesi türü vardır:
- AudioPlayer nesnesi ses dosyasını yükler ve çalar.
- AudioDeviceOutput nesnesi, gerçek dünyada bir fiziksel donanım cihazı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ı için birlikte çalışır. Bu sürecin nasıl işlediğine bir örnekle bakalım: bir oyuncunun oyun oynarken bir kulaklık taktığını düşünelim:
- AudioPlayer, bir para satın alma sesi için 127645268874265 ses varlık kimliğini oyuna yükler.
- Bir Wire, akışı AudioPlayer'dan AudioDeviceOutput'a taşır, böylece akış oyuncunun kulaklığından gelir.
- 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 hem döngüsel hem de tek seferlik 2D ses çalmayı öğrenirken bu nesnelere referans verecektir. Bu nesneleri gelecek tekniklerle gözden geçirirken, oyundan oyuncuya ses yakalama ve besleme sürecini daha doğru bir şekilde tahmin edebilirsiniz.
Döngüsel ses
Döngüsel 2D ses, oyuncular sunucuya bağlandıklarında kesintisiz olarak tekrar eden yönlendirilmemiş seslerdir ve oyuncuların ne yaptıklarına veya 3D alandaki konumlarına bakılmaksızın tutarlı bir işitsel arka plan sağlamak için yaygın bir ses tasarım tekniğidir. Ayrıca, döngüsel 2D ses, oyununuzun asla tamamen sessiz olmamasını sağlar; bu, oyuncuları hedeflerinden uzaklaştırabilir ve kafa karışıklığına neden olabilir.
Bu kavramı göstermek için, aşağıdaki 2D sesin Hazardous Space Station örneğinin kalitesini nasıl önemli ölçüde artırdığını gözden geçirin. 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 korkutucu hem de tehlikeli hissediyor ve genel ürkütücü atmosferi artırıyor.
Döngüsel ses, oyuncuların oyununuzda katıldıkları anda nasıl hissetmelerini istediğinizi belirlemek için özellikle yararlıdır. Örneğin, örnek, oyunculara kış harikalar diyarında neşeli bir macera sunmayı hedefliyor, bu nedenle ortamlarına girdikleri anda ruh hallerini olumlu yönde etkilemek için neşeli bir ses parçası kullanıyor. Bu tekniğin ne kadar etkili olabileceğini görmek için, döngüsel sesi bir metal parça ile değiştirdiğinizde oyuncunun deneyiminin nasıl değişeceğini düşünün.
Örnek Gingerbread House - Complete Audio dosyasında döngüsel 2D 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 SoundService altında bir AudioDeviceOutput oluşturur.
Explorer penceresinde SoundService'e gidin, ardından:
- Bir ses kaynağı oluşturmak için bir AudioPlayer nesnesi ekleyin.
- Oyun boyunca çalan bir hoparlör oluşturmak için bir AudioDeviceOutput nesnesi ekleyin.
- Ses akışını ses oynatıcıdan hoparlöre taşımak için bir Wire nesnesi ekleyin.

AudioPlayer'ı seçin, ardından Properties penceresinde,
- Neşeli bir ses parçası çalmak için AssetID'yi rbxassetid://1841461968 olarak ayarlayın.
- Sesin kesintisiz tekrar etmesi için Looping'i etkinleştirin.
- Diğer ses kaynaklarını oyunda duyabilmeniz için Volume'u 0.2 olarak ayarlayın.
Wire'ı seçin, ardından Properties penceresinde,
- Bu belirli ses oynatıcıdan ses taşımak istediğinizi belirtmek için SourceInstance'ı yeni AudioPlayer'ınıza ayarlayın.
- Bu belirli hoparlöre ses taşımak istediğinizi belirtmek için TargetInstance'ı yeni AudioDeviceOutput'ınıza ayarlayın.
Explorer penceresinde, AudioPlayer'a bir Script ekleyin, adını LoopBackgroundMusic 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ın çalmasını sağlar.
Oyunu test edin ve döngüsel arka plan müziğini duyun.
Tek seferlik ses
Tek seferlik 2D ses, belirli bir zaman ve konumda bir kez çalan yönlendirilmemiş seslerdir; oyuncu tekrar tetiklemediği sürece tekrar çalmaz. Bu, oyunculara kaçırmamalarını istediğiniz her şey hakkında önemli bir bağlam sağlar. Oyunlarınızda bu tür işitsel geri bildirim kullanmak önemlidir çünkü bu, kritik oyun işlevlerine ve oyuncu eylemlerine anlık, net bir yanıt sağlar; örneğin, bir patron dövüşüne başlamak veya önemli bir miktar sağlık kaybetmek gibi.
Aşağıdaki bölümler, oyuncuların zamanında yönlendirilmemiş geri bildirim alması gereken yaygın oyun senaryoları için uygulama detayları sağlar; bunlar arasında oyun geri bildirimi, UI öğesi etkileşimleri ve eğitimler için sesli anlatım yer alır.
Oyun geri bildirimi
Oyuncular oyununuzda ilerledikçe, oyunlarını etkileyen her şey hakkında, örneğin puanları, sağlıkları veya seviye ilerlemeleri hakkında anında işitsel geri bildirim almaları önemlidir. Bu tür sesler doğrudan oyuncu hedefleriyle bağlantılı olduğundan, bu seslerin net, duyulabilir ve faydalı ve doğru bilgi iletmesi önemlidir.
Bu kavramı göstermek için, oyuncular zıpladıklarında ve paraları topladıklarında çalan Platformer şablonundan aşağıdaki tek seferlik 2D sesi gözden geçirelim:
- Oyuncu cihazındaki zıplama tuşuna bastığında havada bir ıslık sesi çalar.
- Oyuncunun karakteri bir paraya dokunduğunda yüksek tonlu bir ding sesi ve paraların çarpışma sesi çalar.
Bu seslerin her ikisi de 3D alan bağlamında hemen tanınabilir ve oyuncuların eylemlerinin başarısını anlamalarına yardımcı olur; yalnızca görsel ipuçlarına güvenmeden.
Birden fazla sesi aynı anda çaldığınızda, bazı seslerin oyuncuların duyması için diğerlerinden daha önemli olabileceğini unutmayın. Bu durumda, para toplama sesi, zıplama sesinden daha değerli oyun bilgisi sağladığı için, oyun bunu biraz daha yüksek bir sesle çalar. Ancak, harika bir karışım elde etmek için standartlar veya kurallar yoktur, bu nedenle oyundaki sesleri, en önemli olduğunu düşündüğünüz şekilde ayarlayın.
Örneğin, örnek, oyunda çeşitli ses tetikleyicileri içerir, ancak bunların hepsi oyunun ana hedefini anlamak için aynı önem seviyesinde değildir: şekerlemeleri toplayarak zencefilli evin kapısını açmak. Oyuncuların ne yapmaları gerektiğini bilmelerini sağlamak için, örnek, oyuncu bir şekerleme topladığında işitsel geri bildirimi üç katına çıkarır.
Örnek Gingerbread House - Complete Audio dosyasında tek seferlik durum geri bildirim 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.
- Oyun boyunca çalan bir hoparlör oluşturmak için bir AudioDeviceOutput nesnesi ekleyin.
- Ses akışını ses oynatıcıdan hoparlöre 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ı gerçek çiğneme sesine daha yakın bir noktada başlatmak için TimePosition'ı 0.15 olarak ayarlayın.
- Oyundaki diğer ses kaynaklarının üstünde çiğneme sesini duyabilmeniz için Volume'u 3 olarak ayarlayın.
Wire'ı seçin, ardından Properties penceresinde,
- Bu belirli ses oynatıcıdan ses taşımak istediğinizi belirtmek için SourceInstance'ı yeni AudioPlayer'ınıza ayarlayın.
- Bu belirli hoparlöre ses taşımak istediğinizi belirtmek için TargetInstance'ı yeni AudioDeviceOutput'ınıza ayarlayın.
Gumdrop'ı çoğaltın, böylece üç şekerleme elde edin, ardından bunları çevreye dağıtın.
Explorer penceresinde ServerScriptService'e 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:
-- Servisleri 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ı etkinlik 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("Active") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Oyuncu bir şekerlemeye dokundulocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Active", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)endendend-- Olay dinleyicilerini ayarlamafor _, gumdrop in gumdrops dogumdrop:SetAttribute("Active", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endKod açıklamasıScript, Workspace, Players, ServerStorage ve TweenService hizmetlerini başlatarak, bunların çocuklarına ve işlevselliğine erişim sağlar. Ardından, Leaderboard ve PlayerData modüllerini ServerStorage'da gerektirir; bu modüller, ekranın sağ üst köşesinde oyuncunun çevrede topladığı şekerleme miktarını takip eden bir lider tahtası oluşturmak ve güncellemekten sorumludur.
Script'in updatePlayerGumdrops fonksiyonu, her oyuncu bir şekerleme topladığında lider tahtasını güncellemekten ve oyuncunun üç şekerleme topladığı anı beklemekten büyük ölçüde sorumludur; böylece zencefilli evin kapısına konumsal bir ses ve animasyon tetikleyebilir. Bu script'in bu kısmı hakkında daha fazla bilgi için 3D ses ekleme - Olay geri bildirimi sayfasına bakın.
Script'in onGumdropTouched fonksiyonu, oyun geri bildirimi için 2D ses tetikleme işleminin çoğunun gerçekleştiği yerdir ve iki argüman alır:
- otherPart - Şekerlemeye çarpan bir parça.
- gumdrop - Bir şekerlemeyi temsil eden yuvarlak bir parça.
Şekerleme parçasıyla herhangi bir şey çarpıştığında, script önce şekerlemenin aktif olup olmadığını kontrol eder. Eğer öyleyse, çarpışan nesnenin bir oyuncu olup olmadığını doğrular. Eğer öyleyse, script ardından:
- Ses oynatıcıdan 2D ses parçasını çalar.
- Şekerlemeyi görünmez hale getirir.
- Oyuncuların görünmez şekerlemeyle etkileşimde bulunmalarını engellemek için şekerlemeyi devre dışı bırakır.
- Şekerlemeye dokunan oyuncunun lider tahtasını günceller.
Son olarak, script, her şekerleme için Touched olayına bir fonksiyon bağlayarak, oyuncu şekerlemeye dokunduğunda onGumdropTouched fonksiyonunu çağırır.
Oyunu test edin ve bir şekerleme topladığınızda çiğneme sesini duyun.
UI etkileşimi
Oyuncular kullanıcı arayüzü (UI) öğeleriyle etkileşime geçtiğinde, örneğin bir onay kutusunun üzerine gelmek veya bir satın alma düğmesini seçmek gibi, anında geri bildirim sağlamak önemlidir, böylece UI ile nasıl etkileşimde bulunduklarını sezgisel olarak anlayabilirler. Örneğin, birçok tasarımcı, oyuncular ayarları etkinleştirdiğinde veya devre dışı bıraktığında UI'nin görsel özelliklerini değiştirerek ayarın durumunu iletmektedir.
Ancak, renk değişikliklerinin veya animasyonların kendi başlarına daha zor anlaşılabileceği görme engelli oyuncular için, UI etkileşimlerinizde birden fazla duyusal geri bildirim biçimi sağlamak, mümkün olduğunca çok oyuncu için erişilebilir ve sezgisel kalmasını sağlamak açısından faydalıdır. Bu kavramı genişletmek için, UGC Homestore şablonunun satın alma düğmeleri için önemli olan aşağıdaki UI durumlarını göz önünde bulunduralım:
- Odaklanmış - Oyuncunun bir UI öğesini seçmek üzere vurguladığını gösterir.
- Üzerinde - Oyuncunun imleciyle bir UI öğesinin üzerinde olduğunu gösterir.
- Seçili - Oyuncunun bir UI öğesini girişiyle seçtiğini gösterir.
Bu üç etkileşim, şablonun oyuncuların avatar kıyafetlerini ve aksesuarlarını tarayıp seçip satın alması için ana kullanıcı akışında hayati öneme sahiptir, bu nedenle kimsenin UI ile nasıl etkileşimde bulunacağı konusunda kafası karışmamalıdır. Başarı için oyuncuları hazırlamak adına, şablon her UI etkileşimi için hem görsel hem de işitsel geri bildirim sağlar.




Birden fazla duyusal geri bildirim biçimini nasıl yapılandırabileceğinize bir örnek vermek için, örnek, oyuncular ekrandaki nane düğmesine bastıklarında hem görsel hem de işitsel geri bildirim sağlar. Oyuncular düğmeyle etkileşimde bulunmadıklarında, bu tipik bir nane şekeri gibi görünür, ancak düğmeye bastıklarında örnek:
- Neşeli bir melodi ses parçası çalar.
- Düğmeyi teal bir tonla renklendirir.
- Düğmeyi ekranda hafifçe aşağı hareket ettirir.
Buradan, bu etkileşimi menüyü açmak veya bir öğe satın almak gibi birçok yararlı oyun eylemiyle bağlayabilirsiniz.


Örnek Gingerbread House - Complete Audio dosyasında tek seferlik UI etkileşim sesini yeniden oluşturmak için:
Explorer penceresinde StarterGui ⟩ 2DAudioButton'a gidin, ardından:
- Bir ses kaynağı oluşturmak için bir AudioPlayer nesnesi ekleyin.
- Oyun boyunca çalan bir hoparlör oluşturmak için bir AudioDeviceOutput nesnesi ekleyin.
- Ses akışını ses oynatıcıdan hoparlöre taşımak için bir Wire nesnesi ekleyin.

AudioPlayer'ı seçin, ardından Properties penceresinde AssetID'yi rbxassetid://3422389728 olarak ayarlayın; bu, retro bir melodi ses parçası çalar.
Wire'ı seçin, ardından Properties penceresinde,
- Bu belirli ses oynatıcıdan ses taşımak istediğinizi belirtmek için SourceInstance'ı yeni AudioPlayer'ınıza ayarlayın.
- Bu belirli hoparlöre ses taşımak istediğinizi belirtmek için TargetInstance'ı yeni AudioDeviceOutput'ınıza ayarlayın.
Explorer penceresinde, 2DAudioButton'a bir LocalScript 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 buttonGui = script.Parentlocal buttonImageButton = buttonGui.ButtonFrame.ButtonImageButtonlocal buttonAudioPlayer = buttonGui.AudioPlayerlocal tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)local buttonTweenByIsPressed = {-- Bastı[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 animasyonla hareket ettirmek için TweenService.
- Script'in ebeveyni 2DAudioButton ScreenGui nesnesi.
- Nane şekeri ImageButton.
- İlgili ses oynatıcı ile melodi ses parçası.
Script daha sonra şunları tanımlar:
- Düğmenin animasyonunun üstel bir animasyon stili ile oynatılacağını belirten bir TweenInfo nesnesi.
- Düğmenin basılı veya basılmamış durumunu temsil eden iki tween.
- true basılı durum, düğmeyi ekranda hafifçe aşağı hareket ettirir ve teal bir tonla renklendirir.
- false basılmamış durum, düğmeyi ekranda orijinal konumuna geri hareket ettirir ve önceki rengi kaldırır.
Script'in geri kalan kısmı, 2D UI etkileşim geri bildirimini tetiklemek için çalışır, bu nedenle onIsPlayingChanged fonksiyonu ve olay dinleyicilerinin UI kullanıcı akışı için nasıl birlikte çalıştığını gözden geçirelim:
- buttonImageButton.Activated, bir oyuncunun düğmeye tıkladığını dinler, ardından ses oynatıcıdan ilişkili sesi çalmak için Play() fonksiyonunu çağırır. Bu işlem, AudioPlayer.IsPlaying özelliğini false'dan true'ya değiştirir.
- buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying"), ses oynatıcının IsPlaying özelliğinin değişmesini dinler, ardından onIsPlayingChanged fonksiyonunu çağırır.
- onIsPlayingChanged fonksiyonu, bu bilgiyi kullanarak ekran üzerindeki görsel görünümünü değiştiren tween'i tetikler.
- Oyuncunun düğmeye hızlı bir şekilde tıklaması durumunda sesin yanlışlıkla yeniden başlamasını önlemek için, buttonAudioPlayer.Ended, ses oynatıcının ç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 ekrandaki düğmeye her bastığınızda melodiyi duyun.