Áudio 3D é um som direcional que emite de uma localização específica no espaço 3D, aumentando ou diminuindo de volume dependendo da distância e orientação entre o emissor de áudio e o ouvinte. Isso significa que, à medida que ouvintes ou emissores se movem pelo ambiente, os jogadores podem ouvir dinamicamente esse áudio de diferentes direções e níveis de volume.
Usando o arquivo Gingerbread House - Start .rbxl como ponto de partida e Gingerbread House - Complete Audio como referência, este tutorial mostra como adicionar áudio 3D tanto em loop quanto em um único disparo aos seus jogos, incluindo orientações sobre:
- Sons ambientais em loop que tocam assim que os jogadores se conectam ao servidor.
- Acionamento de áudio para informar os jogadores sobre eventos situacionais importantes para seu jogo.
- Ativação de áudio para fornecer feedback auditivo aos jogadores quando interagem com objetos 3D.
- Reprodução de trechos sonoros de personagens que envolvem e guiam os jogadores em direção a pontos de interesse dentro de seu ambiente.
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
Para criar áudio direcional, é importante entender os objetos de áudio com os quais você trabalhará ao longo deste tutorial. Existem seis tipos principais de objetos de áudio para áudio 3D:
- O objeto AudioPlayer carrega e reproduz o arquivo de áudio.
- O objeto AudioEmitter é um alto-falante virtual que emite áudio no ambiente 3D.
- O objeto AudioListener é um microfone virtual que capta áudio do ambiente 3D.
- O objeto AudioDeviceOutput é um dispositivo de hardware físico no mundo real, como um alto-falante ou fones de ouvido.
- O objeto AudioDeviceInput é um microfone físico no mundo real.
- Wires transportam streams de áudio de um objeto para outro.
Todos esses objetos de áudio trabalham juntos para emitir som, assim como seus equivalentes do mundo real. 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 1516791621 no jogo para uma faixa de chuva.
- O AudioEmitter emite um stream do áudio da faixa de chuva no ambiente 3D.
- Um Wire transporta o stream do AudioPlayer para o AudioEmitter para que o stream saia do alto-falante 3D.
- O objeto filho AudioListener do personagem ouve esse som dentro do ambiente 3D e o retransmite para seu fone de ouvido.
- O objeto AudioDeviceOutput transporta o som do AudioListener para o alto-falante físico do jogador, ou neste caso, seus fones de ouvido.
- O objeto AudioDeviceInput captura som do mundo real e o retransmite para o jogo para bate-papo por voz.


As seções a seguir se aprofundam e referenciam esses objetos enquanto você aprende a reproduzir tanto áudio 3D em loop quanto em um único disparo. Ao revisar esses objetos com as técnicas que virão, você poderá prever com mais precisão como capturar e retransmitir som do jogo para o jogador e vice-versa.
Áudio em loop
Áudio 3D em loop, ou áudio direcional que se repete sem interrupções assim que os jogadores se conectam ao servidor, é uma técnica comum de design de som para melhorar a atmosfera do espaço 3D, fazendo-o parecer vivo e dinâmico. Além disso, o áudio 3D em loop mantém suas fontes de som ambiental consistentes, como o chiado de uma televisão ou o rugido de uma cachoeira; se esses sons parassem de repente, o ambiente pareceria irrealista.
Para demonstrar esse conceito, revise como o seguinte áudio 3D para duas grandes cascatas para de tocar assim que a faixa de áudio não em loop é concluída. Enquanto os sons da água inicialmente imergem os jogadores no ambiente externo, a mudança auditiva repentina é chocante e não natural em relação ao comportamento de uma cachoeira no mundo real.
Da mesma forma, o exemplo usa essa técnica para a cachoeira de chocolate fluindo e ajusta seu volume de acordo com a distância do jogador em relação ao emissor de áudio. Quando o jogador está a menos de 20 studs de distância, o emissor emite o som em volume total. À medida que o jogador se afasta, o áudio do respingo diminui de volume a cada 20 studs de distância do emissor de áudio. Isso emula o som do mundo real que diminui de volume quanto mais longe você está da fonte.
Para recriar o áudio 3D 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 automaticamente:
- Cria um AudioListener sob a Humanoid.RootPart de cada personagem jogador para que você possa ouvir os sons mudarem em seus alto-falantes do mundo real de acordo com a posição e escala das fontes de som dentro do jogo.
- Cria um AudioDeviceOutput sob o SoundService.
Na janela Explorer, navegue até Workspace ⟩ WaterfallAudioObject, então:
- Insira um objeto AudioPlayer para criar uma fonte de áudio para a cachoeira.
- Insira um objeto AudioEmitter para emitir um stream posicional de WaterfallAudioObject.
- Insira um objeto Wire para transportar o stream do player de áudio para o emissor de áudio.

Selecione o AudioPlayer, então na janela Properties,
- Defina AssetID como rbxassetid://1516791621 para tocar uma faixa de áudio de chuva.
- Ative Looping para que o áudio se repita sem interrupções.
Selecione o AudioEmitter, então na janela Properties, defina DistanceAttenuation como {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} para que o som diminua progressivamente de volume a cada 20 studs de distância do emissor de áudio.
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 de áudio específico.
- Defina TargetInstance como seu novo AudioEmitter para especificar que você deseja que o fio transporte áudio para este emissor de áudio específico dentro da cachoeira.
De volta à janela Explorer, insira um Script em WaterfallAudioObject, renomeie-o para LoopWaterfallMusic, 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 ele sai do jogo.
Teste o jogo para ouvir o som da chuva de chocolate em loop quando seu avatar estiver perto da cachoeira. Quando você gira a cabeça do seu personagem para olhar em uma direção diferente, o som muda dinamicamente em seus alto-falantes do mundo real de acordo com a posição do emissor no espaço 3D.
Áudio de um único disparo
Áudio 3D de um único disparo, ou áudio direcional que toca uma vez em um momento e posição específicos, a menos que um jogador o acione novamente, fornece aos jogadores contexto sobre suas ações, o ambiente e quaisquer personagens ao seu redor. Usar esse tipo de feedback auditivo em seus jogos é essencial porque permite que os jogadores tomem decisões estratégicas, como evitar inimigos que se aproximam ou pegar itens úteis.
As seções a seguir fornecem detalhes de implementação para cenários comuns de jogabilidade nos quais os jogadores precisam de feedback direcional e oportuno, incluindo eventos de jogabilidade situacionais, interação com objetos e diálogos de personagens não jogáveis.
Feedback de eventos
À medida que os jogadores acionam eventos situacionais importantes dentro de seu ambiente, como desbloquear novas áreas de jogabilidade ou provocar fogo inimigo, é essencial que eles entendam onde no espaço 3D precisam direcionar seu foco e atenção. Se não receberem feedback auditivo imediato, podem perder informações que são importantes para sua jogabilidade, levando à frustração por não saberem para onde ir ou o que fazer a seguir.
Para demonstrar por que isso é importante, vamos revisar o áudio 3D de um único disparo do template Laser Tag que toca de cada blaster dos jogadores:
- Um som profundo de estalo toca para cada disparo que o jogador faz com seu blaster.
- Um som de clique e bip robótico toca cada vez que o jogador recarrega seu blaster com uma nova rodada.
Ambos os sons fornecem consciência situacional, alertando todos os jogadores próximos sobre a direção de onde os disparos estão vindo, para que possam tomar decisões informadas para se juntar à diversão ou evitar perigos potenciais.
O exemplo usa essa mesma técnica para fornecer aos jogadores consciência situacional sobre sua recompensa por completar o objetivo principal dentro do jogo. Depois de coletarem todos os três gumballs, a porta da casa de gengibre se abre para permitir que os jogadores acessem o presente dentro.
Como não há uma ordem específica em que os jogadores precisam coletar os gumballs, é importante que os jogadores estejam cientes da abertura da porta, independentemente de qual gumball coletarem por último. O som posicional torna isso possível para que os jogadores estejam cientes de seu sucesso e de onde precisam ir a seguir, independentemente de sua distância e direção relativas em relação à porta.
Para recriar o feedback de evento de áudio 3D de um único disparo no arquivo de lugar Gingerbread House - Complete Audio:
Na janela Explorer, navegue até Workspace ⟩ Door, então:
- Insira um objeto AudioPlayer para criar uma fonte de áudio para o volume.
- Insira um objeto AudioEmitter para emitir um stream posicional de Door.
- Insira um objeto Wire para transportar o stream do player de áudio para o emissor de áudio.

Selecione o AudioPlayer, então na janela Properties, defina AssetID como rbxassetid://5930776613 para tocar uma faixa de áudio de portão de metal deslizante.
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 de áudio específico.
- Defina TargetInstance como seu novo AudioEmitter para especificar que você deseja que o fio transporte áudio para este emissor de áudio específico dentro do volume.
De volta à janela Explorer, navegue até ServerScriptService, então insira um Script, renomeie-o para GumdropService, defina sua propriedade RunContext como Server, e cole o seguinte código no script:
-- Inicializando variáveislocal 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 gumballslocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Atualiza o leaderboard de gumballsLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Verifica se o jogador coletou três gumballsif newGumdropAmount >= 3 then-- Toca o áudio do evento da porta quando o jogador coleta três gumballslocal 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("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- O jogador tocou um gumballlocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Enabled", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)print("Jogador coletou gumball")endendend-- Configurando ouvintes de eventosfor _, gumdrop in gumdrops dogumdrop:SetAttribute("Enabled", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endExplicação do códigoEste 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 gumballs que um jogador coleta no ambiente.
A função updatePlayerGumdrops do script é onde ocorre a maior parte do trabalho para acionar o áudio 3D para feedback de eventos, e ela recebe dois argumentos:
- player - Um jogador que coleta um gumball.
- updateFunction - Uma função de callback que atualiza a quantidade de gumballs coletados pelo jogador.
Quando um jogador colide com um gumball, o script:
- Obtém o novo valor da quantidade de gumballs coletados pelo jogador chamando a função PlayerData.updateValue.
- Atualiza o leaderboard com essa nova quantidade chamando a função Leaderboard.setStat.
- Verifica se a quantidade é maior ou igual a 3.
Quando esse valor é maior ou igual a 3, o script:
- Toca a faixa de áudio 3D do player de áudio para o emissor de áudio.
- Move a porta linearmente 15 studs abaixo de sua posição atual.
O restante do script é em grande parte responsável por detectar se algo que colide com o gumball é um jogador, para que possa acionar um som não posicional para feedback de coleta. Para mais informações sobre essa parte do script, veja Adicionar áudio 2D - Feedback de jogabilidade.
Teste o jogo para ouvir o som do portão deslizante após coletar todos os três gumballs no ambiente. Quando você gira a câmera, o som muda dinamicamente em seus alto-falantes do mundo real para que você o ouça de acordo com a posição do emissor no espaço 3D.
Interação com objetos
Quando os jogadores interagem com objetos 3D dentro de seu ambiente, como ligar um interruptor ou pegar uma arma, é importante fornecer feedback instantâneo para que eles entendam intuitivamente como estão interagindo com o objeto. A combinação de feedback visual e auditivo reforça a relação de causa e efeito entre as ações do jogador e a resposta do ambiente.
Para expandir esse conceito, vamos revisar o seguinte áudio 3D de um único disparo do exemplo Plant para o fluxo do usuário de jardinagem de um repolho:
- Um som suave de clique toca quando o jogador planta uma semente.
- Um som molhado, semelhante a um splash, toca quando o jogador rega sua planta em crescimento.
- Um som de corte toca quando o jogador coleta a planta totalmente crescida.
- Um som suave de batida toca quando o jogador coloca o repolho na carroça.
Todos esses sons reforçam as interações-chave do jogador com o objeto que mudam de forma no espaço 3D. 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, fornecer essas múltiplas formas de feedback sensorial ajuda suas interações com objetos 3D a permanecerem acessíveis e intuitivas para o maior número possível de jogadores.
Para dar um exemplo diferente de como você pode configurar a interação com objetos com múltiplas formas de feedback sensorial, o exemplo fornece tanto feedback visual quanto auditivo sempre que os jogadores pisam no botão 3D de menta dentro da casa de gengibre. Quando os jogadores não estão interagindo com o botão, ele aparece como um doce de menta típico, mas quando pisam no botão, o exemplo:
- Toca uma faixa de áudio de jingle de celebração.
- Tinge as laterais do botão com um tom verde.
- Move o botão para dentro do chão.
A partir daqui, você pode conectar essa interação a todos os tipos de ações de jogabilidade únicas, como desbloquear um item ou acionar uma habilidade especial.


Para recriar o áudio 3D de interação de objeto de um único disparo no arquivo de lugar Gingerbread House - Complete Audio:
Na janela Explorer, navegue até Workspace ⟩ 3DAudioButton, então:
- Insira um objeto AudioPlayer para criar uma fonte de áudio para o botão.
- Insira um objeto AudioEmitter para emitir um stream posicional de 3DAudioButton.
- Insira um objeto Wire para transportar o stream do player de áudio para o emissor de áudio.

Selecione o AudioPlayer, então na janela Properties, defina AssetID como rbxassetid://1846248593 para tocar uma faixa de áudio alegre e celebratória.
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 de áudio específico.
- Defina TargetInstance como seu novo AudioEmitter para especificar que você deseja que o fio transporte áudio para este emissor de áudio específico dentro do botão.
De volta à janela Explorer, insira um Script em 3DAudioButton, renomeie-o para PlayAudioWhenPressed, e cole o seguinte código no 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 = {-- Pressionado[true] = TweenService:Create(buttonPart, tweenInfo, {Size = buttonPart.Size / Vector3.new(2, 1, 1),Color = Color3.fromRGB(75, 151, 75),}),-- Padrão[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)Explicação do códigoO script começa obtendo:
- O TweenService para que possa animar a parte do botão que se destaca do chão.
- O modelo pai do script 3DAudioButton.
- A parte do botão que se destaca do chão.
- O player de áudio relevante com sua faixa de áudio de celebração.
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 no chão e tinge as laterais da parte com um tom verde.
- O estado não pressionado false move o botão de volta para sua posição original e remove a coloração anterior.
O restante do script é onde ocorre a maior parte do trabalho para feedback de interação com objetos, então vamos revisar como a função onIsPlayingChanged e os ouvintes de eventos trabalham juntos:
- buttonPart.Touched escuta um jogador tocar o 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.
- buttonPressedAudioPlayer: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 no espaço 3D.
- Para evitar que o jogador reinicie acidentalmente o áudio se ele pular rapidamente no botão em rápida sucessão, buttonPressedAudioPlayer.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 som de celebração quando seu personagem jogador toca o botão 3D na casa de gengibre. Quando você se afasta do botão, o volume do som diminui.
Diálogo de personagens
Fornecer áudio direcional de seus personagens não jogáveis (NPC) é útil para guiar os jogadores em direção a pontos de interesse dentro de seu ambiente e adicionar profundidade às suas interações com outros personagens. De fato, em jogos orientados por narrativa, muitos designers usam estrategicamente o diálogo dos personagens para ensinar indiretamente aos jogadores sobre seu personagem, aliados e inimigos, ou o mundo em si.
Exemplos comuns dessa técnica incluem:
- Estilo de diálogo para definir o tom do seu jogo.
- Conversas para ensinar aos jogadores sobre relacionamentos entre personagens.
- Conversas de inimigos para confessar motivações ou sua posição em relação ao jogador.
- Personagens jogadores falando seus pensamentos em voz alta para guiar suavemente o jogador sobre o que ele deve fazer a seguir, como se curar, se mover para outro local ou encontrar um item.
- Personagens aliados conversando com o personagem jogador para revelar detalhes do mundo do jogo, como sua história, cultura e questões sociais.
Para demonstrar como isso pode parecer na prática, vamos revisar o seguinte áudio 3D de um único disparo da vitrine Beyond the Dark que toca periodicamente quando os jogadores estão na área principal do saguão da estação espacial.
Usando a estação espacial como um personagem, esse clipe de diálogo fornece aos jogadores contexto e lore importantes sobre o cenário geral. Por exemplo, a partir desta única frase, os jogadores aprendem:
- Eles estão no espaço exterior, especificamente em uma estação espacial chamada Kerr-Newman Deep Space Relay 14.
- Seu ambiente é futurista e acolhedor.
- Eles são visitantes e provavelmente deixarão em breve.
Esses detalhes juntos imergem os jogadores em seu ambiente e adicionam um senso de urgência à sua missão. No entanto, se os jogadores não souberem qual é sua missão principal, você também pode usar o diálogo dos personagens para informar os jogadores o que você deseja que eles façam dentro do seu jogo.
Para ilustrar, o exemplo usa um volume, ou região invisível dentro do espaço 3D, para acionar o diálogo do personagem do boneco de neve para guiar os jogadores a coletar três gumballs a fim de abrir a porta de sua casa. Como uma das primeiras coisas que os jogadores veem ao entrar no jogo, é mais provável que os jogadores acionem o diálogo e saibam o que precisam fazer para ter sucesso.

Para recriar o áudio 3D de diálogo de um único disparo no arquivo de lugar Gingerbread House - Complete Audio:
Na janela Explorer, navegue até Workspace ⟩ DialogueVolume, então:
- Insira um objeto AudioPlayer para criar uma fonte de áudio para o volume.
- Insira um objeto AudioEmitter para emitir um stream posicional de DialogueVolume.
- Insira um objeto Wire para transportar o stream do player de áudio para o emissor de áudio.

Selecione o AudioPlayer, então na janela Properties, defina AssetID como rbxassetid://92917410841704 para tocar uma faixa de áudio instrucional para o objetivo 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 de áudio específico.
- Defina TargetInstance como seu novo AudioEmitter para especificar que você deseja que o fio transporte áudio para este emissor de áudio específico dentro do volume.
De volta à janela Explorer, navegue até StarterPlayer ⟩ StarterCharacterScripts, insira um LocalScript, renomeie-o para PlayAudioWhenInVolume, e cole o seguinte código no 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)Explicação do códigoEste script começa obtendo os serviços Workspace e Players para que possa referenciar seus filhos e funcionalidades. Para cada personagem jogador que carrega ou renasce no jogo, o script espera por:
- O objeto de volume no workspace chamado DialogueVolume.
Quando qualquer coisa colide com o volume, a função manipuladora de eventos Touched obtém o primeiro ancestral que é um Model, que deve ser o personagem se a BasePart que colidiu com o volume for um descendente de um modelo de personagem. Se for, a função então:
- Define debounce como true.
- Toca e espera o áudio terminar.
- Define debounce de volta para false.
Definir debounce de false para true e depois de volta para false após o áudio terminar de tocar é um padrão de debounce que impede que o áudio seja acionado repetidamente à medida que os jogadores colidem continuamente com o volume. Para mais informações sobre esse padrão de debounce, veja Debounce - Detectar colisões.
Teste o jogo para ouvir o diálogo instrucional do personagem quando seu personagem jogador toca o volume ao redor do boneco de neve.