3D-audio is directioneel geluid dat uit een bepaalde locatie in de 3D-ruimte komt, waarbij het volume toeneemt of afneemt afhankelijk van de afstand en oriëntatie tussen de audio-emitter en de luisteraar. Dit betekent dat terwijl luisteraars of emitters zich door de omgeving bewegen, spelers dat geluid dynamisch vanuit verschillende richtingen en volume-niveaus kunnen horen.
Met het Gingerbread House - Start .rbxl bestand als startpunt en Gingerbread House - Complete Audio als referentie, laat deze tutorial je zien hoe je zowel herhalende als eenmalige 3D-audio aan je games toevoegt, inclusief richtlijnen over:
- Herhalende omgevingsgeluiden die afspelen zodra spelers verbinding maken met de server.
- Audio activeren om spelers te informeren over belangrijke situationele gebeurtenissen die belangrijk zijn voor hun gameplay.
- Audio activeren om spelers auditieve feedback te geven wanneer ze interactie hebben met 3D-objecten.
- Geluidssnippets van personages afspelen die spelers betrekken en begeleiden naar interessante punten binnen hun omgeving.
Als je op enig moment vastloopt in het proces, kun je Gingerbread House - Complete Audio als referentie gebruiken om je voortgang te vergelijken.
Audio-objecten
Om directionele audio te creëren, is het belangrijk om de audio-objecten te begrijpen waarmee je gedurende deze tutorial zult werken. Er zijn zes hoofdtypen audio-objecten voor 3D-audio:
- Het AudioPlayer object laadt en speelt het audio bestand af.
- Het AudioEmitter object is een virtuele luidspreker die audio in de 3D-omgeving uitzendt.
- Het AudioListener object is een virtuele microfoon die audio uit de 3D-omgeving opvangt.
- Het AudioDeviceOutput object is een fysiek hardware-apparaat in de echte wereld, zoals een luidspreker of hoofdtelefoon.
- Het AudioDeviceInput object is een fysieke microfoon in de echte wereld.
- Wires dragen audiostreams van het ene object naar het andere.
Al deze audio-objecten werken samen om geluid uit te zenden, net als hun tegenhangers in de echte wereld. Laten we eens kijken hoe dit in de praktijk werkt met een voorbeeld van een speler die een headset draagt terwijl hij een game speelt met zijn laptop:
- Het AudioPlayer laadt de 1516791621 audio asset ID in de game voor een regentrack.
- Het AudioEmitter zendt een stroom van de regentrack audio uit in de 3D-omgeving.
- Een Wire draagt de stroom van de AudioPlayer naar de AudioEmitter, zodat de stroom uit de 3D-luidspreker komt.
- Het kind AudioListener object van het personage luistert naar dat geluid binnen de 3D-omgeving en geeft het terug aan hun headset.
- Het AudioDeviceOutput object draagt het geluid van de AudioListener naar de fysieke luidspreker van de speler, of in dit geval, hun hoofdtelefoon.
- Het AudioDeviceInput object vangt geluid uit de echte wereld op en geeft het terug in de game voor spraakchat.


De volgende secties gaan dieper in op deze objecten terwijl je leert hoe je zowel herhalende als eenmalige 3D-audio kunt afspelen. Terwijl je deze objecten met de komende technieken bekijkt, kun je nauwkeuriger voorspellen hoe je geluid uit de game naar de speler en vice versa kunt vastleggen en doorgeven.
Herhalende audio
Herhalende 3D-audio, of directionele audio die naadloos herhaalt zodra spelers verbinding maken met de server, is een veelgebruikte geluidsontwerptechniek om de sfeer van de 3D-ruimte te verbeteren door deze levendig en dynamisch te laten aanvoelen. Bovendien houdt herhalende 3D-audio je omgevingsgeluidsbronnen consistent, zoals het statische geluid van een televisie of het gebrul van een waterval; als deze geluiden plotseling zouden stoppen, zou de omgeving onrealistisch aanvoelen.
Om dit concept te demonstreren, bekijk hoe de volgende 3D-audio voor twee grote watervallen stopt zodra de niet-herhalende audiotrack is voltooid. Terwijl de watergeluiden aanvankelijk spelers onderdompelen in de buitenomgeving, is de plotselinge auditieve verandering schokkend en onnatuurlijk voor hoe een waterval zich in de echte wereld gedraagt.
Evenzo gebruikt het voorbeeld deze techniek voor de stromende chocolade waterval en past het volume aan op basis van de afstand van de speler tot de audio-emitter. Wanneer de speler minder dan 20 studs weg is, zendt de emitter het geluid op vol volume uit. Terwijl de speler verder weg beweegt, neemt het geluid van het klotsen af in volume elke 20 studs van de audio-emitter. Dit emuleert geluid in de echte wereld dat afneemt in volume naarmate je verder van de bron verwijderd bent.
Om de herhalende 3D-audio in het voorbeeld Gingerbread House - Complete Audio plaatsbestand te recreëren:
Schakel een standaard luisteraar in die aan je spelerspersonage is gekoppeld.
- In het Explorer venster, selecteer de SoundService.
- In het Properties venster, stel DefaultListenerLocation in op Character. Wanneer je de game uitvoert, maakt de engine automatisch:
- Een AudioListener aan onder elk Humanoid.RootPart van de speler, zodat je geluiden kunt horen verschuiven in je echte luidsprekers volgens de positie en schaal van geluidsbronnen binnen de game.
- Een AudioDeviceOutput onder SoundService.
In het Explorer venster, navigeer naar Workspace ⟩ WaterfallAudioObject, dan:
- Voeg een AudioPlayer object toe om een audio bron voor de waterval te creëren.
- Voeg een AudioEmitter object toe om een positionele stroom van WaterfallAudioObject uit te zenden.
- Voeg een Wire object toe om de stroom van de audio speler naar de audio emitter te dragen.

Selecteer de AudioPlayer, en stel in het Properties venster,
- AssetID in op rbxassetid://1516791621 om een regenachtige audiotrack af te spelen.
- Schakel Looping in zodat de audio naadloos herhaalt.
Selecteer de AudioEmitter, en stel in het Properties venster DistanceAttenuation in op {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} zodat het geluid geleidelijk in volume afneemt elke 20 studs van de audio-emitter.
Selecteer de Wire, en stel in het Properties venster,
- SourceInstance in op je nieuwe AudioPlayer om aan te geven dat je wilt dat de draad audio van deze specifieke audio speler draagt.
- TargetInstance in op je nieuwe AudioEmitter om aan te geven dat je wilt dat de draad audio naar deze specifieke audio emitter binnen de waterval draagt.
Terug in het Explorer venster, voeg een Script toe aan WaterfallAudioObject, hernoem het naar LoopWaterfallMusic, stel de RunContext eigenschap in op Client, en plak de volgende code in het script:
local audioPlayer = script.ParentaudioPlayer:Play()Code uitlegHet script begint met het declareren van een variabele om de ouder van het script AudioPlayer weer te geven. Het script stelt vervolgens de audio bron in om af te spelen vanaf het moment dat de speler de game binnenkomt tot het moment dat ze de game verlaten.
Speel de game om het herhalende chocolade regen geluid te horen wanneer je avatar zich dicht bij de waterval bevindt. Wanneer je het hoofd van je personage draait om in een andere richting te kijken, verschuift het geluid dynamisch in je echte luidsprekers volgens de positie van de emitter in de 3D-ruimte.
Eenmalige audio
Eenmalige 3D-audio, of directionele audio die eenmaal op een specifieke tijd en positie afspeelt, tenzij een speler het opnieuw activeert, biedt spelers context over hun acties, de omgeving en eventuele personages om hen heen. Het gebruik van dit type auditieve feedback in je games is essentieel omdat het spelers in staat stelt strategische beslissingen te nemen, zoals het vermijden van binnenkomende vijanden of het oppakken van nuttige items.
De volgende secties bieden implementatiedetails voor veelvoorkomende gameplay-scenario's waarin spelers tijdige, directionele feedback nodig hebben, inclusief situationele gameplay-evenementen, objectinteractie en dialoog van niet-speelbare personages.
Evenementfeedback
Wanneer spelers belangrijke situationele evenementen binnen hun omgeving activeren, zoals het ontgrendelen van nieuwe gameplay-gebieden of het uitlokken van vijandelijk vuur, is het essentieel dat ze begrijpen waar in de 3D-ruimte ze hun focus en aandacht moeten richten. Als ze geen onmiddellijke auditieve feedback ontvangen, kunnen ze informatie missen die belangrijk is voor hun gameplay, wat leidt tot frustratie omdat ze niet weten waar ze heen moeten of wat ze vervolgens moeten doen.
Om te demonstreren waarom dit belangrijk is, laten we de eenmalige 3D-audio van de Laser Tag template bekijken die vanuit elke speler zijn blaster afspeelt:
- Een diepe popgeluid speelt voor elke schot die de speler vanuit zijn blaster afvuurt.
- Een klik- en robotachtige piepgeluid speelt elke keer wanneer de speler zijn blaster herlaadt met een nieuw rondje.
Beide geluiden bieden situationele bewustwording door alle nabijgelegen spelers te waarschuwen over de richting waaruit de schoten komen, zodat ze geïnformeerde beslissingen kunnen nemen om ofwel mee te doen aan het plezier of potentiële gevaren te vermijden.
Het voorbeeld gebruikt dezezelfde techniek om spelers situationele bewustwording te bieden over hun beloning voor het voltooien van het hoofdobjectief binnen de game. Nadat ze alle drie de gumdrops hebben verzameld, opent de deur naar het peperkoekenhuis om spelers toegang te geven tot het cadeau binnenin.
Omdat er geen specifieke volgorde is waarin spelers de gumdrops moeten verzamelen, is het belangrijk dat spelers zich bewust zijn van de opening van de deur, ongeacht welke gumdrop ze als laatste verzamelen. Positioneel geluid maakt dit mogelijk, zodat spelers zich bewust zijn van hun succes en waar ze vervolgens heen moeten, ongeacht hun relatieve afstand en richting van de deur.
Om de eenmalige evenementfeedback 3D-audio in het voorbeeld Gingerbread House - Complete Audio plaatsbestand te recreëren:
In het Explorer venster, navigeer naar Workspace ⟩ Door, dan:
- Voeg een AudioPlayer object toe om een audio bron voor de volumeklep te creëren.
- Voeg een AudioEmitter object toe om een positionele stroom van Door uit te zenden.
- Voeg een Wire object toe om de stroom van de audio speler naar de audio emitter te dragen.

Selecteer de AudioPlayer, en stel in het Properties venster AssetID in op rbxassetid://5930776613 om een geluidstrack van een schuivende metalen poort af te spelen.
Selecteer de Wire, en stel in het Properties venster,
- SourceInstance in op je nieuwe AudioPlayer om aan te geven dat je wilt dat de draad audio van deze specifieke audio speler draagt.
- TargetInstance in op je nieuwe AudioEmitter om aan te geven dat je wilt dat de draad audio naar deze specifieke audio emitter binnen het volume draagt.
Terug in het Explorer venster, navigeer naar ServerScriptService, voeg een Script toe, hernoem het naar GumdropService, stel de RunContext eigenschap in op Server, en plak de volgende code in het script:
-- Initialiseren van variabelenlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local TweenService = game:GetService("TweenService")-- Moduleslocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Variabelenlocal gumdropsFolder = Workspace.Gumdropslocal gumdrops = gumdropsFolder:GetChildren()local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAMElocal GUMDROP_AMOUNT_TO_ADD = 1local function updatePlayerGumdrops(player, updateFunction)-- Update de gumdrop tabellocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Update de gumdrop leaderboardLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Controleer of de speler drie gumdrops heeft verzameldif newGumdropAmount >= 3 then-- Speel de deur evenement audio af wanneer de speler drie gumdrops verzameltlocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- Animeer de deur om naar beneden te bewegenlocal 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-- Definiëren van de gebeurtenis handlerlocal function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Speler heeft een gumdrop aangeraaktlocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Enabled", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)print("Speler heeft gumdrop verzameld")endendend-- Instellen van gebeurtenisluisteraarsfor _, gumdrop in gumdrops dogumdrop:SetAttribute("Enabled", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endCode uitlegDit script begint met het initialiseren van de Workspace, Players, ServerStorage, en TweenService services, zodat het hun kinderen en functionaliteit kan refereren. Vervolgens vereist het de Leaderboard en PlayerData modules in ServerStorage; deze modules zijn verantwoordelijk voor het creëren en bijwerken van een leaderboard in de rechterbovenhoek van het scherm dat het aantal gumballs bijhoudt dat een speler in de omgeving verzamelt.
De updatePlayerGumdrops functie van het script is waar het grootste deel van het werk plaatsvindt voor het activeren van 3D-audio voor evenementfeedback, en het neemt twee argumenten:
- player - Een speler die een gumdrop verzamelt.
- updateFunction - Een callbackfunctie die het verzamelde gumdrop aantal van de speler bijwerkt.
Wanneer een speler met een gumdrop botst, doet het script het volgende:
- Krijgt de nieuwe gumdrop verzameling hoeveelheid waarde van de speler door de PlayerData.updateValue functie aan te roepen.
- Update de leaderboard met dit nieuwe bedrag door de Leaderboard.setStat functie aan te roepen.
- Controleert of de hoeveelheid groter is dan of gelijk aan 3.
Wanneer deze waarde groter is dan of gelijk aan 3, doet het script het volgende:
- Speelt de 3D-audio track van de audio speler naar de audio emitter af.
- Beweegt de deur lineair 15 studs onder zijn huidige positie.
De rest van het script is grotendeels verantwoordelijk voor het detecteren dat alles wat met de gumdrop botst een speler is, zodat het een niet-positioneel geluid voor verzamelfeedback kan activeren. Voor meer informatie over dit deel van het script, zie Voeg 2D-audio toe - Gameplay feedback.
Speel de game om het geluid van de schuifpoort te horen nadat je alle drie de gumdrops in de omgeving hebt verzameld. Wanneer je de camera draait, verschuift het geluid dynamisch in je echte luidsprekers, zodat je het hoort volgens de positie van de emitter in de 3D-ruimte.
Objectinteractie
Wanneer spelers interactie hebben met 3D-objecten binnen hun omgeving, zoals het aanzetten van een lichtschakelaar of het oppakken van een wapen, is het belangrijk om onmiddellijke feedback te geven, zodat ze intuïtief begrijpen hoe ze met het object interageren. De combinatie van zowel visuele als auditieve feedback versterkt de oorzaak-en-gevolgrelatie tussen de acties van de speler en de reactie van de omgeving.
Om dit concept verder uit te breiden, laten we de volgende eenmalige 3D-audio van het Plant voorbeeld bekijken voor de gebruikersstroom van het tuinieren van een kool:
- Een zachte klikgeluid speelt wanneer de speler een zaadje plant.
- Een nat, spetterend geluid speelt wanneer de speler hun groeiende plant water geeft.
- Een knipgeluid speelt wanneer de speler de volgroeide plant verzamelt.
- Een zachte thud-geluid speelt wanneer de speler de kool in de wagen plaatst.
Al deze geluiden versterken de proximity prompt belangrijke interacties van de speler met het object dat van vorm verandert in de 3D-ruimte. Voor spelers met visuele beperkingen waarbij kleurveranderingen of animaties moeilijker te onderscheiden zijn, helpen deze meerdere vormen van sensorische feedback om je 3D-objectinteracties toegankelijk en intuïtief te houden voor zoveel mogelijk spelers.
Om een ander voorbeeld te geven van hoe je objectinteractie kunt configureren met meerdere vormen van sensorische feedback, biedt het voorbeeld zowel visuele als auditieve feedback telkens wanneer spelers op de 3D-pepermuntknop binnen het peperkoekenhuis stappen. Wanneer spelers niet met de knop interageren, lijkt het op een typische pepermunt, maar wanneer ze op de knop stappen, doet het voorbeeld het volgende:
- Speelt een feestelijke jingle audio track af.
- Tint de zijkanten van de knop met een groene tint.
- Beweegt de knop in de grond.
Van hieruit kun je deze interactie verbinden met allerlei unieke gameplay-acties, zoals het ontgrendelen van een item of het activeren van een speciale vaardigheid.


Om de eenmalige objectinteractie 3D-audio in het voorbeeld Gingerbread House - Complete Audio plaatsbestand te recreëren:
In het Explorer venster, navigeer naar Workspace ⟩ 3DAudioButton, dan:
- Voeg een AudioPlayer object toe om een audio bron voor de knop te creëren.
- Voeg een AudioEmitter object toe om een positionele stroom van 3DAudioButton uit te zenden.
- Voeg een Wire object toe om de stroom van de audio speler naar de audio emitter te dragen.

Selecteer de AudioPlayer, en stel in het Properties venster AssetID in op rbxassetid://1846248593 om een vrolijke, feestelijke audio track af te spelen.
Selecteer de Wire, en stel in het Properties venster,
- SourceInstance in op je nieuwe AudioPlayer om aan te geven dat je wilt dat de draad audio van deze specifieke audio speler draagt.
- TargetInstance in op je nieuwe AudioEmitter om aan te geven dat je wilt dat de draad audio naar deze specifieke audio emitter binnen de knop draagt.
Terug in het Explorer venster, voeg een Script toe aan 3DAudioButton, hernoem het naar PlayAudioWhenPressed, en plak de volgende code in het script:
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 = {-- Ingedrukt[true] = TweenService:Create(buttonPart, tweenInfo, {Size = buttonPart.Size / Vector3.new(2, 1, 1),Color = Color3.fromRGB(75, 151, 75),}),-- Standaard[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)Code uitlegHet script begint met het verkrijgen van:
- De TweenService zodat het de knop kan animeren die uit de grond steekt.
- Het ouder 3DAudioButton model van het script.
- Het deel van de knop dat uit de grond steekt.
- De relevante audio speler met je feestgeluid audio track.
Het script definieert vervolgens:
- Een TweenInfo object dat specificeert dat de animatie van de knop met een exponentiële animatiestijl zal afspelen.
- Twee tweens die de ingedrukte of niet-ingedrukte staat van de knop vertegenwoordigen.
- De true ingedrukte staat beweegt de knop iets naar beneden in de grond en tint de zijkanten van het deel met een groene tint.
- De false niet-ingedrukte staat beweegt de knop terug naar zijn oorspronkelijke positie en verwijdert de vorige tint.
De rest van het script is waar het grootste deel van het werk plaatsvindt voor objectinteractie feedback, dus laten we bekijken hoe de onIsPlayingChanged functie en gebeurtenisluisteraars samenwerken:
- buttonPart.Touched luistert naar een speler die de knop aanraakt, en roept vervolgens de Play() functie aan om de bijbehorende audio van de audio speler te starten. Dit proces schakelt de AudioPlayer.IsPlaying eigenschap van false naar true.
- buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") luistert naar de IsPlaying eigenschap van de audio speler om te veranderen, en roept vervolgens de onIsPlayingChanged functie aan.
- De onIsPlayingChanged functie gebruikt deze informatie om de tween te activeren die de visuele verschijning in de 3D-ruimte verandert.
- Om te voorkomen dat de speler per ongeluk de audio opnieuw start als ze snel op de knop springen, luistert buttonPressedAudioPlayer.Ended naar de audio speler om te eindigen met afspelen voordat de onIsPlayingChanged functie opnieuw wordt aangeroepen.
Het is belangrijk op te merken dat de onIsPlayingChanged gebeurtenis alleen wordt geactiveerd wanneer deze verandert van false naar true, wat betekent dat deze niet wordt geactiveerd wanneer deze verandert van true naar false. Dit is de bedoelde werking vanwege complicaties met de timing van het repliceren van eigenschappen van server naar client. Daarom wordt de Ended gebeurtenis in dit voorbeeld geboden en beluisterd om beide gevallen te dekken.
Speel de game om het feestgeluid te horen wanneer je spelerspersonage de 3D-knop in het peperkoekenhuis aanraakt. Wanneer je wegloopt van de knop, neemt het volume van het geluid af.
Dialoog van personages
Het bieden van directionele audio van je niet-speelbare personages (NPC) is nuttig om spelers te begeleiden naar interessante punten binnen hun omgeving en voegt diepte toe aan hun interacties met andere personages. In feite gebruiken veel ontwerpers in narratief gedreven games strategisch personagedialoog om spelers indirect te leren over hun personage, bondgenoten en vijandige personages, of de wereld zelf.
Veelvoorkomende voorbeelden van deze techniek zijn onder andere:
- Dialoogstijl om de toon van je game te zetten.
- Banter om spelers te leren over de relaties tussen personages.
- Vijandige gesprekken om motivaties of hun positie ten opzichte van de speler te onthullen.
- Spelerpersonages die hun gedachten hardop uitspreken om de speler zachtjes te begeleiden naar wat ze vervolgens moeten doen, zoals zichzelf genezen, naar een andere locatie verplaatsen of een item vinden.
- Bondgenoten die met het spelerspersonage praten om details over de in-game wereld zoals geschiedenis, cultuur en sociale kwesties te onthullen.
Om te demonstreren hoe dit eruit kan zien in de praktijk, laten we de volgende eenmalige 3D-audio van Beyond the Dark showcase bekijken die periodiek afspeelt wanneer spelers zich in het hoofd lobbygebied van het ruimtestation bevinden.
Met het ruimtestation als personage biedt deze dialoogclip spelers belangrijke context en lore over de algehele setting. Bijvoorbeeld, uit deze enkele zin leren spelers:
- Ze zijn in de ruimte, specifiek op een ruimtestation genaamd Kerr-Newman Deep Space Relay 14.
- Hun omgeving is futuristisch en gastvrij.
- Ze zijn een bezoeker en zullen waarschijnlijk snel vertrekken.
Deze details samen onderdompelen spelers in hun omgeving en voegen een gevoel van urgentie toe aan hun missie. Als spelers echter niet weten wat hun belangrijkste missie is, kun je ook personagedialoog gebruiken om spelers te informeren over wat je wilt dat ze doen binnen je game.
Om dit te illustreren, gebruikt het voorbeeld een volume, of onzichtbaar gebied binnen de 3D-ruimte, om personagedialoog van de sneeuwman te activeren om spelers te begeleiden om drie gumdrops te verzamelen om de deur naar zijn huis te openen. Aangezien dit een van de eerste dingen is die spelers zien wanneer ze de game binnenkomen, is de kans groter dat spelers de dialoog activeren en weten wat ze moeten doen om succesvol te zijn.

Om de eenmalige personagedialoog 3D-audio in het voorbeeld Gingerbread House - Complete Audio plaatsbestand te recreëren:
In het Explorer venster, navigeer naar Workspace ⟩ DialogueVolume, dan:
- Voeg een AudioPlayer object toe om een audio bron voor het volume te creëren.
- Voeg een AudioEmitter object toe om een positionele stroom van DialogueVolume uit te zenden.
- Voeg een Wire object toe om de stroom van de audio speler naar de audio emitter te dragen.

Selecteer de AudioPlayer, en stel in het Properties venster AssetID in op rbxassetid://92917410841704 om een instructieve audio track voor het doel van de game af te spelen.
Selecteer de Wire, en stel in het Properties venster,
- SourceInstance in op je nieuwe AudioPlayer om aan te geven dat je wilt dat de draad audio van deze specifieke audio speler draagt.
- TargetInstance in op je nieuwe AudioEmitter om aan te geven dat je wilt dat de draad audio naar deze specifieke audio emitter binnen het volume draagt.
Terug in het Explorer venster, navigeer naar StarterPlayer ⟩ StarterCharacterScripts, voeg een LocalScript toe, hernoem het naar PlayAudioWhenInVolume, en plak de volgende code in het lokale script:
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)Code uitlegDit script begint met het verkrijgen van de Workspace en Players services, zodat het hun kinderen en functionaliteit kan refereren. Voor elk spelerspersonage dat in de game laadt of opnieuw spawnt, wacht het script op:
- Het volume-object in de workspace genaamd DialogueVolume.
Wanneer iets met het volume botst, krijgt de Touched gebeurtenis handler functie de eerste voorouder die een Model is, wat het personage zou moeten zijn als de BasePart die met het volume botste een afgeleide is van een personagemodel. Als dat zo is, doet de functie het volgende:
- Stelt debounce in op true.
- Speelt de audio af en wacht tot deze eindigt.
- Stelt debounce weer in op false.
Het instellen van debounce van false naar true naar false weer na het afspelen van de audio is een debounce-patroon dat voorkomt dat de audio herhaaldelijk wordt geactiveerd terwijl spelers continu met het volume botsen. Voor meer informatie over dit debounce-patroon, zie Debounce - Detecteer botsingen.
Speel de game om de instructieve personagedialoog te horen wanneer je spelerspersonage het volume rond de sneeuwman aanraakt.