Audio 2D è un suono non direzionale che non emette da una posizione particolare, rimanendo lo stesso indipendentemente dalla posizione o dall'orientamento di un ascoltatore nello spazio 3D. Ciò significa che mentre i giocatori muovono i loro ascoltatori nell'ambiente, possono costantemente sentire l'audio 2D da qualsiasi parte si girino.
Utilizzando il file Gingerbread House - Start .rbxl come punto di partenza e Gingerbread House - Complete Audio come riferimento, questo tutorial ti mostra come aggiungere sia audio 2D in loop che audio 2D one shot ai tuoi giochi, inclusa la guida su:
- Musica di sottofondo in loop che viene riprodotta non appena i giocatori si connettono al server.
- Attivazione dell'audio per fornire ai giocatori un feedback istantaneo in base ai loro obiettivi di gioco.
- Attivazione di vari suoni per indicare diverse interazioni dell'interfaccia utente.
Se in qualsiasi momento ti trovi bloccato nel processo, puoi utilizzare Gingerbread House - Complete Audio come riferimento per confrontare i tuoi progressi.
Oggetti audio 2D
Per creare audio non direzionale, è importante comprendere gli oggetti audio con cui lavorerai durante questo tutorial. Ci sono tre tipi principali di oggetti audio per l'audio 2D:
- L'oggetto AudioPlayer carica e riproduce il file audio.
- L'oggetto AudioDeviceOutput è un dispositivo hardware fisico nel mondo reale, come un altoparlante o delle cuffie.
- Wires trasportano i flussi audio da un oggetto all'altro.
Tutti questi oggetti audio lavorano insieme per trasmettere il suono dalla riproduzione del file all'hardware di ciascun giocatore. Diamo un'occhiata a come funziona in pratica utilizzando un esempio di un giocatore che indossa un auricolare mentre gioca con il proprio laptop:
- Il AudioPlayer carica l'ID dell'asset audio 127645268874265 nel gioco per un suono di acquisto di valuta.
- Un Wire trasporta il flusso dal AudioPlayer al AudioDeviceOutput in modo che il flusso esca dalle cuffie del giocatore.
- L'oggetto AudioDeviceOutput trasmette il suono all'altoparlante fisico del giocatore, o in questo caso, alle sue cuffie.
Le sezioni seguenti approfondiscono e fanno riferimento a questi oggetti mentre impari a riprodurre sia audio 2D in loop che audio 2D one shot. Man mano che esamini questi oggetti con le tecniche che seguiranno, puoi prevedere più accuratamente come catturare e trasmettere il suono dal gioco al giocatore.
Audio in loop
Audio 2D in loop, o audio non direzionale che si ripete senza soluzione di continuità non appena i giocatori si connettono al server, è una tecnica comune di design del suono per fornire uno sfondo uditivo coeso indipendentemente da ciò che i giocatori stanno facendo o dove si trovano nello spazio 3D. Inoltre, l'audio 2D in loop garantisce che il tuo gioco non sia mai completamente silenzioso, il che può disorientare e distrarre i giocatori dai loro obiettivi.
Per dimostrare questo concetto, rivedi come il seguente audio 2D migliora significativamente la qualità del campione Hazardous Space Station. Senza musica di sottofondo, la stazione spaziale sembra vuota e priva di vita. Tuttavia, quando la stazione spaziale include musica di sottofondo, la stazione spaziale appare sia minacciosa che pericolosa, contribuendo all'atmosfera inquietante complessiva.
L'audio in loop è particolarmente utile per stabilire come vuoi che i giocatori si sentano non appena entrano nel tuo gioco. Ad esempio, il campione mira a fornire ai giocatori un'avventura gioiosa in un paese delle meraviglie invernale, quindi utilizza una traccia audio vivace per influenzare positivamente il loro umore nel momento in cui entrano nell'ambiente. Per vedere quanto possa essere influente questa tecnica, considera come cambierebbe l'esperienza del giocatore se sostituisci l'audio in loop con una traccia metal.
Per ricreare l'audio 2D in loop nel file di esempio Gingerbread House - Complete Audio:
Abilita un ascoltatore predefinito collegato al tuo personaggio giocante.
- Nella finestra Explorer, seleziona SoundService.
- Nella finestra Properties, imposta DefaultListenerLocation su Character. Quando esegui il gioco, il motore crea automaticamente un AudioDeviceOutput sotto SoundService.
Nella finestra Explorer, naviga su SoundService, quindi:
- Inserisci un oggetto AudioPlayer per creare una sorgente audio.
- Inserisci un oggetto AudioDeviceOutput per creare un altoparlante che riproduce durante tutto il gioco.
- Inserisci un oggetto Wire per trasportare il flusso dall'audio player all'altoparlante.

Seleziona l'AudioPlayer, quindi nella finestra Properties,
- Imposta AssetID su rbxassetid://1841461968 per riprodurre una traccia audio vivace.
- Abilita Looping affinché l'audio si ripeta senza soluzione di continuità.
- Imposta Volume su 0.2 per riprodurre l'audio a un volume basso in modo da poter ancora sentire le altre sorgenti audio all'interno 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 AudioDeviceOutput per specificare che desideri che il filo trasporti audio a questo specifico altoparlante.
Torna alla finestra Explorer, inserisci uno Script in AudioPlayer, rinominalo LoopBackgroundMusic, 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 del gioco per ascoltare la musica di sottofondo in loop.
Audio one shot
Audio 2D one shot, o audio non 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 un contesto importante su qualsiasi cosa che non vuoi che perdano. Utilizzare questo tipo di feedback uditivo nei tuoi giochi è essenziale perché fornisce una risposta chiara e immediata a funzioni cruciali del gameplay e azioni dei giocatori, come l'inizio di una lotta contro un boss o la perdita di una quantità significativa di salute.
Le sezioni seguenti forniscono dettagli di implementazione per scenari di gioco comuni in cui i giocatori hanno bisogno di feedback non direzionale tempestivo, inclusi feedback di gioco, interazioni con elementi dell'interfaccia utente e narrazione vocale per tutorial.
Feedback di gioco
Man mano che i giocatori progrediscono nel tuo gioco, è importante che ricevano un feedback uditivo immediato sullo stato di qualsiasi cosa che influisca sul loro gameplay, come il punteggio, la salute o il progresso del livello. Poiché questo tipo di audio si collega direttamente agli obiettivi del giocatore, è importante che questi suoni siano chiari, udibili e trasmettano informazioni utili e accurate.
Per dimostrare questo concetto, rivediamo il seguente audio 2D one shot dal template Platformer che viene riprodotto mentre i giocatori saltano e raccolgono monete:
- Un suono d'aria che fischia viene riprodotto non appena il giocatore preme il tasto di salto sul proprio dispositivo.
- Un suono acuto di "ding" e il rumore delle monete che si muovono vengono riprodotti non appena il personaggio del giocatore tocca una moneta.
Entrambi questi suoni sono immediatamente riconoscibili nel contesto dello spazio 3D e aiutano i giocatori a comprendere il successo delle loro azioni senza fare affidamento esclusivamente su indizi visivi.
Quando riproduci più suoni contemporaneamente, alcuni suoni possono essere più importanti per i giocatori da sentire rispetto ad altri. In questo caso, il suono della raccolta delle monete sta trasmettendo informazioni di gioco più preziose rispetto al suono del salto, quindi il gioco lo riproduce a un volume leggermente più alto. Tuttavia, non ci sono standard o regole per ottenere un buon mix, quindi regola i suoni nel tuo gioco per riflettere ciò che ritieni sia più importante.
Ad esempio, il campione include vari trigger audio durante il gioco, ma non sono tutti allo stesso livello di importanza per comprendere l'obiettivo principale del gioco: raccogliere gumdrops per aprire la casa di pan di zenzero. Per garantire che i giocatori siano consapevoli di ciò che devono fare, il campione triplica l'ampiezza del feedback uditivo ogni volta che il giocatore raccoglie un gumdrop.
Per ricreare l'audio di feedback di stato one shot nel file di esempio Gingerbread House - Complete Audio:
Nella finestra Explorer, naviga su Workspace ⟩ Gumdrops ⟩ Gumdrop, quindi:
- Inserisci un oggetto AudioPlayer per creare una sorgente audio.
- Inserisci un oggetto AudioDeviceOutput per creare un altoparlante che riproduce durante tutto il gioco.
- Inserisci un oggetto Wire per trasportare il flusso dall'audio player all'altoparlante.

Seleziona l'AudioPlayer, quindi nella finestra Properties,
- Imposta AssetID su rbxassetid://9113723699 per riprodurre una traccia audio di masticazione delicata.
- Imposta TimePosition su 0.15 per avviare la traccia audio più vicino al suono reale di masticazione.
- Imposta Volume su 3 per riprodurre l'audio a un volume elevato in modo da sentire il suono del gumdrop rispetto ad altre sorgenti audio all'interno 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 AudioDeviceOutput per specificare che desideri che il filo trasporti audio a questo specifico altoparlante.
Duplica Gumdrop fino a ottenere tre gumdrops, quindi distribuiscili nell'ambiente.
Torna alla finestra Explorer, naviga su ServerScriptService, quindi inserisci uno Script, rinominalo GumdropService, imposta la sua proprietà RunContext su Server, quindi incolla il seguente codice nello script:
-- Inizializzazione dei servizilocal 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 dei gumdropslocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Aggiorna la leaderboard dei gumdropsLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Controlla se il giocatore ha raccolto tre gumdropsif newGumdropAmount >= 3 then-- Riproduci l'audio dell'evento della porta quando il giocatore raccoglie tre gumdropslocal 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("Active") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Il giocatore ha toccato un gumdroplocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Active", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)endendend-- Impostazione dei listener degli eventifor _, gumdrop in gumdrops dogumdrop:SetAttribute("Active", 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 leaderboard nell'angolo in alto a destra dello schermo che tiene traccia della quantità di gumdrops che un giocatore raccoglie nell'ambiente.
La funzione updatePlayerGumdrops dello script è in gran parte responsabile sia dell'aggiornamento della leaderboard ogni volta che un giocatore raccoglie un gumdrop, sia dell'attesa del momento in cui raccolgono tutti e tre i gumdrops in modo da poter attivare un suono posizionale e un'animazione per la porta della casa di pan di zenzero. Per ulteriori informazioni su questa parte dello script, consulta Aggiungi audio 3D - Feedback degli eventi.
La funzione onGumdropTouched dello script è dove avviene la maggior parte del lavoro per attivare l'audio 2D per il feedback di gioco, e prende due argomenti:
- otherPart - Un oggetto che collide con il gumdrop.
- gumdrop - Un oggetto sferico che rappresenta un gumdrop.
Quando qualsiasi cosa collide con il gumdrop, lo script controlla prima se il gumdrop è attivo. Se sì, verifica che l'oggetto in collisione sia un giocatore. Se sì, lo script quindi:
- Riproduce la traccia audio 2D dall'audio player.
- Rende il gumdrop invisibile.
- Disattiva il gumdrop in modo che i giocatori non possano interagire con il gumdrop invisibile.
- Aggiorna la leaderboard per il giocatore che ha toccato il gumdrop.
Infine, lo script imposta i listener degli eventi in modo che per ogni gumdrop, colleghi una funzione all'evento Touched, che chiama la funzione onGumdropTouched quando un giocatore tocca il gumdrop.
Esegui un test del gioco per ascoltare il suono di masticazione dopo aver raccolto un gumdrop.
Interazione UI
Quando i giocatori interagiscono con gli elementi della tua interfaccia utente (UI), come passare il mouse su una casella di controllo o selezionare un pulsante di acquisto, è importante fornire un feedback istantaneo in modo che comprendano intuitivamente come stanno interagendo con la tua UI. Ad esempio, molti designer cambiano le caratteristiche visive della UI quando i giocatori abilitano o disabilitano le impostazioni per comunicare lo stato della impostazione.
Tuttavia, per i giocatori con disabilità visive in cui i cambiamenti di colore o le animazioni sono più difficili da decifrare da soli, è utile fornire più forme di feedback sensoriale per le tue interazioni UI in modo che rimangano accessibili e intuitive per il maggior numero possibile di giocatori. Per espandere questo concetto, consideriamo i seguenti stati UI che sono importanti per i pulsanti di acquisto del template UGC Homestore:
- In focus - Indica che il giocatore sta evidenziando un elemento UI in preparazione per selezionarlo.
- On hover - Indica che il giocatore sta passando il mouse su un elemento UI con il cursore.
- Selected - Indica che il giocatore ha selezionato un elemento UI tramite il proprio input.
Tutte e tre queste interazioni sono essenziali per il flusso principale dell'utente del template in cui i giocatori navigano, selezionano e acquistano abbigliamento e accessori per avatar, quindi è di massima importanza che nessuno sia confuso su come interagire con la UI. Per preparare i giocatori al successo, il template fornisce sia feedback visivi che uditivi per ogni interazione UI.




Per dare un esempio di come puoi configurare più forme di feedback sensoriale, il campione fornisce sia feedback visivi che uditivi ogni volta che i giocatori premono il pulsante di menta sullo schermo. Quando i giocatori non stanno interagendo con il pulsante, appare come una tipica caramella di menta, ma quando premono il pulsante, il campione:
- Riproduce una traccia audio di jingle deliziosa.
- Tinge il pulsante con una tonalità turchese.
- Muove leggermente il pulsante verso il basso sullo schermo.
Da qui, puoi collegare questa interazione a tutti i tipi di azioni di gioco utili, come aprire un menu o acquistare un oggetto.


Per ricreare l'audio di interazione UI one shot nel file di esempio Gingerbread House - Complete Audio:
Nella finestra Explorer, naviga su StarterGui ⟩ 2DAudioButton, quindi:
- Inserisci un oggetto AudioPlayer per creare una sorgente audio.
- Inserisci un oggetto AudioDeviceOutput per creare un altoparlante che riproduce durante tutto il gioco.
- Inserisci un oggetto Wire per trasportare il flusso dall'audio player all'altoparlante.

Seleziona l'AudioPlayer, quindi nella finestra Properties, imposta AssetID su rbxassetid://3422389728 per riprodurre una traccia audio di jingle retro.
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 AudioDeviceOutput per specificare che desideri che il filo trasporti audio a questo specifico altoparlante.
Torna alla finestra Explorer, inserisci uno LocalScript in 2DAudioButton, rinominalo PlayAudioWhenPressed, quindi incolla il seguente codice nello script:
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 = {-- Premuto[true] = TweenService:Create(buttonImageButton, tweenInfo, {Position = buttonImageButton.Position + UDim2.fromScale(0, .1),ImageColor3 = Color3.fromRGB(117, 255, 255),}),-- Predefinito[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)Spiegazione del codiceLo script inizia ottenendo:
- Il TweenService in modo da poter animare gli elementi UI.
- L'oggetto 2DAudioButton ScreenGui genitore dello script.
- Il ImageButton della caramella di menta.
- L'audio player pertinente con la tua traccia audio di jingle.
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 sullo schermo e lo tinge con una tonalità turchese.
- Lo stato non premuto false riporta il pulsante alla sua posizione originale sullo schermo e rimuove la tinta precedente.
Il resto dello script è dove avviene la maggior parte del lavoro per attivare il feedback di interazione UI 2D, quindi rivediamo come la funzione onIsPlayingChanged e i listener degli eventi lavorano insieme per il flusso dell'utente UI:
- buttonImageButton.Activated ascolta un giocatore che clicca sul 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.
- buttonAudioPlayer: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 sullo schermo.
- Per evitare che il giocatore riavvii accidentalmente l'audio se clicca rapidamente sul pulsante, buttonAudioPlayer.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. A causa di ciò, l'evento Ended è fornito e ascoltato in questo esempio per coprire entrambi i casi.
Esegui un test del gioco per ascoltare il jingle ogni volta che premi il pulsante sullo schermo.