Áudio 2D é um som não direcional que não emite de nenhum local específico, permanecendo o mesmo independentemente da posição ou orientação do ouvinte no espaço 3D. Isso significa que, à medida que os jogadores movem seus ouvintes pelo ambiente, eles podem ouvir consistentemente o áudio 2D de qualquer lugar que olhem.
Usando o arquivo Gingerbread House - Start .rbxl como ponto de partida e Gingerbread House - Complete Audio como referência, este tutorial mostra como adicionar tanto áudio 2D em loop quanto áudio 2D de um único disparo aos seus jogos, incluindo orientações sobre:
- Música de fundo em loop que toca assim que os jogadores se conectam ao servidor.
- Acionamento de áudio para fornecer feedback instantâneo aos jogadores de acordo com seus objetivos de jogo.
- Ativação de vários sons para indicar diferentes interações da interface do usuário.
Se em algum momento você ficar preso no processo, pode usar Gingerbread House - Complete Audio como referência para comparar seu progresso.
Objetos de áudio 2D
Para criar áudio não direcional, é importante entender os objetos de áudio com os quais você trabalhará ao longo deste tutorial. Existem três tipos principais de objetos de áudio para áudio 2D:
- O objeto AudioPlayer carrega e toca o arquivo de áudio.
- O objeto AudioDeviceOutput é um dispositivo de hardware físico no mundo real, como um alto-falante ou fones de ouvido.
- Wires transportam streams de áudio de um objeto para outro.
Todos esses objetos de áudio trabalham juntos para transportar som da reprodução do arquivo para o hardware de cada jogador. Vamos dar uma olhada em como isso funciona na prática usando um exemplo de um jogador usando um fone de ouvido enquanto joga em seu laptop:
- O AudioPlayer carrega o ID do ativo de áudio 127645268874265 no jogo para um som de compra de moeda.
- Um Wire transporta o stream do AudioPlayer para o AudioDeviceOutput para que o stream saia do fone de ouvido do jogador.
- O objeto AudioDeviceOutput transporta o som para o alto-falante físico do jogador, ou neste caso, seus fones de ouvido.
As seções a seguir mergulham mais fundo e fazem referência a esses objetos enquanto você aprende a tocar tanto áudio 2D em loop quanto áudio 2D de um único disparo. À medida que você revisa esses objetos com as técnicas que virão, poderá prever com mais precisão como capturar e alimentar o som do jogo para o jogador.
Áudio em loop
Áudio 2D em loop, ou áudio não direcional que se repete sem interrupções assim que os jogadores se conectam ao servidor, é uma técnica comum de design de som para fornecer um pano de fundo auditivo coeso, independentemente do que os jogadores estão fazendo ou onde estão localizados dentro do espaço 3D. Além disso, o áudio 2D em loop garante que seu jogo nunca fique completamente silencioso, o que pode desorientar e distrair os jogadores de seus objetivos.
Para demonstrar esse conceito, revise como o seguinte áudio 2D melhora significativamente a qualidade do exemplo da Estação Espacial Perigosa. Sem música de fundo, a estação espacial parece vazia e sem vida. No entanto, quando a estação espacial inclui música de fundo, ela parece tanto ominosa quanto perigosa, adicionando à atmosfera assustadora geral.
O áudio em loop é particularmente útil para estabelecer como você deseja que os jogadores se sintam assim que entrarem no seu jogo. Por exemplo, o exemplo visa proporcionar aos jogadores uma aventura alegre em um país das maravilhas de inverno, então usa uma faixa de áudio animada para influenciar positivamente seu humor no momento em que entram no ambiente. Para ver quão influente essa técnica pode ser, considere como a experiência do jogador mudaria se você substituísse o áudio em loop por uma faixa de metal.
Para recriar o áudio 2D em loop no arquivo de lugar Gingerbread House - Complete Audio:
Ative um ouvinte padrão que esteja anexado ao seu personagem jogador.
- Na janela Explorer, selecione o SoundService.
- Na janela Properties, defina DefaultListenerLocation como Character. Quando você executar o jogo, o mecanismo cria automaticamente um AudioDeviceOutput sob o SoundService.
Na janela Explorer, navegue até SoundService, então:
- Insira um objeto AudioPlayer para criar uma fonte de áudio.
- Insira um objeto AudioDeviceOutput para criar um alto-falante que toca durante todo o jogo.
- Insira um objeto Wire para transportar o stream da fonte de áudio para o alto-falante.

Selecione o AudioPlayer, então na janela Properties,
- Defina AssetID como rbxassetid://1841461968 para tocar uma faixa de áudio animada.
- Ative Looping para que o áudio se repita sem interrupções.
- Defina Volume como 0.2 para tocar o áudio em um volume baixo, de modo que você ainda possa ouvir as outras fontes de áudio dentro do jogo.
Selecione o Wire, então na janela Properties,
- Defina SourceInstance como seu novo AudioPlayer para especificar que você deseja que o fio transporte áudio deste player específico.
- Defina TargetInstance como seu novo AudioDeviceOutput para especificar que você deseja que o fio transporte áudio para este alto-falante específico.
De volta à janela Explorer, insira um Script no AudioPlayer, renomeie-o como LoopBackgroundMusic, defina sua propriedade RunContext como Client, e cole o seguinte código no script:
local audioPlayer = script.ParentaudioPlayer:Play()Explicação do códigoO script começa declarando uma variável para representar o pai do script AudioPlayer. O script então define a fonte de áudio para tocar desde o momento em que o jogador entra no jogo até o momento em que sai do jogo.
Teste o jogo para ouvir a música de fundo em loop.
Áudio de um único disparo
Áudio 2D de um único disparo, ou áudio não direcional que toca uma vez em um momento e posição específicos, a menos que um jogador o acione novamente, fornece aos jogadores um contexto importante sobre qualquer coisa que você não queira que eles percam. Usar esse tipo de feedback auditivo em seus jogos é essencial porque fornece uma resposta instantânea e clara a funções cruciais do jogo e ações dos jogadores, como iniciar uma luta contra um chefe ou perder uma quantidade significativa de saúde.
As seções a seguir fornecem detalhes de implementação para cenários comuns de jogo em que os jogadores precisam de feedback não direcional e oportuno, incluindo feedback de jogabilidade, interações de elementos da interface do usuário e narração em voz alta para tutoriais.
Feedback de jogabilidade
À medida que os jogadores progridem em seu jogo, é importante que eles recebam feedback auditivo imediato sobre o status de qualquer coisa que impacte sua jogabilidade, como sua pontuação, saúde ou progresso de nível. Como esse tipo de áudio se conecta diretamente aos objetivos do jogador, é importante que esses sons sejam claros, audíveis e transmitam informações úteis e precisas.
Para demonstrar esse conceito, vamos revisar o seguinte áudio 2D de um único disparo do template Platformer que toca quando os jogadores pulam e coletam moedas:
- Um som de whoosh arejado toca assim que o jogador pressiona a tecla de pulo em seu dispositivo.
- Um ding agudo e o som de moedas se movendo tocam assim que o personagem do jogador toca uma moeda.
Ambos os sons são instantaneamente reconhecíveis dentro do contexto do espaço 3D, e ajudam os jogadores a entender o sucesso de suas ações sem depender apenas de pistas visuais.
Quando você toca vários sons ao mesmo tempo, certos sons podem ser mais importantes para os jogadores ouvirem do que outros. Neste caso, o som de coleta de moedas está transmitindo informações de jogabilidade mais valiosas do que o som de pulo, então o jogo o toca em um volume ligeiramente mais alto. No entanto, não há padrões ou regras para alcançar uma boa mistura, então ajuste os sons em seu jogo para refletir o que você considera mais importante.
Por exemplo, o exemplo inclui vários gatilhos de áudio ao longo do jogo, mas nem todos estão no mesmo nível de importância para entender o principal objetivo do jogo: coletar gomas para abrir a casa de gengibre. Para garantir que os jogadores estejam cientes do que precisam fazer, o exemplo triplica a amplitude do feedback auditivo sempre que o jogador coleta uma goma.
Para recriar o áudio de feedback de estado de um único disparo no arquivo de lugar Gingerbread House - Complete Audio:
Na janela Explorer, navegue até Workspace ⟩ Gumdrops ⟩ Gumdrop, então:
- Insira um objeto AudioPlayer para criar uma fonte de áudio.
- Insira um objeto AudioDeviceOutput para criar um alto-falante que toca durante todo o jogo.
- Insira um objeto Wire para transportar o stream da fonte de áudio para o alto-falante.

Selecione o AudioPlayer, então na janela Properties,
- Defina AssetID como rbxassetid://9113723699 para tocar uma faixa de áudio suave de mastigação.
- Defina TimePosition como 0.15 para iniciar a faixa de áudio mais próxima do som real de mastigação.
- Defina Volume como 3 para tocar o áudio em um volume alto, de modo que você ouça o som da goma sobre outras fontes de áudio dentro do jogo.
Selecione o Wire, então na janela Properties,
- Defina SourceInstance como seu novo AudioPlayer para especificar que você deseja que o fio transporte áudio deste player específico.
- Defina TargetInstance como seu novo AudioDeviceOutput para especificar que você deseja que o fio transporte áudio para este alto-falante específico.
Duplicar Gumdrop até ter três gomas, então espalhe-as pelo ambiente.
De volta à janela Explorer, navegue até ServerScriptService, então insira um Script, renomeie-o como GumdropService, defina sua propriedade RunContext como Server, e cole o seguinte código no script:
-- Inicializando serviçoslocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local TweenService = game:GetService("TweenService")-- Móduloslocal Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)-- Variáveislocal gumdropsFolder = Workspace.Gumdropslocal gumdrops = gumdropsFolder:GetChildren()local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAMElocal GUMDROP_AMOUNT_TO_ADD = 1local function updatePlayerGumdrops(player, updateFunction)-- Atualiza a tabela de gomaslocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Atualiza o leaderboard de gomasLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Verifica se o jogador coletou três gomasif newGumdropAmount >= 3 then-- Toca o áudio do evento da porta quando o jogador coleta três gomaslocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- Anima a porta para se mover para baixolocal 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-- Definindo o manipulador de eventoslocal function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Active") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- O jogador tocou uma gomalocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Active", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)endendend-- Configurando ouvintes de eventosfor _, gumdrop in gumdrops dogumdrop:SetAttribute("Active", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endExplicação do códigoO script começa inicializando os serviços Workspace, Players, ServerStorage e TweenService para que possa referenciar seus filhos e funcionalidades. Em seguida, ele requer os módulos Leaderboard e PlayerData em ServerStorage; esses módulos são responsáveis por criar e atualizar um leaderboard no canto superior direito da tela que rastreia a quantidade de gomas que um jogador coleta no ambiente.
A função updatePlayerGumdrops do script é amplamente responsável por atualizar o leaderboard toda vez que um jogador coleta uma goma e esperar pelo momento em que eles coletam todas as três gomas para que possa acionar um som posicional e animação para a porta da casa de gengibre. Para mais informações sobre esta parte do script, veja Adicionar áudio 3D - Feedback de eventos.
A função onGumdropTouched do script é onde ocorre a maior parte do trabalho para acionar o áudio 2D para feedback de jogabilidade, e ela recebe dois argumentos:
- otherPart - Uma parte que colide com a goma.
- gumdrop - Uma parte esférica que representa uma goma.
Quando qualquer coisa colide com a parte da goma, o script verifica primeiro se a goma está ativa. Se sim, ele verifica para confirmar que o objeto colidido é um jogador. Se sim, o script então:
- Toca a faixa de áudio 2D do player de áudio.
- Torna a goma invisível.
- Desativa a goma para que os jogadores não possam interagir com a goma invisível.
- Atualiza o leaderboard para o jogador que tocou a goma.
Finalmente, o script configura ouvintes de eventos para que, para cada goma, ele conecte uma função ao evento Touched, que chama a função onGumdropTouched quando um jogador toca a goma.
Teste o jogo para ouvir o som de mastigação após coletar uma goma.
Interação da interface do usuário
Quando os jogadores interagem com seus elementos da interface do usuário (UI), como passar o mouse sobre uma caixa de seleção ou selecionar um botão de compra, é importante fornecer feedback instantâneo para que eles entendam intuitivamente como estão interagindo com sua UI. Por exemplo, muitos designers mudam as características visuais da UI quando os jogadores ativam ou desativam configurações para comunicar o status da configuração.
No entanto, para jogadores com deficiências visuais em que mudanças de cor ou animações são mais difíceis de decifrar por conta própria, é útil fornecer múltiplas formas de feedback sensorial para suas interações de UI, de modo que permaneçam acessíveis e intuitivas para o maior número possível de jogadores. Para expandir esse conceito, vamos considerar os seguintes estados da UI que são importantes para os botões de compra do template UGC Homestore:
- Em foco - Indica que o jogador está destacando um elemento da UI em preparação para selecioná-lo.
- Ao passar o mouse - Indica que o jogador está passando o mouse sobre um elemento da UI com seu cursor.
- Selecionado - Indica que o jogador selecionou um elemento da UI por meio de sua entrada.
Todas essas três interações são essenciais para o fluxo principal de usuários do template de jogadores navegando, selecionando e comprando roupas e acessórios de avatar, então é de extrema importância que ninguém fique confuso sobre como interagir com a UI. Para preparar os jogadores para o sucesso, o template fornece feedback visual e auditivo para cada interação da UI.




Para dar um exemplo de como você pode configurar múltiplas formas de feedback sensorial, o exemplo fornece tanto feedback visual quanto auditivo sempre que os jogadores pressionam o botão de hortelã na tela. Quando os jogadores não estão interagindo com o botão, ele aparece como um doce de hortelã típico, mas quando eles pressionam o botão, o exemplo:
- Toca uma faixa de áudio de jingle encantadora.
- Tinge o botão com um tom de teal.
- Move o botão ligeiramente para baixo na tela.
A partir daqui, você pode conectar essa interação a todos os tipos de ações úteis de jogabilidade, como abrir um menu ou comprar um item.


Para recriar o áudio de interação de UI de um único disparo no arquivo de lugar Gingerbread House - Complete Audio:
Na janela Explorer, navegue até StarterGui ⟩ 2DAudioButton, então:
- Insira um objeto AudioPlayer para criar uma fonte de áudio.
- Insira um objeto AudioDeviceOutput para criar um alto-falante que toca durante todo o jogo.
- Insira um objeto Wire para transportar o stream da fonte de áudio para o alto-falante.

Selecione o AudioPlayer, então na janela Properties, defina AssetID como rbxassetid://3422389728 para tocar uma faixa de áudio de jingle retrô.
Selecione o Wire, então na janela Properties,
- Defina SourceInstance como seu novo AudioPlayer para especificar que você deseja que o fio transporte áudio deste player específico.
- Defina TargetInstance como seu novo AudioDeviceOutput para especificar que você deseja que o fio transporte áudio para este alto-falante específico.
De volta à janela Explorer, insira um LocalScript no 2DAudioButton, renomeie-o como PlayAudioWhenPressed, e cole o seguinte código no 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 = {-- Pressionado[true] = TweenService:Create(buttonImageButton, tweenInfo, {Position = buttonImageButton.Position + UDim2.fromScale(0, .1),ImageColor3 = Color3.fromRGB(117, 255, 255),}),-- Padrão[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)Explicação do códigoO script começa obtendo:
- O TweenService para que possa animar elementos da UI.
- O objeto pai do script 2DAudioButton ScreenGui.
- O doce de hortelã ImageButton.
- O player de áudio relevante com sua faixa de áudio de jingle.
O script então define:
- Um objeto TweenInfo que especifica que a animação do botão será reproduzida com um estilo de animação exponencial.
- Duas animações que representam o estado pressionado ou não pressionado do botão.
- O estado pressionado true move o botão ligeiramente para baixo na tela e o tinge com um tom de teal.
- O estado não pressionado false move o botão de volta para sua posição original na tela e remove a coloração anterior.
O restante do script é onde ocorre a maior parte do trabalho para acionar o feedback de interação da UI 2D, então vamos revisar como a função onIsPlayingChanged e os ouvintes de eventos trabalham juntos para o fluxo de usuários da UI:
- buttonImageButton.Activated escuta um jogador clicar no botão, então chama a função Play() para começar a tocar o áudio associado do player de áudio. Esse processo muda a propriedade AudioPlayer.IsPlaying de false para true.
- buttonAudioPlayer:GetPropertyChangedSignal("IsPlaying") escuta a propriedade IsPlaying do player de áudio mudar, então chama a função onIsPlayingChanged.
- A função onIsPlayingChanged usa essa informação para acionar a animação que muda sua aparência visual na tela.
- Para evitar que o jogador reinicie acidentalmente o áudio se ele clicar no botão em rápida sucessão, buttonAudioPlayer.Ended escuta o player de áudio terminar de tocar antes de chamar a função onIsPlayingChanged novamente.
É importante notar que o evento onIsPlayingChanged só é acionado quando muda de false para true, o que significa que não é acionado ao mudar de true para false. Isso é um comportamento intencional devido a complicações com o tempo de replicação de propriedades do servidor para o cliente. Por causa disso, o evento Ended é fornecido e escutado neste exemplo para cobrir ambos os casos.
Teste o jogo para ouvir o jingle toda vez que você pressionar o botão na tela.