Audio 3D è un suono direzionale che emette da una posizione particolare nello spazio 3D, aumentando o diminuendo di volume a seconda della distanza e dell'orientamento tra l'emettitore audio e l'ascoltatore. Ciò significa che, mentre gli ascoltatori o gli emettitori si muovono nell'ambiente, i giocatori possono sentire dinamicamente quell'audio da diverse direzioni e livelli di volume.
Utilizzando il file .rbxl Gingerbread House - Start come punto di partenza e Gingerbread House - Complete Audio come riferimento, questo tutorial ti mostra come aggiungere sia audio 3D in loop che audio 3D one shot ai tuoi giochi, inclusa la guida su:
- Suoni ambientali in loop che vengono riprodotti non appena i giocatori si connettono al server.
- Attivazione di audio per informare i giocatori su eventi situazionali chiave che sono importanti per il loro gameplay.
- Attivazione di audio per fornire ai giocatori feedback uditivo quando interagiscono con oggetti 3D.
- Riproduzione di frasi sonore dei personaggi che coinvolgono e guidano i giocatori verso punti di interesse all'interno del loro ambiente.
Se in qualsiasi momento ti trovi bloccato nel processo, puoi utilizzare Gingerbread House - Complete Audio come riferimento per confrontare i tuoi progressi.
Oggetti audio
Per creare audio direzionale, è importante comprendere gli oggetti audio con cui lavorerai durante questo tutorial. Ci sono sei tipi principali di oggetti audio per l'audio 3D:
- L'oggetto AudioPlayer carica e riproduce il file audio.
- L'oggetto AudioEmitter è un altoparlante virtuale che emette audio nell'ambiente 3D.
- L'oggetto AudioListener è un microfono virtuale che raccoglie audio dall'ambiente 3D.
- L'oggetto AudioDeviceOutput è un dispositivo hardware fisico nel mondo reale, come un altoparlante o delle cuffie.
- L'oggetto AudioDeviceInput è un microfono fisico nel mondo reale.
- Wires trasportano flussi audio da un oggetto all'altro.
Tutti questi oggetti audio lavorano insieme per emettere suoni proprio come i loro omologhi nel mondo reale. Diamo un'occhiata a come funziona questo in pratica utilizzando un esempio di un giocatore che indossa un auricolare mentre gioca con il proprio laptop:
- L'oggetto AudioPlayer carica l'ID dell'asset audio 1516791621 nel gioco per una traccia di pioggia.
- L'oggetto AudioEmitter emette un flusso dell'audio della traccia di pioggia nell'ambiente 3D.
- Un Wire trasporta il flusso dall'AudioPlayer all'AudioEmitter in modo che il flusso esca dall'altoparlante 3D.
- L'oggetto figlio AudioListener del personaggio ascolta quel suono all'interno dell'ambiente 3D e lo restituisce alle loro cuffie.
- L'oggetto AudioDeviceOutput trasporta il suono dall'AudioListener all'altoparlante fisico del giocatore, o in questo caso, alle loro cuffie.
- L'oggetto AudioDeviceInput cattura il suono dal mondo reale e lo restituisce nel gioco per la chat vocale.


Le sezioni seguenti approfondiscono e fanno riferimento a questi oggetti mentre impari a riprodurre sia audio 3D in loop che audio 3D one shot. Man mano che esamini questi oggetti con le tecniche che seguiranno, puoi prevedere più accuratamente come catturare e restituire il suono dal gioco al giocatore e viceversa.
Audio in loop
Audio 3D in loop, o audio direzionale che si ripete senza soluzione di continuità non appena i giocatori si connettono al server, è una tecnica comune di design del suono per migliorare l'atmosfera dello spazio 3D facendolo sembrare vivo e dinamico. Inoltre, l'audio 3D in loop mantiene le fonti sonore ambientali coerenti, come il fruscio di una televisione o il rombo di una cascata; se questi suoni dovessero fermarsi all'improvviso, l'ambiente sembrerebbe irrealistico.
Per dimostrare questo concetto, rivedi come il seguente audio 3D per due grandi cascate si interrompe non appena la traccia audio non in loop è completata. Mentre i suoni dell'acqua inizialmente immergono i giocatori nell'ambiente esterno, il cambiamento uditivo improvviso è scioccante e innaturale rispetto a come si comporta una cascata nel mondo reale.
Allo stesso modo, il campione utilizza questa tecnica per la cascata di cioccolato che scorre e regola il suo volume in base alla distanza del giocatore dall'emettitore audio. Quando il giocatore è a meno di 20 stud, l'emettitore emette il suono a volume massimo. Man mano che il giocatore si allontana, l'audio del movimento diminuisce di volume ogni 20 stud di distanza dall'emettitore audio. Questo emula il suono del mondo reale che diminuisce di volume man mano che ci si allontana dalla fonte.
Per ricreare l'audio 3D in loop nel file di esempio Gingerbread House - Complete Audio:
Abilita un ascoltatore predefinito che è attaccato al tuo personaggio giocatore.
- Nella finestra Explorer, seleziona SoundService.
- Nella finestra Properties, imposta DefaultListenerLocation su Character. Quando esegui il gioco, il motore crea automaticamente:
- Un AudioListener sotto il Humanoid.RootPart di ogni personaggio giocatore in modo che tu possa sentire i suoni spostarsi nei tuoi altoparlanti reali in base alla posizione e alla scala delle fonti sonore all'interno del gioco.
- Un AudioDeviceOutput sotto SoundService.
Nella finestra Explorer, naviga a Workspace ⟩ WaterfallAudioObject, quindi:
- Inserisci un oggetto AudioPlayer per creare una sorgente audio per la cascata.
- Inserisci un oggetto AudioEmitter per emettere un flusso posizionale da WaterfallAudioObject.
- Inserisci un oggetto Wire per trasportare il flusso dall'audio player all'audio emitter.

Seleziona l'AudioPlayer, quindi nella finestra Properties,
- Imposta AssetID su rbxassetid://1516791621 per riprodurre una traccia audio di pioggia.
- Abilita Looping in modo che l'audio si ripeta senza soluzione di continuità.
Seleziona l'AudioEmitter, quindi nella finestra Properties, imposta DistanceAttenuation su {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} in modo che il suono diminuisca progressivamente di volume ogni 20 stud di distanza dall'emettitore audio.
Seleziona il Wire, quindi nella finestra Properties,
- Imposta SourceInstance sul tuo nuovo AudioPlayer per specificare che desideri che il filo trasporti audio da questo specifico audio player.
- Imposta TargetInstance sul tuo nuovo AudioEmitter per specificare che desideri che il filo trasporti audio a questo specifico audio emitter all'interno della cascata.
Torna nella finestra Explorer, inserisci uno Script in WaterfallAudioObject, rinominalo LoopWaterfallMusic, imposta la sua proprietà RunContext su Client, quindi incolla il seguente codice nello script:
local audioPlayer = script.ParentaudioPlayer:Play()Spiegazione del codiceLo script inizia dichiarando una variabile per rappresentare il genitore dello script AudioPlayer. Lo script quindi imposta la sorgente audio per riprodurre dal momento in cui il giocatore entra nel gioco fino al momento in cui esce dal gioco.
Esegui un test di gioco per sentire il suono della pioggia di cioccolato in loop quando il tuo avatar è vicino alla cascata. Quando ruoti la testa del tuo personaggio per guardare in una direzione diversa, il suono si sposta dinamicamente nei tuoi altoparlanti reali in base alla posizione dell'emettitore nello spazio 3D.
Audio one shot
Audio 3D one shot, o audio direzionale che viene riprodotto una sola volta in un momento e posizione specifici a meno che un giocatore non lo attivi di nuovo, fornisce ai giocatori contesto sulle loro azioni, sull'ambiente e su eventuali personaggi intorno a loro. Utilizzare questo tipo di feedback uditivo nei tuoi giochi è essenziale perché consente ai giocatori di prendere decisioni strategiche come evitare nemici in arrivo o raccogliere oggetti utili.
Le sezioni seguenti forniscono dettagli di implementazione per scenari di gioco comuni in cui i giocatori hanno bisogno di feedback direzionale tempestivo, inclusi eventi di gioco situazionali, interazione con oggetti e dialoghi di personaggi non giocabili.
Feedback sugli eventi
Quando i giocatori attivano eventi situazionali chiave all'interno del loro ambiente, come sbloccare nuove aree di gioco o provocare il fuoco nemico, è essenziale che comprendano dove nello spazio 3D devono dirigere il loro focus e attenzione. Se non ricevono feedback uditivo immediato, potrebbero perdere informazioni importanti per il loro gameplay, portando a frustrazione per non sapere dove andare o cosa fare dopo.
Per dimostrare perché questo è importante, rivediamo l'audio 3D one shot dal template Laser Tag che viene riprodotto da ogni blaster dei giocatori:
- Un suono profondo di esplosione viene riprodotto per ogni colpo che il giocatore spara dal proprio blaster.
- Un suono di clic e un beep robotico vengono riprodotti ogni volta che il giocatore ricarica il proprio blaster con un nuovo colpo.
Entrambi questi suoni forniscono consapevolezza situazionale avvisando tutti i giocatori nelle vicinanze sulla direzione da cui provengono i colpi, in modo che possano prendere decisioni informate per unirsi al divertimento o evitare potenziali pericoli.
Il campione utilizza questa stessa tecnica per fornire ai giocatori consapevolezza situazionale riguardo alla loro ricompensa per aver completato l'obiettivo principale all'interno del gioco. Dopo aver raccolto tutte e tre le caramelle, la porta della casa di pan di zenzero si apre per consentire ai giocatori di accedere al regalo all'interno.
Poiché non c'è un ordine specifico in cui i giocatori devono raccogliere le caramelle, è importante che i giocatori siano a conoscenza dell'apertura della porta indipendentemente da quale caramella raccolgano per ultima. Il suono posizionale rende questo possibile in modo che i giocatori siano consapevoli del loro successo e di dove devono andare successivamente, indipendentemente dalla loro distanza e direzione relative dalla porta.
Per ricreare l'audio 3D one shot di feedback sugli eventi nel file di esempio Gingerbread House - Complete Audio:
Nella finestra Explorer, naviga a Workspace ⟩ Door, quindi:
- Inserisci un oggetto AudioPlayer per creare una sorgente audio per il volume.
- Inserisci un oggetto AudioEmitter per emettere un flusso posizionale da Door.
- Inserisci un oggetto Wire per trasportare il flusso dall'audio player all'audio emitter.

Seleziona l'AudioPlayer, quindi nella finestra Properties, imposta AssetID su rbxassetid://5930776613 per riprodurre una traccia audio di un cancello metallico scorrevole.
Seleziona il Wire, quindi nella finestra Properties,
- Imposta SourceInstance sul tuo nuovo AudioPlayer per specificare che desideri che il filo trasporti audio da questo specifico audio player.
- Imposta TargetInstance sul tuo nuovo AudioEmitter per specificare che desideri che il filo trasporti audio a questo specifico audio emitter all'interno del volume.
Torna nella finestra Explorer, naviga a ServerScriptService, quindi inserisci uno Script, rinominalo GumdropService, imposta la sua proprietà RunContext su Server, quindi incolla il seguente codice nello script:
-- Inizializzazione delle variabililocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local TweenService = game:GetService("TweenService")-- Modulilocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Variabililocal gumdropsFolder = Workspace.Gumdropslocal gumdrops = gumdropsFolder:GetChildren()local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAMElocal GUMDROP_AMOUNT_TO_ADD = 1local function updatePlayerGumdrops(player, updateFunction)-- Aggiorna la tabella delle caramellelocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Aggiorna la classifica delle caramelleLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Controlla se il giocatore ha raccolto tre caramelleif newGumdropAmount >= 3 then-- Riproduci l'audio dell'evento della porta quando il giocatore raccoglie tre caramellelocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- Anima la porta per muoversi verso il bassolocal 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-- Definizione del gestore dell'eventolocal function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Il giocatore ha toccato una caramellalocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Enabled", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)print("Il giocatore ha raccolto una caramella")endendend-- Impostazione dei listener degli eventifor _, gumdrop in gumdrops dogumdrop:SetAttribute("Enabled", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endSpiegazione del codiceQuesto script inizia inizializzando i servizi Workspace, Players, ServerStorage e TweenService in modo da poter fare riferimento ai loro figli e funzionalità. Quindi, richiede i moduli Leaderboard e PlayerData in ServerStorage; questi moduli sono responsabili della creazione e dell'aggiornamento di una classifica nell'angolo in alto a destra dello schermo che tiene traccia della quantità di caramelle che un giocatore raccoglie nell'ambiente.
La funzione updatePlayerGumdrops dello script è dove avviene la maggior parte del lavoro per attivare l'audio 3D per il feedback sugli eventi, e prende due argomenti:
- player - Un giocatore che raccoglie una caramella.
- updateFunction - Una funzione di callback che aggiorna la quantità di caramelle raccolte dal giocatore.
Quando un giocatore collide con una caramella, lo script:
- Ottiene il nuovo valore della quantità di caramelle raccolte dal giocatore chiamando la funzione PlayerData.updateValue.
- Aggiorna la classifica con questo nuovo importo chiamando la funzione Leaderboard.setStat.
- Controlla se l'importo è maggiore o uguale a 3.
Quando questo valore è maggiore o uguale a 3, lo script:
- Riproduce la traccia audio 3D dall'audio player all'audio emitter.
- Muove la porta linearmente 15 stud sotto la sua posizione attuale.
Il resto dello script è in gran parte responsabile di rilevare se qualcosa che collide con la caramella è un giocatore in modo da poter attivare un suono non posizionale per il feedback di raccolta. Per ulteriori informazioni su questa parte dello script, consulta Aggiungi audio 2D - Feedback di gioco.
Esegui un test di gioco per sentire il suono del cancello scorrevole dopo aver raccolto tutte e tre le caramelle nell'ambiente. Quando ruoti la telecamera, il suono si sposta dinamicamente nei tuoi altoparlanti reali in modo che tu lo senta in base alla posizione dell'emettitore nello spazio 3D.
Interazione con gli oggetti
Quando i giocatori interagiscono con oggetti 3D all'interno del loro ambiente, come accendere un interruttore o raccogliere un'arma, è importante fornire un feedback immediato in modo che comprendano intuitivamente come stanno interagendo con l'oggetto. L'abbinamento di feedback visivo e uditivo rafforza la relazione di causa ed effetto tra le azioni del giocatore e la risposta ambientale.
Per espandere questo concetto, rivediamo il seguente audio 3D one shot dal campione Plant per il flusso utente di coltivazione di un cavolo:
- Un suono delicato di tintinnio viene riprodotto quando il giocatore pianta un seme.
- Un suono di schizzo bagnato viene riprodotto quando il giocatore annaffia la propria pianta in crescita.
- Un suono di clip viene riprodotto quando il giocatore raccoglie la pianta completamente cresciuta.
- Un suono di thud morbido viene riprodotto quando il giocatore posiziona il cavolo nel carro.
Tutti questi suoni rafforzano le interazioni chiave del prompt di prossimità del giocatore con l'oggetto che cambia forma nello spazio 3D. Per i giocatori con disabilità visive in cui i cambiamenti di colore o le animazioni sono più difficili da decifrare da soli, fornire queste molteplici forme di feedback sensoriale aiuta le tue interazioni con oggetti 3D a rimanere accessibili e intuitive per il maggior numero possibile di giocatori.
Per fornire un esempio diverso di come puoi configurare l'interazione con gli oggetti con molteplici forme di feedback sensoriale, il campione fornisce sia feedback visivo che uditivo ogni volta che i giocatori calpestano il pulsante 3D di menta all'interno della casa di pan di zenzero. Quando i giocatori non interagiscono con il pulsante, appare come una tipica caramella di menta, ma quando calpestano il pulsante, il campione:
- Riproduce una traccia audio di jingle celebrativo.
- Tinge i lati del pulsante con una tonalità verde.
- Muove il pulsante nel terreno.
Da qui, puoi collegare questa interazione a tutti i tipi di azioni di gioco uniche, come sbloccare un oggetto o attivare un'abilità speciale.


Per ricreare l'audio 3D one shot di interazione con gli oggetti nel file di esempio Gingerbread House - Complete Audio:
Nella finestra Explorer, naviga a Workspace ⟩ 3DAudioButton, quindi:
- Inserisci un oggetto AudioPlayer per creare una sorgente audio per il pulsante.
- Inserisci un oggetto AudioEmitter per emettere un flusso posizionale da 3DAudioButton.
- Inserisci un oggetto Wire per trasportare il flusso dall'audio player all'audio emitter.

Seleziona l'AudioPlayer, quindi nella finestra Properties, imposta AssetID su rbxassetid://1846248593 per riprodurre una traccia audio gioiosa e celebrativa.
Seleziona il Wire, quindi nella finestra Properties,
- Imposta SourceInstance sul tuo nuovo AudioPlayer per specificare che desideri che il filo trasporti audio da questo specifico audio player.
- Imposta TargetInstance sul tuo nuovo AudioEmitter per specificare che desideri che il filo trasporti audio a questo specifico audio emitter all'interno del pulsante.
Torna nella finestra Explorer, inserisci uno Script in 3DAudioButton, rinominalo PlayAudioWhenPressed, quindi incolla il seguente codice nello 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 = {-- Premuto[true] = TweenService:Create(buttonPart, tweenInfo, {Size = buttonPart.Size / Vector3.new(2, 1, 1),Color = Color3.fromRGB(75, 151, 75),}),-- Predefinito[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)Spiegazione del codiceLo script inizia ottenendo:
- Il TweenService in modo da poter animare la parte del pulsante che sporge dal terreno.
- Il modello 3DAudioButton genitore dello script.
- La parte del pulsante che sporge dal terreno.
- L'audio player rilevante con la tua traccia audio di celebrazione.
Lo script quindi definisce:
- Un oggetto TweenInfo che specifica che l'animazione del pulsante verrà riprodotta con uno stile di animazione esponenziale.
- Due tween che rappresentano lo stato premuto o non premuto del pulsante.
- Lo stato premuto true muove leggermente il pulsante verso il basso nel terreno e tinge i lati della parte con una tonalità verde.
- Lo stato non premuto false riporta il pulsante alla sua posizione originale e rimuove la tintura precedente.
Il resto dello script è dove avviene la maggior parte del lavoro per il feedback dell'interazione con l'oggetto, quindi rivediamo come la funzione onIsPlayingChanged e i listener degli eventi lavorano insieme:
- buttonPart.Touched ascolta un giocatore che tocca il pulsante, quindi chiama la funzione Play() per iniziare a riprodurre l'audio associato dall'audio player. Questo processo cambia la proprietà AudioPlayer.IsPlaying da false a true.
- buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") ascolta il cambiamento della proprietà IsPlaying dell'audio player, quindi chiama la funzione onIsPlayingChanged.
- La funzione onIsPlayingChanged utilizza queste informazioni per attivare il tween che cambia il suo aspetto visivo nello spazio 3D.
- Per evitare che il giocatore riavvii accidentalmente l'audio se saltano rapidamente sul pulsante in rapida successione, buttonPressedAudioPlayer.Ended ascolta l'audio player per terminare la riproduzione prima di chiamare nuovamente la funzione onIsPlayingChanged.
È importante notare che l'evento onIsPlayingChanged si attiva solo quando cambia da false a true, il che significa che non si attiva quando cambia da true a false. Questo è un comportamento previsto a causa delle complicazioni con il timing della replicazione delle proprietà dal server al client. Per questo motivo, l'evento Ended è fornito e ascoltato in questo esempio per coprire entrambi i casi.
Esegui un test di gioco per sentire il suono di celebrazione quando il tuo personaggio giocatore tocca il pulsante 3D nella casa di pan di zenzero. Quando ti allontani dal pulsante, il volume del suono diminuisce.
Dialogo dei personaggi
Fornire audio direzionale dai tuoi personaggi non giocabili (NPC) è utile per guidare i giocatori verso punti di interesse all'interno del loro ambiente e aggiungere profondità alle loro interazioni con altri personaggi. Infatti, nei giochi a trama, molti designer utilizzano strategicamente il dialogo dei personaggi per insegnare indirettamente ai giocatori riguardo al loro personaggio, ai personaggi alleati e nemici, o al mondo stesso.
Esempi comuni di questa tecnica includono:
- Stile di dialogo per impostare il tono del tuo gioco.
- Banter per insegnare ai giocatori le relazioni tra i personaggi.
- Conversazioni tra nemici per confessare motivazioni o la loro posizione rispetto al giocatore.
- Personaggi giocatori che esprimono i loro pensieri ad alta voce per guidare delicatamente il giocatore su cosa dovrebbe fare dopo, come curarsi, spostarsi in un'altra posizione o trovare un oggetto.
- Personaggi alleati che parlano con il personaggio giocatore per rivelare dettagli del mondo di gioco come la sua storia, cultura e problemi sociali.
Per dimostrare come può apparire questo in pratica, rivediamo il seguente audio 3D one shot da Beyond the Dark che viene riprodotto periodicamente quando i giocatori si trovano nell'area principale della stazione spaziale.
Utilizzando la stazione spaziale come personaggio, questo clip di dialogo fornisce ai giocatori importanti contesti e lore sull'ambientazione generale. Ad esempio, da questa singola frase i giocatori apprendono:
- Si trovano nello spazio, specificamente su una stazione spaziale chiamata Kerr-Newman Deep Space Relay 14.
- Il loro ambiente è futuristico e accogliente.
- Sono visitatori e probabilmente partiranno presto.
Questi dettagli insieme immergono i giocatori nel loro ambiente e aggiungono un senso di urgenza alla loro missione. Tuttavia, se i giocatori non sanno qual è la loro missione principale, puoi anche utilizzare il dialogo dei personaggi per informare i giocatori su cosa vuoi che facciano nel tuo gioco.
Per illustrare, il campione utilizza un volume, o regione invisibile all'interno dello spazio 3D, per attivare il dialogo dei personaggi dal pupazzo di neve per guidare i giocatori a raccogliere tre caramelle per aprire la porta della sua casa. Essendo una delle prime cose che i giocatori vedono quando entrano nel gioco, è più probabile che attivino il dialogo e sappiano cosa devono fare per avere successo.

Per ricreare l'audio 3D one shot del dialogo dei personaggi nel file di esempio Gingerbread House - Complete Audio:
Nella finestra Explorer, naviga a Workspace ⟩ DialogueVolume, quindi:
- Inserisci un oggetto AudioPlayer per creare una sorgente audio per il volume.
- Inserisci un oggetto AudioEmitter per emettere un flusso posizionale da DialogueVolume.
- Inserisci un oggetto Wire per trasportare il flusso dall'audio player all'audio emitter.

Seleziona l'AudioPlayer, quindi nella finestra Properties, imposta AssetID su rbxassetid://92917410841704 per riprodurre una traccia audio istruttiva per l'obiettivo del gioco.
Seleziona il Wire, quindi nella finestra Properties,
- Imposta SourceInstance sul tuo nuovo AudioPlayer per specificare che desideri che il filo trasporti audio da questo specifico audio player.
- Imposta TargetInstance sul tuo nuovo AudioEmitter per specificare che desideri che il filo trasporti audio a questo specifico audio emitter all'interno del volume.
Torna nella finestra Explorer, naviga a StarterPlayer ⟩ StarterCharacterScripts, inserisci uno LocalScript, rinominalo PlayAudioWhenInVolume, e incolla il seguente codice nel local 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)Spiegazione del codiceQuesto script inizia ottenendo i servizi Workspace e Players in modo da poter fare riferimento ai loro figli e funzionalità. Per ogni personaggio giocatore che si carica o rinasce nel gioco, lo script attende:
- L'oggetto volume nello spazio di lavoro chiamato DialogueVolume.
Quando qualsiasi cosa collide con il volume, la funzione gestore dell'evento Touched ottiene il primo antenato che è un Model, che dovrebbe essere il personaggio se il BasePart che ha colliso con il volume è un discendente di un modello di personaggio. Se lo è, la funzione quindi:
- Imposta debounce su true.
- Riproduce e attende che l'audio finisca.
- Imposta debounce di nuovo su false.
Impostare debounce da false a true e poi di nuovo a false dopo che l'audio ha finito di riprodursi è un pattern di debounce che impedisce all'audio di attivarsi ripetutamente mentre i giocatori collidono continuamente con il volume. Per ulteriori informazioni su questo pattern di debounce, consulta Debounce - Rileva collisioni.
Esegui un test di gioco per sentire il dialogo istruttivo del personaggio quando il tuo personaggio giocatore tocca il volume attorno al pupazzo di neve.