El audio 3D es sonido direccional que emite desde una ubicación particular en el espacio 3D, aumentando o disminuyendo en volumen dependiendo de la distancia y orientación entre el emisor de audio y el oyente. Esto significa que a medida que los oyentes o emisores se mueven por el entorno, los jugadores pueden escuchar dinámicamente ese audio desde diferentes direcciones y niveles de volumen.
Usando el archivo Gingerbread House - Start .rbxl como punto de partida y Gingerbread House - Complete Audio como referencia, este tutorial te muestra cómo agregar tanto audio 3D en bucle como de un solo disparo a tus juegos, incluyendo orientación sobre:
- Sonidos ambientales en bucle que se reproducen tan pronto como los jugadores se conectan al servidor.
- Activar audio para informar a los jugadores sobre eventos situacionales clave que son importantes para su jugabilidad.
- Activar audio para proporcionar retroalimentación auditiva a los jugadores cuando interactúan con objetos 3D.
- Reproducir fragmentos de sonido de personajes que involucran y guían a los jugadores hacia puntos de interés dentro de su entorno.
Si en algún momento te quedas atascado en el proceso, puedes usar Gingerbread House - Complete Audio como referencia para comparar tu progreso.
Objetos de audio
Para crear audio direccional, es importante entender los objetos de audio con los que estarás trabajando a lo largo de este tutorial. Hay seis tipos principales de objetos de audio para audio 3D:
- El objeto AudioPlayer carga y reproduce el archivo de audio.
- El objeto AudioEmitter es un altavoz virtual que emite audio en el entorno 3D.
- El objeto AudioListener es un micrófono virtual que recoge audio del entorno 3D.
- El objeto AudioDeviceOutput es un dispositivo de hardware físico en el mundo real, como un altavoz o auriculares.
- El objeto AudioDeviceInput es un micrófono físico en el mundo real.
- Wires transportan flujos de audio de un objeto a otro.
Todos estos objetos de audio trabajan juntos para emitir sonido, al igual que sus contrapartes en el mundo real. Veamos cómo funciona esto en la práctica usando un ejemplo de un jugador que usa un auricular mientras juega en su computadora portátil:
- El AudioPlayer carga el ID de activo de audio 1516791621 en el juego para una pista de lluvia.
- El AudioEmitter emite un flujo de audio de la pista de lluvia en el entorno 3D.
- Un Wire transporta el flujo desde el AudioPlayer al AudioEmitter para que el flujo salga del altavoz 3D.
- El objeto hijo AudioListener del personaje escucha ese sonido dentro del entorno 3D y lo devuelve a sus auriculares.
- El objeto AudioDeviceOutput transporta el sonido desde el AudioListener al altavoz físico del jugador, o en este caso, a sus auriculares.
- El objeto AudioDeviceInput captura sonido del mundo real y lo devuelve al juego para el chat de voz.


Las siguientes secciones profundizan más y hacen referencia a estos objetos mientras aprendes a reproducir tanto audio 3D en bucle como de un solo disparo. A medida que revises estos objetos con las técnicas que se presentarán, podrás predecir con mayor precisión cómo capturar y alimentar sonido desde el juego al jugador y viceversa.
Audio en bucle
El audio 3D en bucle, o audio direccional que se repite sin interrupciones tan pronto como los jugadores se conectan al servidor, es una técnica común de diseño de sonido para mejorar la atmósfera del espacio 3D haciéndolo sentir vivo y dinámico. Además, el audio 3D en bucle mantiene tus fuentes de sonido ambiental consistentes, como el estático de un televisor o el rugido de una cascada; si estos sonidos se detuvieran de repente, el entorno se sentiría poco realista.
Para demostrar este concepto, revisa cómo el siguiente audio 3D para dos grandes cascadas se detiene tan pronto como la pista de audio no en bucle se completa. Mientras que los sonidos del agua sumergen inicialmente a los jugadores en el entorno al aire libre, el cambio auditivo repentino es desconcertante y poco natural en comparación con cómo se comporta una cascada en el mundo real.
De manera similar, la muestra utiliza esta técnica para la cascada de chocolate fluyendo y ajusta su volumen de acuerdo con la distancia del jugador al emisor de audio. Cuando el jugador está a menos de 20 studs de distancia, el emisor emite el sonido a volumen completo. A medida que el jugador se aleja, el audio de salpicaduras disminuye en volumen cada 20 studs de distancia del emisor de audio. Esto emula el sonido del mundo real que disminuye en volumen cuanto más lejos estás de la fuente.
Para recrear el audio 3D en bucle en el archivo de lugar de la muestra Gingerbread House - Complete Audio:
Habilita un oyente predeterminado que esté adjunto a tu personaje jugador.
- En la ventana Explorer, selecciona SoundService.
- En la ventana Properties, establece DefaultListenerLocation en Character. Cuando ejecutes el juego, el motor automáticamente:
- Crea un AudioListener bajo el Humanoid.RootPart de cada personaje jugador para que puedas escuchar los sonidos cambiar en tus altavoces del mundo real de acuerdo con la posición y escala de las fuentes de sonido dentro del juego.
- Crea un AudioDeviceOutput bajo SoundService.
En la ventana Explorer, navega a Workspace ⟩ WaterfallAudioObject, luego:
- Inserta un objeto AudioPlayer para crear una fuente de audio para la cascada.
- Inserta un objeto AudioEmitter para emitir un flujo posicional desde WaterfallAudioObject.
- Inserta un objeto Wire para transportar el flujo desde el reproductor de audio al emisor de audio.

Selecciona el AudioPlayer, luego en la ventana Properties,
- Establece AssetID en rbxassetid://1516791621 para reproducir una pista de audio de lluvia.
- Habilita Looping para que el audio se repita sin interrupciones.
Selecciona el AudioEmitter, luego en la ventana Properties, establece DistanceAttenuation en {0: 1}, {20: 0.8}, {40: 0.4}, {80: 0} para que el sonido disminuya progresivamente en volumen cada 20 studs de distancia del emisor de audio.
Selecciona el Wire, luego en la ventana Properties,
- Establece SourceInstance en tu nuevo AudioPlayer para especificar que deseas que el cable transporte audio desde este reproductor de audio específico.
- Establece TargetInstance en tu nuevo AudioEmitter para especificar que deseas que el cable transporte audio a este emisor de audio específico dentro de la cascada.
De vuelta en la ventana Explorer, inserta un Script en WaterfallAudioObject, renómbralo a LoopWaterfallMusic, establece su propiedad RunContext en Client, luego pega el siguiente código en el script:
local audioPlayer = script.ParentaudioPlayer:Play()Explicación del códigoEl script comienza declarando una variable para representar el padre del script AudioPlayer. Luego, el script establece la fuente de audio para reproducirse desde el momento en que el jugador se une al juego hasta el momento en que sale del juego.
Prueba el juego para escuchar el sonido de lluvia de chocolate en bucle cuando tu avatar esté cerca de la cascada. Cuando gires la cabeza de tu personaje para mirar en una dirección diferente, el sonido cambia dinámicamente en tus altavoces del mundo real de acuerdo con la posición del emisor en el espacio 3D.
Audio de un solo disparo
El audio 3D de un solo disparo, o audio direccional que se reproduce una vez en un momento y posición específicos a menos que un jugador lo active nuevamente, proporciona a los jugadores contexto sobre sus acciones, el entorno y cualquier personaje a su alrededor. Usar este tipo de retroalimentación auditiva en tus juegos es esencial porque permite a los jugadores tomar decisiones estratégicas como evitar enemigos entrantes o recoger objetos útiles.
Las siguientes secciones proporcionan detalles de implementación para escenarios comunes de jugabilidad en los que los jugadores necesitan retroalimentación direccional oportuna, incluyendo eventos de juego situacionales, interacción con objetos y diálogos de personajes no jugables.
Retroalimentación de eventos
A medida que los jugadores activan eventos situacionales clave dentro de su entorno, como desbloquear nuevas áreas de juego o provocar fuego enemigo, es esencial que comprendan dónde en el espacio 3D necesitan dirigir su enfoque y atención. Si no reciben retroalimentación auditiva inmediata, pueden perder información que es importante para su jugabilidad, lo que lleva a la frustración por no saber a dónde ir o qué hacer a continuación.
Para demostrar por qué esto es importante, revisemos el audio 3D de un solo disparo del template Laser Tag que se reproduce desde el bláster de cada jugador:
- Un sonido profundo de explosión se reproduce por cada disparo que el jugador dispara desde su bláster.
- Un sonido de clic y un pitido robótico se reproducen cada vez que el jugador recarga su bláster con una nueva ronda.
Ambos sonidos proporcionan conciencia situacional al alertar a todos los jugadores cercanos sobre la dirección de donde provienen los disparos para que puedan tomar decisiones informadas para unirse a la diversión o evitar un peligro potencial.
La muestra utiliza esta misma técnica para proporcionar a los jugadores conciencia situacional sobre su recompensa por completar el objetivo principal dentro del juego. Después de recoger los tres caramelos de goma, la puerta de la casa de jengibre se abre para permitir a los jugadores acceder al regalo dentro.
Debido a que no hay un orden específico en el que los jugadores deben recoger los caramelos de goma, es importante que los jugadores sean conscientes de la apertura de la puerta sin importar qué caramelo de goma recojan al final. El sonido posicional hace esto posible para que los jugadores sean conscientes de su éxito y de a dónde deben ir a continuación, independientemente de su distancia y dirección relativa a la puerta.
Para recrear el audio 3D de retroalimentación de evento de un solo disparo en el archivo de lugar de la muestra Gingerbread House - Complete Audio:
En la ventana Explorer, navega a Workspace ⟩ Door, luego:
- Inserta un objeto AudioPlayer para crear una fuente de audio para el volumen.
- Inserta un objeto AudioEmitter para emitir un flujo posicional desde Door.
- Inserta un objeto Wire para transportar el flujo desde el reproductor de audio al emisor de audio.

Selecciona el AudioPlayer, luego en la ventana Properties, establece AssetID en rbxassetid://5930776613 para reproducir una pista de audio de una puerta metálica deslizante.
Selecciona el Wire, luego en la ventana Properties,
- Establece SourceInstance en tu nuevo AudioPlayer para especificar que deseas que el cable transporte audio desde este reproductor de audio específico.
- Establece TargetInstance en tu nuevo AudioEmitter para especificar que deseas que el cable transporte audio a este emisor de audio específico dentro del volumen.
De vuelta en la ventana Explorer, navega a ServerScriptService, luego inserta un Script, renómbralo a GumdropService, establece su propiedad RunContext en Server, luego pega el siguiente código en el script:
-- Inicializando variableslocal 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)-- Variableslocal gumdropsFolder = Workspace.Gumdropslocal gumdrops = gumdropsFolder:GetChildren()local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAMElocal GUMDROP_AMOUNT_TO_ADD = 1local function updatePlayerGumdrops(player, updateFunction)-- Actualizar la tabla de caramelos de gomalocal newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)-- Actualizar el leaderboard de caramelos de gomaLeaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)-- Verificar si el jugador ha recogido tres caramelos de gomaif newGumdropAmount >= 3 then-- Reproducir el audio del evento de la puerta cuando el jugador recoge tres caramelos de gomalocal audioPlayer = Workspace.Door.AudioPlayeraudioPlayer:Play()-- Animar la puerta para que se mueva hacia abajolocal 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-- Definiendo el manejador de eventoslocal function onGumdropTouched(otherPart, gumdrop)if gumdrop:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- El jugador tocó un caramelo de gomalocal audioPlayer = gumdrop.AudioPlayeraudioPlayer:Play()gumdrop.Transparency = 1gumdrop:SetAttribute("Enabled", false)updatePlayerGumdrops(player, function(oldGumdropAmount)oldGumdropAmount = oldGumdropAmount or 0return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADDend)print("El jugador recogió un caramelo de goma")endendend-- Configurando los oyentes de eventosfor _, gumdrop in gumdrops dogumdrop:SetAttribute("Enabled", true)gumdrop.Touched:Connect(function(otherPart)onGumdropTouched(otherPart, gumdrop)end)endExplicación del códigoEste script comienza inicializando los servicios Workspace, Players, ServerStorage y TweenService para que pueda hacer referencia a sus hijos y funcionalidad. Luego, requiere los módulos Leaderboard y PlayerData en ServerStorage; estos módulos son responsables de crear y actualizar un leaderboard en la esquina superior derecha de la pantalla que rastrea la cantidad de caramelos de goma que un jugador recoge en el entorno.
La función updatePlayerGumdrops del script es donde ocurre la mayor parte del trabajo para activar el audio 3D para la retroalimentación de eventos, y toma dos argumentos:
- player - Un jugador que recoge un caramelo de goma.
- updateFunction - Una función de devolución de llamada que actualiza la cantidad de caramelos de goma recogidos por el jugador.
Cuando un jugador colisiona con un caramelo de goma, el script:
- Obtiene el nuevo valor de la cantidad de caramelos de goma recogidos por el jugador llamando a la función PlayerData.updateValue.
- Actualiza el leaderboard con esta nueva cantidad llamando a la función Leaderboard.setStat.
- Verifica si la cantidad es mayor o igual a 3.
Cuando este valor es mayor o igual a 3, el script:
- Reproduce la pista de audio 3D desde el reproductor de audio al emisor de audio.
- Mueve la puerta linealmente 15 studs por debajo de su posición actual.
El resto del script se encarga principalmente de detectar si algo que colisiona con el caramelo de goma es un jugador para que pueda activar un sonido no posicional para la retroalimentación de recogida. Para más información sobre esta parte del script, consulta Agregar audio 2D - Retroalimentación de jugabilidad.
Prueba el juego para escuchar el sonido de la puerta deslizante después de recoger los tres caramelos de goma en el entorno. Cuando gires la cámara, el sonido cambia dinámicamente en tus altavoces del mundo real para que lo escuches de acuerdo con la posición del emisor en el espacio 3D.
Interacción con objetos
Cuando los jugadores interactúan con objetos 3D dentro de su entorno, como encender un interruptor de luz o recoger un arma, es importante proporcionar retroalimentación instantánea para que comprendan intuitivamente cómo están interactuando con el objeto. La combinación de retroalimentación visual y auditiva refuerza la relación de causa y efecto entre las acciones del jugador y la respuesta del entorno.
Para ampliar este concepto, revisemos el siguiente audio 3D de un solo disparo de la muestra Plant para el flujo de usuario de cultivar un repollo:
- Un sonido suave de clic se reproduce cuando el jugador planta una semilla.
- Un sonido húmedo y salpicado se reproduce cuando el jugador riega su planta en crecimiento.
- Un sonido de clip se reproduce cuando el jugador recoge la planta completamente crecida.
- Un sonido suave de golpe se reproduce cuando el jugador coloca el repollo en el carro.
Todos estos sonidos refuerzan las interacciones clave del prompt de proximidad del jugador con el objeto que cambia de forma en el espacio 3D. Para los jugadores con discapacidades visuales en las que los cambios de color o las animaciones son más difíciles de descifrar por sí solos, proporcionar estas múltiples formas de retroalimentación sensorial ayuda a que tus interacciones con objetos 3D sigan siendo accesibles e intuitivas para la mayor cantidad de jugadores posible.
Para dar un ejemplo diferente de cómo puedes configurar la interacción con objetos con múltiples formas de retroalimentación sensorial, la muestra proporciona tanto retroalimentación visual como auditiva cada vez que los jugadores pisan el botón 3D de menta dentro de la casa de jengibre. Cuando los jugadores no están interactuando con el botón, parece un caramelo de menta típico, pero cuando pisan el botón, la muestra:
- Reproduce una pista de audio de jingle celebratorio.
- Tintea los lados del botón con un tono verde.
- Mueve el botón hacia el suelo.
A partir de aquí, puedes conectar esta interacción a todo tipo de acciones de juego únicas, como desbloquear un objeto o activar una habilidad especial.


Para recrear el audio 3D de interacción de objeto de un solo disparo en el archivo de lugar de la muestra Gingerbread House - Complete Audio:
En la ventana Explorer, navega a Workspace ⟩ 3DAudioButton, luego:
- Inserta un objeto AudioPlayer para crear una fuente de audio para el botón.
- Inserta un objeto AudioEmitter para emitir un flujo posicional desde 3DAudioButton.
- Inserta un objeto Wire para transportar el flujo desde el reproductor de audio al emisor de audio.

Selecciona el AudioPlayer, luego en la ventana Properties, establece AssetID en rbxassetid://1846248593 para reproducir una pista de audio alegre y celebratoria.
Selecciona el Wire, luego en la ventana Properties,
- Establece SourceInstance en tu nuevo AudioPlayer para especificar que deseas que el cable transporte audio desde este reproductor de audio específico.
- Establece TargetInstance en tu nuevo AudioEmitter para especificar que deseas que el cable transporte audio a este emisor de audio específico dentro del botón.
De vuelta en la ventana Explorer, inserta un Script en 3DAudioButton, renómbralo a PlayAudioWhenPressed, luego pega el siguiente código en el 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 = {-- Presionado[true] = TweenService:Create(buttonPart, tweenInfo, {Size = buttonPart.Size / Vector3.new(2, 1, 1),Color = Color3.fromRGB(75, 151, 75),}),-- Predeterminado[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)Explicación del códigoEl script comienza obteniendo:
- El TweenService para que pueda animar la parte del botón que sobresale del suelo.
- El modelo 3DAudioButton padre del script.
- La parte del botón que sobresale del suelo.
- El reproductor de audio relevante con tu pista de sonido de celebración.
El script luego define:
- Un objeto TweenInfo que especifica que la animación del botón se reproducirá con un estilo de animación exponencial.
- Dos tweens que representan el estado presionado o no presionado del botón.
- El estado presionado true mueve el botón ligeramente hacia abajo en el suelo y tiñe los lados de la parte con un tono verde.
- El estado no presionado false mueve el botón de vuelta a su posición original y elimina el tinte anterior.
El resto del script es donde ocurre la mayor parte del trabajo para la retroalimentación de interacción con objetos, así que revisemos cómo funcionan juntos la función onIsPlayingChanged y los oyentes de eventos:
- buttonPart.Touched escucha a un jugador tocar el botón, luego llama a la función Play() para comenzar a reproducir el audio asociado desde el reproductor de audio. Este proceso cambia la propiedad AudioPlayer.IsPlaying de false a true.
- buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") escucha el cambio en la propiedad IsPlaying del reproductor de audio, luego llama a la función onIsPlayingChanged.
- La función onIsPlayingChanged utiliza esta información para activar el tween que cambia su apariencia visual en el espacio 3D.
- Para evitar que el jugador reinicie accidentalmente el audio si salta rápidamente sobre el botón en rápida sucesión, buttonPressedAudioPlayer.Ended escucha al reproductor de audio terminar de reproducir antes de llamar nuevamente a la función onIsPlayingChanged.
Es importante notar que el evento onIsPlayingChanged solo se activa cuando cambia de false a true, lo que significa que no se activa cuando cambia de true a false. Este es un comportamiento intencionado debido a complicaciones con el tiempo de replicación de propiedades del servidor al cliente. Debido a esto, el evento Ended se proporciona y se escucha en este ejemplo para cubrir ambos casos.
Prueba el juego para escuchar el sonido de celebración cuando tu personaje jugador toca el botón 3D en la casa de jengibre. Cuando te alejas del botón, el volumen del sonido disminuye.
Diálogo de personajes
Proporcionar audio direccional de tus personajes no jugables (NPC) es útil para guiar a los jugadores hacia puntos de interés dentro de su entorno y agregar profundidad a sus interacciones con otros personajes. De hecho, en juegos impulsados por la narrativa, muchos diseñadores utilizan estratégicamente el diálogo de personajes para enseñar indirectamente a los jugadores sobre su personaje, personajes aliados y enemigos, o el mundo en sí.
Ejemplos comunes de esta técnica incluyen:
- Estilo de diálogo para establecer el tono de tu juego.
- Bromas para enseñar a los jugadores sobre las relaciones entre personajes.
- Conversaciones de enemigos para confesar motivaciones o su posición en relación con el jugador.
- Personajes jugadores hablando en voz alta para guiar suavemente al jugador sobre lo que debería hacer a continuación, como curarse, moverse a otra ubicación o encontrar un objeto.
- Personajes aliados hablando con el personaje jugador para revelar detalles del mundo del juego como su historia, cultura y problemas sociales.
Para demostrar cómo puede verse esto en la práctica, revisemos el siguiente audio 3D de un solo disparo de Beyond the Dark que se reproduce periódicamente cuando los jugadores están en el área principal del vestíbulo de la estación espacial.
Usando la estación espacial como un personaje, este clip de diálogo proporciona a los jugadores contexto importante y lore sobre el entorno general. Por ejemplo, a partir de esta única oración, los jugadores aprenden:
- Están en el espacio exterior, específicamente en una estación espacial llamada Kerr-Newman Deep Space Relay 14.
- Su entorno es futurista y acogedor.
- Son un visitante y probablemente se irán pronto.
Estos detalles juntos sumergen a los jugadores en su entorno y añaden un sentido de urgencia a su misión. Sin embargo, si los jugadores no saben cuál es su misión principal, también puedes usar el diálogo de personajes para informar a los jugadores lo que deseas que hagan dentro de tu juego.
Para ilustrar, la muestra utiliza un volumen, o región invisible dentro del espacio 3D, para activar el diálogo de personajes del muñeco de nieve para guiar a los jugadores a recoger tres caramelos de goma para abrir la puerta de su hogar. Como una de las primeras cosas que los jugadores ven al unirse al juego, es más probable que activen el diálogo y sepan lo que necesitan hacer para tener éxito.

Para recrear el audio 3D de diálogo de personajes de un solo disparo en el archivo de lugar de la muestra Gingerbread House - Complete Audio:
En la ventana Explorer, navega a Workspace ⟩ DialogueVolume, luego:
- Inserta un objeto AudioPlayer para crear una fuente de audio para el volumen.
- Inserta un objeto AudioEmitter para emitir un flujo posicional desde DialogueVolume.
- Inserta un objeto Wire para transportar el flujo desde el reproductor de audio al emisor de audio.

Selecciona el AudioPlayer, luego en la ventana Properties, establece AssetID en rbxassetid://92917410841704 para reproducir una pista de audio instructiva para el objetivo del juego.
Selecciona el Wire, luego en la ventana Properties,
- Establece SourceInstance en tu nuevo AudioPlayer para especificar que deseas que el cable transporte audio desde este reproductor de audio específico.
- Establece TargetInstance en tu nuevo AudioEmitter para especificar que deseas que el cable transporte audio a este emisor de audio específico dentro del volumen.
De vuelta en la ventana Explorer, navega a StarterPlayer ⟩ StarterCharacterScripts, inserta un LocalScript, renómbralo a PlayAudioWhenInVolume, y pega el siguiente código en el script local:
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)Explicación del códigoEste script comienza obteniendo los servicios Workspace y Players para que pueda hacer referencia a sus hijos y funcionalidad. Para cada personaje jugador que carga o reaparece en el juego, el script espera por:
- El objeto de volumen en el espacio de trabajo llamado DialogueVolume.
Cuando algo colisiona con el volumen, la función manejadora del evento Touched obtiene el primer ancestro que es un Model, que debería ser el personaje si la BasePart que colisionó con el volumen es un descendiente de un modelo de personaje. Si lo es, la función entonces:
- Establece debounce en true.
- Reproduce y espera que el audio termine.
- Establece debounce de nuevo en false.
Establecer debounce de false a true y luego de nuevo a false después de que el audio termine de reproducirse es un patrón de debounce que previene que el audio se active repetidamente a medida que los jugadores colisionan continuamente con el volumen. Para más información sobre este patrón de debounce, consulta Debounce - Detectar colisiones.
Prueba el juego para escuchar el diálogo instructivo del personaje cuando tu personaje jugador toca el volumen alrededor del muñeco de nieve.