Tutoriales intermedios

Agregar audio 3D

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

El audio 3D es sonido direccional que emite desde un lugar 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 ese audio dinámicamente desde diferentes direcciones y niveles de volumen.

Utilizando 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 una sola vez a tus experiencias, incluyendo orientación sobre:

  • Sonidos ambientales en bucle que suenan 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 juego.
  • Activar audio para proporcionar retroalimentación auditiva a los jugadores cuando interactúan con objetos 3D.
  • Reproducir fragmentos sonoros 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 comprender los objetos de audio con los que trabajarás 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 transporta flujos de audio de un objeto a otro.

Todos estos objetos de audio trabajan juntos para emitir sonido de manera similar a sus contrapartes del 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 la experiencia para una pista de lluvia.
  • El AudioEmitter emite un flujo del 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 retroalimenta a su auricular.
  • 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 retroalimenta en la experiencia para el chat de voz.
Representaciones de objetos dentro de la experiencia
Representaciones de objetos en el mundo real

Las siguientes secciones profundizan y hacen referencia a estos objetos mientras aprendes cómo reproducir tanto audio 3D en bucle como de una única vez. Al revisar estos objetos con las técnicas que se vienen, podrás predecir más acertadamente cómo capturar y alimentar sonido de la experiencia 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 consistentes tus fuentes de sonido ambientales, como el estático de un televisor o el rugido de una cascada; si estos sonidos se detuvieran repentinamente, el entorno se sentiría poco realista.

Para demostrar este concepto, revisa cómo el siguiente audio 3D de dos grandes cascadas se detiene tan pronto como la pista de audio no en bucle se completa. Mientras que los sonidos de agua inicialmente sumergen a los jugadores en el entorno al aire libre, el cambio auditivo repentino es chocante y poco natural en comparación con el comportamiento de una cascada en el mundo real.

Del mismo modo, la muestra utiliza esta técnica para la cascada de chocolate fluyente y ajusta su volumen según 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 del chapoteo disminuye de volumen cada 20 studs de distancia del emisor de audio. Esto emula el sonido del mundo real que disminuye su 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:

  1. Habilita un oyente predeterminado que esté conectado a tu personaje jugador.

    1. En la ventana Explorer, selecciona SoundService.
    2. En la ventana Properties, establece DefaultListenerLocation en Character. Cuando ejecutes la experiencia, el motor automáticamente:
      • Crea un AudioListener debajo de Humanoid.RootPart de cada personaje jugador para que puedas escuchar cómo los sonidos se desplazan en los altavoces del mundo real según la posición y escala de las fuentes de sonido dentro de la experiencia.
      • Crea un AudioDeviceOutput debajo de SoundService.
  2. En la ventana Explorer, navega a WorkspaceWaterfallAudioObject, luego:

    1. Inserta un objeto AudioPlayer para crear una fuente de audio para la cascada.
    2. Inserta un objeto AudioEmitter para emitir un flujo posicional desde WaterfallAudioObject.
    3. Inserta un objeto Wire para transportar el flujo desde el reproductor de audio al emisor de audio.
  3. Selecciona el AudioPlayer, luego en la ventana Properties,

    1. Establece AssetID en rbxassetid://1516791621 para reproducir una pista de audio de lluvia.
    2. Habilita Looping para que el audio se repita sin interrupciones.
  4. 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.

  5. Selecciona el Wire, luego en la ventana Properties,

    1. Establece SourceInstance en tu nuevo AudioPlayer para especificar que deseas que el cable transporte audio desde este reproductor de audio específico.
    2. 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.
  6. De vuelta en la ventana Explorer, inserta un Script en WaterfallAudioObject, renómbralo como LoopWaterfallMusic, establece su propiedad RunContext en Client, luego pega el siguiente código en el script:


    local audioPlayer = script.Parent
    audioPlayer:Play()

    El script comienza declarando una variable para representar el AudioPlayer padre del script. Luego, el script establece la fuente de audio para que se reproduzca desde el momento en que el jugador se une a la experiencia hasta el momento en que sale de la experiencia.

  7. Realiza una prueba de la experiencia para escuchar el sonido del 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 se desplaza dinámicamente en los altavoces del mundo real de acuerdo con la posición del emisor en el espacio 3D.

Audio de una sola vez

El audio 3D de una sola vez, o audio direccional que se reproduce una sola 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 que los rodee. Usar este tipo de retroalimentación auditiva en tus experiencias es esencial porque permite a los jugadores tomar decisiones estratégicas como evitar enemigos que se acercan o recoger objetos útiles.

Las siguientes secciones proporcionan detalles de implementación para escenarios comunes de juego en los que los jugadores necesitan una 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 hacia dónde deben dirigir su enfoque y atención en el espacio 3D. Si no reciben una retroalimentación auditiva inmediata, pueden perder información que es importante para su juego, 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 una sola vez del template Laser Tag que suena desde el bláster de cada jugador:

  • Un sonido profundo de estallido suena por cada tiro que el jugador dispara desde su bláster.
  • Un sonido de clic y un pitido robótico suena 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 de la experiencia. Después de que recojan las tres galletas de jengibre, la puerta de la casa de jengibre se abre para permitir el acceso a los regalos dentro.

Debido a que no hay un orden específico en que los jugadores deben recoger las galletas de jengibre, es importante que los jugadores sean conscientes de la apertura de la puerta sin importar cuál galleta recojan al final. El sonido posicional hace esto posible para que los jugadores sean conscientes de su éxito y de adónde deben ir después, independientemente de su distancia y dirección relativa a la puerta.

Para recrear la retroalimentación de evento de audio 3D de una sola vez en el archivo de lugar de la muestra Gingerbread House - Complete Audio:

  1. En la ventana Explorer, navega a WorkspaceDoor, luego:

    1. Inserta un objeto AudioPlayer para crear una fuente de audio para el volumen.
    2. Inserta un objeto AudioEmitter para emitir un flujo posicional desde Door.
    3. Inserta un objeto Wire para transportar el flujo desde el reproductor de audio al emisor de audio.
  2. 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.

  3. Selecciona el Wire, luego en la ventana Properties,

    1. Establece SourceInstance en tu nuevo AudioPlayer para especificar que deseas que el cable transporte audio desde este reproductor de audio específico.
    2. 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.
  4. De vuelta en la ventana Explorer, navega a ServerScriptService, luego inserta un Script, renómbralo GumdropService, establece su propiedad RunContext en Server, y pega el siguiente código en el script:


    -- Inicializando variables
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local TweenService = game:GetService("TweenService")
    -- Módulos
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- Variables
    local gumdropsFolder = Workspace.Gumdrops
    local gumdrops = gumdropsFolder:GetChildren()
    local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAME
    local GUMDROP_AMOUNT_TO_ADD = 1
    local function updatePlayerGumdrops(player, updateFunction)
    -- Actualiza la tabla de galletas de jengibre
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- Actualiza la tabla de posiciones
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- Comprueba si el jugador ha recogido tres galletas de jengibre
    if newGumdropAmount >= 3 then
    -- Reproduce el audio del evento de la puerta cuando el jugador recoge tres galletas de jengibre
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- Anima la puerta para moverla hacia abajo
    local doorPart = Workspace.Door
    local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)
    local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})
    tween:Play()
    end
    end
    -- Definiendo el manejador de eventos
    local function onGumdropTouched(otherPart, gumdrop)
    if gumdrop:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- El jugador tocó una galleta de jengibre
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Enabled", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    print("Jugador recogió galleta de jengibre")
    end
    end
    end
    -- Configurando los oyentes de eventos
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Enabled", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    Este script comienza inicializando los servicios Workspace, Players, ServerStorage y TweenService para que pueda referenciar a sus hijos y funcionalidades. Luego, requiere los módulos Leaderboard y PlayerData en ServerStorage; estos módulos son responsables de crear y actualizar una tabla de posiciones en la esquina superior derecha de la pantalla que rastrea la cantidad de galletas 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 una galleta de jengibre.
    • updateFunction - Una función de devolución de llamada que actualiza la cantidad de galletas de jengibre recogidas por el jugador.

    Cuando un jugador colisiona con una galleta de jengibre, el script:

    • Obtiene el nuevo valor de la cantidad de galletas de jengibre recogidas por el jugador llamando a la función PlayerData.updateValue.
    • Actualiza la tabla de posiciones con esta nueva cantidad llamando a la función Leaderboard.setStat.
    • Comprueba 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 que cualquier cosa que colisione con la galleta de jengibre sea un jugador para que se active un sonido no posicional como retroalimentación de la recogida. Para más información sobre esta parte del script, consulta Agregar audio 2D - Retroalimentación de juego.

  5. Realiza una prueba de la experiencia para escuchar el sonido de la puerta deslizante después de recoger las tres galletas de jengibre en el entorno. Cuando gires la cámara, el sonido se desplaza dinámicamente en los 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 entiendan 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 ambiental.

Para ampliar este concepto, revisemos el siguiente audio 3D de una sola vez de la muestra Plant para el flujo del usuario de cultivar una col:

  • Un sonido suave de clic suena cuando el jugador planta una semilla.
  • Un sonido húmedo y salpiconado suena cuando el jugador riega su planta en crecimiento.
  • Un sonido de recorte suena cuando el jugador recoge la planta completamente crecida.
  • Un sonido suave de golpe suena cuando el jugador coloca la col en el carro.

Todos estos sonidos refuerzan las interacciones clave del jugador con el objeto mientras cambia de forma en el espacio 3D. Para los jugadores con discapacidades visuales, en los que los cambios de color o las animaciones son más difíciles de descifrar, 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 posible de jugadores.

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 retroalimentación visual y 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 típico dulce de menta, pero cuando pisan el botón, la muestra:

  • Reproduce una pista de audio de celebración.
  • Tinta 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 artículo o activar una habilidad especial.

Vista predeterminada
Estado presionado

Para recrear el audio 3D de interacción de objeto de una sola vez en el archivo de lugar de la muestra Gingerbread House - Complete Audio:

  1. En la ventana Explorer, navega a Workspace3DAudioButton, luego:

    1. Inserta un objeto AudioPlayer para crear una fuente de audio para el botón.
    2. Inserta un objeto AudioEmitter para emitir un flujo posicional desde 3DAudioButton.
    3. Inserta un objeto Wire para transportar el flujo desde el reproductor de audio al emisor de audio.
  2. Selecciona el AudioPlayer, luego en la ventana Properties, establece AssetID en rbxassetid://1846248593 para reproducir una pista de audio de celebración alegre.

  3. Selecciona el Wire, luego en la ventana Properties,

    1. Establece SourceInstance en tu nuevo AudioPlayer para especificar que deseas que el cable transporte audio desde este reproductor de audio específico.
    2. 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.
  4. De vuelta en la ventana Explorer, inserta un Script en 3DAudioButton, renómbralo como PlayAudioWhenPressed, luego pega el siguiente código en el script:


    local TweenService = game:GetService("TweenService")
    local buttonModel = script.Parent.Parent
    local buttonPart = buttonModel.ButtonPart
    local buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayer
    local 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.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonPart.Touched:Connect(function(_hit)
    buttonPressedAudioPlayer:Play()
    end)

    El script comienza obteniendo:

    • El TweenService para poder 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 reproducirá con un estilo de animación exponencial.
    • Dos animaciones 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 tienta los lados de la parte con un tono verde.
      • El estado no presionado false mueve el botón de regreso 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 la función onIsPlayingChanged y los oyentes de eventos trabajan juntos:

    1. 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.
    2. buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") escucha el cambio en la propiedad IsPlaying del reproductor de audio, luego llama a la función onIsPlayingChanged.
    3. La función onIsPlayingChanged utiliza esta información para activar la animación que cambia su apariencia visual en el espacio 3D.
    4. Para evitar que el jugador reinicie accidentalmente el audio si saltara rápidamente sobre el botón en rápida sucesión, buttonPressedAudioPlayer.Ended escucha cuando el reproductor de audio termina de reproducir antes de volver a llamar 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 al cambiar de true a false. Este es el comportamiento previsto debido a complicaciones con la sincronización de propiedades replicadas del servidor al cliente. Debido a esto, se proporciona y se escucha el evento Ended en este ejemplo para cubrir ambos casos.

  5. Realiza una prueba de la experiencia para escuchar el sonido de celebración cuando el personaje de tu 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 experiencias impulsadas 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 experiencia.
  • Conversaciones de personajes para enseñar a los jugadores sobre relaciones entre personajes.
  • Conversaciones de enemigos para confesar motivaciones o su posición en relación al jugador.
  • Personajes jugadores hablando en voz alta para guiar suavemente al jugador sobre lo que deberían 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 de la experiencia como su historia, cultura y problemas sociales.

Para demostrar cómo puede verse esto en la práctica, revisemos el siguiente audio 3D de una sola vez de la muestra Beyond the Dark que se reproduce periódicamente cuando los jugadores están en el área principal de la estación espacial.

Usando la estación espacial como un personaje, este clip de diálogo proporciona a los jugadores un contexto y una narrativa importantes sobre el entorno general. Por ejemplo, de esta sola 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 visitantes y probablemente se irán pronto.

Todos estos detalles sumados sumergen a los jugadores dentro de su entorno y le 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 experiencia.

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 galletas de jengibre para abrir la puerta de su hogar. Como una de las primeras cosas que los jugadores ven al unirse a la experiencia, es más probable que activen el diálogo y sepan lo que necesitan hacer para tener éxito.

El volumen alrededor del muñeco de nieve utiliza retroalimentación de colisión para reproducir audio cuando los jugadores ingresan a la región 3D.

Para recrear el audio 3D de diálogo de personajes de una sola vez en el archivo de lugar de la muestra Gingerbread House - Complete Audio:

  1. En la ventana Explorer, navega a WorkspaceDialogueVolume, luego:

    1. Inserta un objeto AudioPlayer para crear una fuente de audio para el volumen.
    2. Inserta un objeto AudioEmitter para emitir un flujo posicional desde DialogueVolume.
    3. Inserta un objeto Wire para transportar el flujo desde el reproductor de audio al emisor de audio.
  2. Selecciona el AudioPlayer, luego en la ventana Properties, establece AssetID en rbxassetid://92917410841704 para reproducir una pista de audio instructiva para el objetivo de la experiencia.

  3. Selecciona el Wire, luego en la ventana Properties,

    1. Establece SourceInstance en tu nuevo AudioPlayer para especificar que deseas que el cable transporte audio desde este reproductor de audio específico.
    2. 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.
  4. De vuelta en la ventana Explorer, navega a StarterPlayerStarterCharacterScripts, inserta un LocalScript, renómbralo como 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.DialogueVolume
    local trigger = humanoid:WaitForChild("Animator")
    local debounce = false
    local localPlayer = Players.LocalPlayer
    volumeDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
    if hitPlayer ~= localPlayer then
    return
    end
    debounce = true
    local audioPlayer = Workspace.DialogueVolume.AudioPlayer
    audioPlayer:Play()
    audioPlayer.Ended:Wait()
    debounce = false
    end)

    Este script comienza obteniendo los servicios de Workspace y Players para poder referirse a sus hijos y funcionalidades. Para cada personaje jugador que carga o renace en la experiencia, el script espera a:

    • Los objetos Humanoid y Animator del personaje.
    • El objeto volumen en el espacio de trabajo llamado DialogueVolume.

    Cuando algo colisiona con el volumen, la función del manejador de eventos Touched obtiene el primer ancestro que es un Model, que debería ser el personaje si el BasePart que colisionó con el volumen es un descendiente de un modelo de personaje. Si es así, la función:

    • Establece debounce en true.
    • Reproduce y espera a que finalice el audio.
    • Establece debounce nuevamente en false.

    Establecer debounce de false a true y luego otra vez a false después de que el audio termine de reproducirse es un patrón de debounce que evita que el audio se active repetidamente a medida que los jugadores chocan continuamente con el volumen. Para más información sobre este patrón de debounce, consulta Debounce - Detectar colisiones.

  5. Realiza una prueba de la experiencia para escuchar el diálogo de instrucción del personaje cuando tu personaje jugador toca el volumen alrededor del muñeco de nieve.

©2026 Roblox Corporation. Roblox, el logotipo de Roblox y "Powering Imagination" son algunas de nuestras marcas registradas y no registradas en los Estados Unidos y otros países.