Orta seviye öğreticiler

3D ses ekleme

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

3D ses, 3D uzayda belirli bir konumdan yayılan yönlü ses anlamına gelir ve ses yayıcı ile dinleyici arasındaki mesafe ve yönlendirmeye bağlı olarak sesin seviyesinin artıp azalmasına neden olur. Bu, dinleyiciler veya yayıcılar ortamda hareket ettikçe, oyuncuların o sesi farklı yönlerden ve ses seviyelerinden dinleyebilmesini sağlar.

Başlangıç noktası olarak Zencefilli Ev - Başlangıç .rbxl dosyasını ve referans olarak Zencefilli Ev - Tam Ses dosyasını kullanarak, bu eğitimde hem döngüsel hem de tek seferlik 3D sesi deneyimlerinize nasıl ekleyeceğiniz gösterilmektedir. Eğitim aşağıdaki konularda rehberlik sağlamaktadır:

  • Oyuncular sunucuya bağlandığında hemen çalmaya başlayan döngüsel çevresel sesler.
  • Oyunculara oyun deneyimleri için önemli olan anahtar durum olayları hakkında bilgi vermek amacıyla tetiklenen sesler.
  • Oyuncuların 3D nesnelerle etkileşime girdiklerinde işitsel geri bildirim sağlamak için etkinleştirilen sesler.
  • Oyuncuları, çevrelerindeki ilgi noktalarına yönlendiren karakter ses kayıtlarının çalınması.

Herhangi bir noktada süreçte takılırsanız, ilerlemenizi karşılaştırmak için Zencefilli Ev - Tam Ses dosyasını referans alabilirsiniz.

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 ortama ses yayıcı sanaldır.
  • AudioListener nesnesi, 3D ortamdan ses alan sanaldır.
  • AudioDeviceOutput nesnesi, gerçek dünyadaki bir donanım cihazıdır, örneğin bir hoparlör veya kulaklık.
  • AudioDeviceInput nesnesi, gerçek dünyadaki bir mikrofondur.
  • Wires, ses akışlarını bir nesneden diğerine taşır.

Bu ses nesneleri, gerçek dünyadaki muadilleri gibi ses yaymak için birlikte çalışır. Bir oyuncunun bir dizüstü bilgisayar ile oynarken kulaklık taktığı bir örnek üzerinden bunun nasıl işlediğine bakalım:

  • AudioPlayer, oyunda bir yağmur parçası için 1516791621 ses varlık kimliğini yükler.
  • AudioEmitter, 3D ortama yağmur parçası sesinin bir akışını yayar.
  • Wire, akışı AudioPlayer'dan AudioEmitter'a taşır, böylece akış 3D hoparlörden çıkar.
  • Karakterin çocuk AudioListener nesnesi, o sesleri 3D ortamda dinler ve geri besler.
  • AudioDeviceOutput nesnesi, sesi AudioListener'dan oyuncunun fiziksel hoparlörüne veya bu durumda kulaklığına taşır.
  • AudioDeviceInput nesnesi, gerçek dünyadan sesi yakalar ve deneyime iletir.
Deneyim içindeki nesne temsilleri
Gerçek dünyadaki nesne temsilleri

Aşağıdaki bölümler, döngüsel ve tek seferlik 3D sesleri çalmayı öğrenirken bu nesnelere daha derinlemesine dalar ve bu nesneleri dikkate alarak daha kesin bir şekilde deneyimden oyuncuya ses yakalama ve geri besleme süreçlerini nasıl yöneteceğinizi tahmin edebilirsiniz.

Döngüsel ses

Döngüsel 3D ses, ya da oyuncular sunucuya bağlanır bağlanmaz kesintisiz olarak tekrarlayan yönlü ses, 3D ortamın havasını canlandıran ve dinamik hissettiren 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, ortam gerçek dışı hissedecektir.

Bu kavramı göstermek için, aşağıdaki iki büyük şelalenin 3D sesinin, döngüsüz ses parçası tamamlandığında durduğunu inceleyin. Su sesleri, oyuncuları dış ortamda başlangıçta daldırırken, ani ses değişimi gerçek dünyada bir şelalenin nasıl davrandığına açıkça aykırıdır.

Benzer şekilde, örnek, akışkan bir çikolata şelalesi için bu tekniği kullanır ve ses çıkarıcının sesini, oyuncunun mesafesine göre ayarlar. Oyuncu 20 studdan daha yakın olduğunda, yayıcı sesi tam volümde yayar. Oyuncu daha da uzakta hareket ettiğinde, çalkalanan ses her 20 studda bir yayıcıdan uzaklaştıkça azalır. Bu, sesin kaynağından ne kadar uzakta olduğunuzda gerçek dünyada sesin azalmasını simüle eder.

[Daha önce tanımlanan] Zencefilli Ev - Tam Ses (https://www.roblox.com/games/94670255584609/Gingerbread-House-Complete-Audio) yer dosyasında döngüsel 3D sesi yeniden oluşturmak için:

  1. Oyuncu karakterinize bağlı varsayılan bir dinleyiciyi etkinleştirin.

    1. Explorer penceresinde, SoundService'i seçin.
    2. Properties penceresinde, DefaultListenerLocationCharacter olarak ayarlayın. Deneyimi çalıştırdığınızda, motor otomatik olarak:
      • Her oyuncu karakterinin Humanoid.RootPart altında bir AudioListener oluşturur, böylece ortamda ses kaynaklarının konumuna ve ölçeğine göre gerçek dünya hoparlörlerinizde seslerin kayma algısı yaşayabilirsiniz.
      • SoundService altında bir AudioDeviceOutput oluşturur.
  2. Explorer penceresinde WorkspaceWaterfallAudioObject'a gidin, ardından:

    1. Bir ses kaynağı oluşturmak için bir AudioPlayer nesnesi ekleyin.
    2. WaterfallAudioObject'tan yönlü bir akış yaymak için bir AudioEmitter nesnesi ekleyin.
    3. Ses akışını ses oyuncusundan ses yayıcısına taşımak için bir Wire nesnesi ekleyin.
  3. AudioPlayer'ı seçin, ardından Properties penceresinde,

    1. AssetID'yi rbxassetid://1516791621 olarak ayarlayın, böylece yağmurlu bir ses parçası çalınır.
    2. Sesin kesintisiz tekrar etmesi için Looping özelliğini etkinleştirin.
  4. AudioEmitter'ı seçin, ardından Properties penceresinde DistanceAttenuation{0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} olarak ayarlayın, böylece ses, ses yayıcıdan her 20 studda uzaklaştıkça ses seviyesi giderek azalır.

  5. Wire'ı seçin, ardından Properties penceresinde,

    1. SourceInstance'ı yeni AudioPlayer'ınız olarak ayarlayın, böylece telin bu belirli ses oyuncusundan ses taşımasını istiyorsunuz.
    2. TargetInstance'ı yeni AudioEmitter'ınız olarak ayarlayın, böylece telin bu belirli ses yayıcısından ses taşımasını istiyorsunuz.
  6. Explorer penceresine geri dönün, 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 scriptin içine yapıştırın:


    local audioPlayer = script.Parent
    audioPlayer:Play()

    Script, scriptin ebeveynini temsil etmek üzere bir değişken tanımlayarak başlar AudioPlayer. Script, oyuncunun deneyime katıldığı andan deneyimden çıkacağı ana kadar ses kaynağını çalmaya ayarlar.

  7. Deneyimi test edin, böylece avatarınız şelaleye yakın olduğunda döngüsel çikolata yağmur sesini duyabilirsiniz. Karakterinizin kafasını farklı bir yöne çevirdiğinizde, ses, 3D uzaydaki yayıcının konumuna göre gerçek dünya hoparlörlerinizde dinamik olarak değişir.

Tek seferlik ses

Tek seferlik 3D ses, veya belirli bir zaman ve konumda yalnızca bir kez çalan yönlü ses, oyunculara eylemleri, çevreleri ve etraflarındaki herhangi bir karakter hakkında bağlam sağlar. Deneyimlerinizde bu tür işitsel geri bildirimleri sağlamak önemlidir çünkü oyuncuların gelen düşmanlardan kaçınmak veya yararlı nesneleri almak gibi stratejik kararlar vermesine 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 ayrıntılarını sağlar; bu, olaylarla ilgili oyun durumu, nesne etkileşimi ve oynanabilir olmayan karakter diyaloglarını içerir.

Olay geri bildirimi

Oyuncular çevrelerinde anahtar durum olaylarını tetikledikçe, yeni oyun alanlarını açmak veya düşman ateşini tetiklemek gibi, 3D uzayda odaklarını ve dikkatlerini yönlendirmeleri gereken yerleri anlamaları önemlidir. Eğer hemen işitsel geri bildirim almazlarsa, oyun deneyimleri için önemli olan bilgileri kaçırabilirler, bu da nereye gideceklerini veya ne yapacaklarını bilmemek nedeniyle hayal kırıklığına yol açabilir.

Bunun neden önemli olduğunu göstermek için, Lazer Tag şablonundan her oyuncunun blasterından çalınan tek seferlik 3D sesi gözden geçirelim:

  • Oyuncunun blasterından ateş ettiği her patlamada derin bir patlama sesi çalıyor.
  • Oyuncu blasterına yeni bir mermi yüklediğinde bir tıklama ve robotik bip sesi çalıyor.

Bu seslerin her ikisi, yakındaki tüm oyuncuları atışların nereden geldiği hakkında bilgilendirerek olay farkındalığı sağlar, böylece eğlenceye katılma veya potansiyel tehlikelerden kaçınma gibi bilinçli kararlar alabilirler.

Örnek, deneyim içindeki ana hedefi tamamlamanın ödülü hakkında oyunculara durum farkındalığı sağlamak için bu aynı tekniği kullanır. Üç şekerlemeyi topladıktan sonra, zencefilli evin kapısı açılır ve oyuncuların içindeki hediyeye erişim izni verilir.

Öğrencilerin şekerlemeleri hangi sırayla toplamaları gerektiği kesin bir sıralama olmadığı için, oyuncuların kapının açıldığını fark etmeleri önemlidir, bu da hangi şekerlemeyi en son toplarlarsa toplasın, bunun bilinir olmasını sağlar. Yönlü ses, oyuncuların başarısını ve nereye gitmeleri gerektiğini, kapıya olan relatif mesafeleri ve yönleri ne olursa olsun bilmelerini sağlar.

Tek seferlik olay geri bildirim 3D sesini yeniden oluşturmak için Zencefilli Ev - Tam Ses yer dosyasında:

  1. Explorer penceresinde, WorkspaceDoor'a gidin, ardından:

    1. Ses hacmi için bir ses kaynağı oluşturmak üzere bir AudioPlayer nesnesi ekleyin.
    2. Door'dan yönlü bir akış yaymak için bir AudioEmitter nesnesi ekleyin.
    3. Ses akışını ses oyuncusundan ses yayıcısına taşımak için bir Wire nesnesi ekleyin.
  2. AudioPlayer'ı seçin, ardından Properties penceresinde AssetID'yi rbxassetid://5930776613 olarak ayarlayın, böylece kayar metal kapı ses parçası çalınır.

  3. Wire'ı seçin, ardından Properties penceresinde,

    1. SourceInstance'ı yeni AudioPlayer'ınız olarak ayarlayın, böylece bu belirli ses oyuncusundan ses getirmesini istiyorsunuz.
    2. TargetInstance'ı yeni AudioEmitter'ınız olarak ayarlayın, böylece bu belirli ses yayıcısından ses getirmesini istiyorsunuz.
  4. Explorer penceresine geri dönün, ServerScriptService'ye gidin, ardından bir Script ekleyin, adını GumdropService olarak değiştirin, RunContext özelliğini Server olarak ayarlayın ve aşağıdaki kodu scriptin içine yapıştırın:


    -- Değişkenleri başlatma
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local TweenService = game:GetService("TweenService")
    -- Modüller
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- Değişkenler
    local gumdropsFolder = Workspace.Gumdrops
    local gumdrops = gumdropsFolder:GetChildren()
    local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAME
    local GUMDROP_AMOUNT_TO_ADD = 1
    local function updatePlayerGumdrops(player, updateFunction)
    -- Şekerleme tablosunu güncelle
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- Şekerleme lider panosunu güncelle
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- Oyuncunun üç şekerleme topladığını kontrol et
    if newGumdropAmount >= 3 then
    -- Oyuncu üç şekerleme topladığında kapı olayı sesini çal
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- Kapıyı aşağı doğru hareket ettir
    local doorPart = Workspace.Door
    local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)
    local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})
    tween:Play()
    end
    end
    -- Olay işleyicisini tanımlama
    local function onGumdropTouched(otherPart, gumdrop)
    if gumdrop:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- Oyuncu bir şekerlemeye dokundu
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Enabled", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    print("Oyuncu şekerlemeyi topladı")
    end
    end
    end
    -- Olay dinleyicilerini ayarlama
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Enabled", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    Script, Workspace, Players, ServerStorage ve TweenService hizmetlerini başlatarak, bu hizmetlerin çocuklarına ve işlevlerine erişim sağlar. Ardından, Leaderboard ve PlayerData modüllerini ServerStorage'dan gerektirir; bu modüller, oyuncunun çevrede topladığı şekerleme miktarını izleyen sağ üst köşede bir lider panosunu oluşturmaktan ve güncellemelerden sorumludur.

    Script'in updatePlayerGumdrops fonksiyonu, olay geri bildirimi için 3D ses tetikleme sürecinin büyük kısmını gerçekleştirir ve iki argüman alır:

    • player - Bir şekerlemeyi toplayan oyuncu.
    • updateFunction - Oyuncunun topladığı şekerleme miktarını güncelleyen bir geri çağırma fonksiyonu.

    Bir oyuncu bir şekerleme ile çarpıştığında, script:

    • PlayerData.updateValue fonksiyonunu çağırarak oyuncunun yeni şekerleme toplama miktar değerini alır.
    • Bu yeni miktarı Leaderboard.setStat fonksiyonunu çağırarak lider panosunu 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 altında doğrusal olarak hareket ettirir.

    Script'in geri kalanı, şekerlemeyle çarpışan herhangi bir şeyin bir oyuncu olup olmadığını tespit etmekten sorumludur, böylece toplama geri bildirim sesi tetiklenebilir. Bu script'in daha fazla detayları için 2D ses ekleme - Oyun geri bildirimi sayfasına bakın.

  5. Deneyimi test edin, böylece ortamdaki üç şekerlemeyi topladıktan sonra kayar kapı sesini duyabilirsiniz. Kamera döndürdüğünüzde, ses, 3D uzaydaki yayıcının konumuna göre gerçek dünya hoparlörlerinizde dinamik olarak değişir.

Nesne etkileşimi

Oyuncular, ortamlarındaki 3D nesnelerle etkileşime geçtiğinde, örneğin bir ışık anahtarını açmak veya bir silah almak gibi, nasıl etkileşimde bulunduklarını sezgisel olarak anlamaları için anında geri bildirimin sağlanması önemlidir. Görsel ve işitsel geri bildirimin birleşimi, oyuncunun eylemleri ile çevresel tepki arasındaki sebep-sonuç ilişkisini güçlendirir.

Bu kavramı genişletmek için, kullanıcının bir lahana yetiştirdiği akışta Bitki örneğinden tek seferlik 3D sesin aşağıdaki parçalarını inceleyelim:

  • Oyuncu bir tohum ektiğinde hafif bir tıklama sesi çalar.
  • Oyuncu büyüyen bitkisini suladığında ıslak, sıçramış gibi bir ses çalar.
  • Oyuncu tam olgunlaşmış bitkiyi topladığında bir kesim sesi çalar.
  • Oyuncu lahanayı arabaya yerleştirdiğinde yumuşak bir düşme sesi çalar.

Bu seslerin tamamı, oyuncunun yakınlık istemi ile nesne üzerindeki anahtar etkileşimlerini artırarak 3D uzayda biçim değişikliklerini pekiştirir. Renk değişiklikleri veya animasyonların kendi başlarına daha zor çözümlenebildiği görme engelli oyuncular için, bu çoklu duyusal geri bildirim türleri sayesinde 3D nesne etkileşimlerinizin mümkün olduğunca erişilebilir ve sezgisel kalmasına yardımcı olursunuz.

Nesne etkileşimini birden fazla duyusal geri bildirim şekli ile nasıl yapılandırabileceğinize farklı bir örnek vermek için, örnek, zencefilli evdeki 3D nane butonuna basıldığında her zaman görsel ve işitsel geri bildirim sağlar. Oyuncular butonla etkileşime geçmediğinde, bu tipik bir nane şekeri gibi görünür, ancak oyuncular butona bastıklarında, örnek:

  • Kutlama müziği ses parçasını çalar.
  • Butonun kenarlarını yeşil tonunda tımarlar.
  • Butonu aşağıya doğru hareket ettirir.

Buradan, bu etkileşimi eşya açma veya özel yetenek tetikleme gibi çeşitli oyun eylemleriyle bağlayabilirsiniz.

Varsayılan görünüm
Basıldı durumu

Tek seferlik nesne etkileşim 3D sesini, Zencefilli Ev - Tam Ses yer dosyasında yeniden oluşturmak için:

  1. Explorer penceresinde Workspace3DAudioButton'a gidin, ardından:

    1. Buton için bir ses kaynağı oluşturmak üzere bir AudioPlayer nesnesi ekleyin.
    2. 3DAudioButton'dan yönlü bir akış yaymak için bir AudioEmitter nesnesi ekleyin.
    3. Ses akışını ses oyuncusundan ses yayıcısına taşımak için bir Wire nesnesi ekleyin.
  2. AudioPlayer'ı seçin, ardından Properties penceresinde AssetID'yi rbxassetid://1846248593 olarak ayarlayın, böylece neşeli bir kutlama müziği çalınır.

  3. Wire'ı seçin, ardından Properties penceresinde,

    1. SourceInstance'ı yeni AudioPlayer'ınız olarak ayarlayın, böylece telin bu belirli ses oyuncusundan ses getirmesini istiyorsunuz.
    2. TargetInstance'ı yeni AudioEmitter'ınız olarak ayarlayın, böylece telin bu belirli ses yayıcısından ses getirmesini istiyorsunuz.
  4. Explorer penceresine geri dönün, 3DAudioButton'a bir Script ekleyin, adını PlayAudioWhenPressed olarak değiştirin ve ardından aşağıdaki kodu scriptin içine yapıştırın:


    local TweenService = game:GetService("TweenService")
    local buttonModel = script.Parent.Parent
    local buttonPart = buttonModel.ButtonPart
    local buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayer
    local tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)
    local buttonTweenByIsPressed = {
    -- Basılı
    [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.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonPart.Touched:Connect(function(_hit)
    buttonPressedAudioPlayer:Play()
    end)

    Script, şunları alarak başlar:

    • Butonun yerden çıkan kısmını animasyonla oynatabilmek için TweenService'yi.
    • Script'in ebeveyni olan 3DAudioButton modelini.
    • Yerden çıkan butonun kısmını.
    • İlgili kutlama müziği ses parçasına sahip ses kaydına ulaşımı.

    Script, ardından:

    • Buton animasyonunun üslubunun üslupsal bir animasyon stilinde olacağını belirten bir TweenInfo nesnesi tanımlar.
    • Butonun basıldığı veya basılmadığı durumunu temsil eden iki eğri tanımlar.
      • true (basılı) durumu butonu yerden biraz aşağıya hareket ettirir ve kenarlarına yeşil tonu verir.
      • false (basılmamış) durumu butonu orijinal konumuna geri getirir ve önceki rengini kaldırır.

    Script'in geri kalan kısmı, nesne etkileşim geri bildirimleri için işlevselliği ele alır; bunu onIsPlayingChanged fonksiyonu ve olay dinleyicileri, şu şekilde çalışarak sağlar:

    1. buttonPart.Touched bir oyuncunun butona dokunmasını dinler, ardından ilişkili sesin ait olduğu ses oyuncusundan ses çalmak üzere Play() fonksiyonunu çağırır. Bu, AudioPlayer.IsPlaying özelliğinin false'dan true'ya geçmesine yol açar.
    2. buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") ses oyuncusunun IsPlaying özelliğinin değişmesini dinler, ardından onIsPlayingChanged fonksiyonunu çağırır.
    3. onIsPlayingChanged fonksiyonu, 3D uzaydaki görsel durumunu değiştirmek için eğrinin tetiklenmesini kullanır.
    4. Oyuncunun butona hızlı bir şekilde sıçrayarak sesin yeniden başlamasını önlemek için buttonPressedAudioPlayer.Ended, bir sesin çalıp çalmadığını dinler ve onIsPlayingChanged fonksiyonunu tekrar çağırır.

    onIsPlayingChanged olayı yalnızca false'dan true'ya geçerken tetiklenir; bu durumun bu şekilde olması, sunucudan istemciye özelliklerin kopyalanması ile ilgili zamanlama sorunlarından ötürüdür. Bu nedenle, Ended olayı örnekte iki durumu kapsamak üzere sağlanmış ve dinlenmiştir.

  5. Deneyimi test edin, böylece zencefilli evdeki 3D butona dokunduğunuzda kutlama sesini duyabilirsiniz. Butondan uzaklaştığınızda, sesin sesi azalır.

Karakter diyalogları

Oynanabilir olmayan karakterlerinizden (NPC) yönlü ses sağlamak, oyuncuları çevrelerindeki ilgi noktalarına yönlendirmek için yardımcıdır ve diğer karakterlerle olan etkileşimlerine derinlik ekler. Özellikle anlatı odaklı deneyimlerde, birçok tasarımcı, karakter diyalogunu, oyunculara karakterleri, dost ve düşman karakterleri veya dünyayı dolaylı olarak öğretmek amacıyla stratejik olarak kullanmaktadır.

Bu tekniğin yaygın örnekleri şunları içerir:

  • Deneyiminizin tonunu belirlemek için Diyalog tarzı.
  • Sohbet, oyunculara karakter ilişkileri hakkında bilgi verir.
  • Düşman konuşmaları, motivasyonlarını veya oyuncuya konumlarını itiraf eder.
  • Oyuncu karakterlerin düşüncelerini yüksek sesle söylemesi, oyuncunun ne yapması gerektiğini nazikçe yönlendirmek, örneğin kendini iyileştirmek, başka bir yere hareket etmek veya bir nesne bulmak.
  • Müttefik karakterlerin oyuncu karakterle konuşması, deneyim içindeki dünya detaylarını, tarihini, kültürünü ve sosyal sorunlarını açığa çıkarmak için.

Bunun pratikte nasıl görünebileceğini göstermek için, oyuncuların uzay istasyonunun ana lobisinde bulunduklarında belirli aralıklarla çalınan Ölümsüzlerin Sesi gösterimi örneğini gözden geçirelim.

Uzay istasyonunu bir karakter olarak kullanarak, bu diyalog parçası, oyunculara genel ayar hakkında önemli bağlam ve hikaye bilgilerini sağlar. Örneğin, bu tek bir cümleden, oyuncular şunları öğrenir:

  • Dış uzaydalar, özellikle de Kerr-Newman Derin Uzay İletişim İstasyonu adında bir uzay istasyonundadırlar.
  • Ortamları geleceğine yönelik ve sıcak bir ortamdır.
  • Bir ziyaretçi olup muhtemelen yakında ayrılacaklardır.

Bu detaylar, oyuncuları kendi ortamlarının içine daldırarak, görevlerine bir aciliyet duygusu katmaktadır. Fakat, eğer oyuncular ana görevlerinin ne olduğunu bilmiyorlarsa, deneyim içinde ne yapmalarını istiyorsanız karakter diyaloglarını da kullanarak bilgilendirebilirsiniz.

Örneğin, örnek, oyuncuları üç şekerleme toplamaları için yönlendiren bir diyalog sesinin tetiklenmesi amacıyla bir ses hacmi veya 3D alanda görünmeyen bir bölge kullanır. Oyuncular deneyime katıldıklarında, gördükleri ilk şeylerden biri olduğu için, oyuncuların bu diyalogu tetiklemeleri ve başarılı olmaları gerektiğini bilmeleri daha yüksek ihtimaldir.

Kardan adam etrafındaki hacim, oyuncular 3D bölgeye girdiğinde ses çalmaya başlamak için çarpışma geri bildirimini kullanmaktadır.

Tek seferlik karakter diyalogu 3D sesini, Zencefilli Ev - Tam Ses yer dosyasında yeniden oluşturmak için:

  1. Explorer penceresinde, WorkspaceDialogueVolume'a gidin, ardından:

    1. Bir ses kaynağı oluşturmak için bir AudioPlayer nesnesi ekleyin.
    2. DialogueVolume'dan yönlü bir akış yaymak için bir AudioEmitter nesnesi ekleyin.
    3. Ses akışını ses oyuncusundan ses yayıcısına taşımak için bir Wire nesnesi ekleyin.
  2. AudioPlayer'ı seçin, ardından Properties penceresinde AssetID'yi rbxassetid://92917410841704 olarak ayarlayın, böylece deneyimin amacına yönelik bir öğretici ses parçası çalınır.

  3. Wire'ı seçin, ardından Properties penceresinde,

    1. SourceInstance'ı yeni AudioPlayer'ınız olarak ayarlayın, böylece telin bu belirli ses oyuncusundan ses getirmesini istiyorsunuz.
    2. TargetInstance'ı yeni AudioEmitter'ınız olarak ayarlayın, böylece telin bu belirli ses yayıcısından ses getirmesini istiyorsunuz.
  4. Explorer penceresine geri dönün, StarterPlayerStarterCharacterScripts'e gidin, bir LocalScript ekleyin, adını PlayAudioWhenInVolume olarak değiştirin ve aşağıdaki kodu yerel scriptin içine yapıştırın:


    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local humanoid = script.Parent:WaitForChild("Humanoid")
    local volumeDetector = Workspace.DialogueVolume
    local trigger = humanoid:WaitForChild("Animator")
    local debounce = false
    local localPlayer = Players.LocalPlayer
    volumeDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
    if hitPlayer ~= localPlayer then
    return
    end
    debounce = true
    local audioPlayer = Workspace.DialogueVolume.AudioPlayer
    audioPlayer:Play()
    audioPlayer.Ended:Wait()
    debounce = false
    end)

    Bu script, Workspace ve Players hizmetlerini alarak, bu hizmetlerin çocuklarına ve işlevlerine erişim sağlar. Her oyuncu karakteri deneyime yüklendiğinde veya yeniden doğduğunda, script şunların varlığını bekler:

    • Karakterin Humanoid ve Animator nesneleri.
    • Workspace'deki DialogueVolume isimli ses hacmi nesnesi.

    Hacme çarpışan herhangi bir şey girdiğinde, Touched olay işleyici fonksiyonu, çarpışan nesnenin ilk atasını Model olarak alma işlemi gerçekleştirir, bu da çarpan BasePart nesnesinin bir karakter modelinin alt nesnesi olması durumunda olmalıdır. Eğer durum buysa, bu fonksiyon:

    • Geri bildirim oluşumu (debounce) değerini true olarak ayarlar.
    • Sesi çalar ve sesin sona ermesini bekler.
    • Geri bildirim oluşumu değerini tekrar false olarak ayarlar.

    false'dan true'ya geri bildirim oluşumunu ayarlayıp, ses çaldıktan sonra geri tekrar false durumuna döndürmek, oyuncuların hacme sürekli çarpması nedeniyle sesin sürekli tetiklenmesini engelleyen bir geri bildirim modeli oluşturur. Daha fazla bilgi için bu geri bildirim modeline Geri bildirim - Çarpışmaları tespit etme sayfasına bakın.

  5. Deneyimi test ederek, zencefilli adamın etrafındaki hacimdeki eğitimci karakter diyalogunu duyabilirsiniz.

©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.