En esta sección, se mostrará cómo configurar efectos de sonido, como diálogos de reacción, efectos visuales y oscilaciones de la cámara, para crear un juego atrapante.
Dispositivo Reproductor de audio
Puedes usar el dispositivo Reproductor de audio para establecer líneas de diálogo de uso de los guardias. En el desarrollo de juegos, suelen denominarse barks, que podría entenderse como diálogos de reacción.

Puedes encontrar el audio importado en "Carpeta del proyecto" > Diálogos de reacción. Haz clic en el ícono Reproducir para escuchar el archivo de audio y, a continuación, arrástralo y suéltalo en tu isla.

Al soltar un archivo de audio en tu isla, se colocará un dispositivo Reproductor de audio, que se conecta a un dispositivo de Verse para reproducir una serie de llamadas de la guardia de fronteras. Estas llamadas reaccionan a diferentes eventos, como ver al jugador o recibir daño.
Coloca un Reproductor de audio por cada pieza única de audio que quieras reproducir. En este tutorial, se utilizan 14 diálogos de reacción diferentes, con 14 dispositivos Reproductor de audio diferentes colocados.
Para configurar estos dispositivos, personaliza la siguiente configuración:

Opción | Valor | Explicación |
---|---|---|
Volumen | 4.0 | Esta configuración puede variar en función de la grabación. |
Reiniciar audio cuando se active | Verdadero | Este audio se reproducirá desde el principio cuando se active. |
Reproducir al golpear | Falso | Este dispositivo no reproducirá audio cuando lo golpee un jugador. |
Ubicación de juego | Jugador instigador | El audio se reproducirá en función de la ubicación del jugador instigador en lugar de en función de la ubicación del dispositivo. |
Habilitar atenuación de volumen | Falso | Cambia el volumen en función de la distancia del dispositivo o del guardia configurados para reproducirlo. Para este tutorial, el jugador puede oír el audio aunque esté lejos. |
A continuación, configura la secuencia de comandos de Verse para controlar la lógica de activación de los dispositivos Reproductor de audio durante el juego y, a continuación, coloca el dispositivo de Verse. Para este tutorial, el dispositivo se llama Administrador de diálogos de reacción de Fortaleza.
Pega la siguiente secuencia de comandos de Verse.
using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }
using { /Fortnite.com/Characters }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
# Audio de diálogo de reacción que puede reproducir un PNJ
audio_npc_bark := class<concrete>:
# Dispositivo de audio para reproducir diálogos de reacción
@editable
BarkDevice:audio_player_device := audio_player_device{}
# Opción para permitir que los PNJ repitan el diálogo de reacción
@editable
CanRepeat:logic = true
# Espera entre el evento y el comienzo del diálogo de reacción
@editable
Delay:float = 0.0
# Espera antes de repetir el diálogo de reacción
@editable
Cooldown:float = 5.0
# Nombre del diálogo de reacción para iniciar sesión
@editable
BarkID:string = "Missing ID"
# Transcurrió el temporizador del tiempo de reutilización
var<private> IsInCooldown:logic = false
# Evento para detener el diálogo de reacción
StopBarkEvent<private>:event() = event(){}
PlayBark(Agent:agent)<suspends>:void=
var IsPlaying:logic = false;
defer:
if (IsPlaying?):
set IsPlaying = false
set IsInCooldown = false
BarkDevice.Stop(Agent)
race:
block:
StopBarkEvent.Await()
return
block:
AwaitAgentDown(Agent)
return
block:
if (Delay > 0.0):
Sleep(Delay)
if (IsInCooldown?):
return
BarkDevice.Play(Agent)
set IsPlaying = true
set IsInCooldown = true
Sleep(2.0)
set IsPlaying = false
if (CanRepeat?):
Sleep(Cooldown)
set IsInCooldown = false
StopBark():void=
StopBarkEvent.Signal()
AwaitAgentDown<private>(Agent:agent)<suspends>:void=
if (Character := Agent.GetFortCharacter[]):
loop:
if (Character.GetHealth() <= 0.0):
return
Character.DamagedEvent().Await()
# Secuencia de comandos que controla los diálogos de reacción de los guardias
stronghold_bark_manager := class(creative_device):
# Referencia al Administrador de juego para monitorear los eventos de percepción
@editable
StrongholdGameManager:stronghold_game_manager := stronghold_game_manager{}
# Dispositivos Reproductores de audio
@editable
BarkNPCDown:audio_npc_bark = audio_npc_bark{BarkID := "Man Down", Delay := 0.3}
@editable
BarkFallback:audio_npc_bark = audio_npc_bark{BarkID := "Fallback", CanRepeat := false, Delay := 3.0}
@editable
BarkNeedBackup:audio_npc_bark = audio_npc_bark{BarkID := "Need Backup", CanRepeat := false, Delay := 2.0}
@editable
BarkGoToLeash:audio_npc_bark = audio_npc_bark{BarkID := "Reinforcements En Route", CanRepeat := false, Delay := 4.0}
@editable
BarkDamageTaken:audio_npc_bark = audio_npc_bark{BarkID := "Took Damage", Delay := 0.2}
@editable
BarkDamagePlayer:audio_npc_bark = audio_npc_bark{BarkID := "Hit Player", Delay := 0.2}
@editable
BarkEliminatedPlayer:audio_npc_bark = audio_npc_bark{BarkID := "Eliminated Player", Delay := 0.3}
@editable
BarkPlayerSpotted:audio_npc_bark = audio_npc_bark{BarkID := "Spotted Player", CanRepeat := false}
@editable
BarkPlayerLost:audio_npc_bark = audio_npc_bark{BarkID := "Lost Player", Cooldown := 10.0}
@editable
BarkGuardSuspicious:audio_npc_bark = audio_npc_bark{BarkID := "Suspicious", Cooldown := 10.0}
@editable
BarkGuardUnaware:audio_npc_bark = audio_npc_bark{BarkID := "Unaware", Cooldown := 10.0}
# Variable para almacenar si los guardias estuvieran buscando objetivos
var<private> HasLostTarget:logic := false
# Se ejecuta cuando el dispositivo se inicia en un juego en ejecución
OnBegin<override>()<suspends>:void=
ConfigureBarks()
sync:
AwaitReinforcements()
AwaitFallback()
PlayAwarenessBarks()
PlayBark(Bark:audio_npc_bark, Guard:agent):void=
spawn {Bark.PlayBark(Guard)}
# Reproduce un diálogo de reacción cuando se llama a un refuerzo
AwaitReinforcements<private>()<suspends>:void=
AlertedGuard := StrongholdGameManager.ReinforcementsCalledEvent.Await()
PlayBark(BarkNeedBackup, AlertedGuard)
# Reproduce un diálogo de reacción cuando los guardias se reagrupan en la fortaleza
AwaitFallback<private>()<suspends>:void=
StrongholdGameManager.FallbackEvent.Await()
if:
Guard := StrongholdGameManager.AlertedGuards[0]
then:
PlayBark(BarkFallback, Guard)
PlayAwarenessBarks<private>()<suspends>:void=
loop:
race:
PlayGuardsSuspiciousBark()
PlayPlayerSpottedBark()
PlayPlayerLostBark()
PlayGuardsUnawareBark()
PlayPlayerSpottedBark<private>()<suspends>:void=
Guard:=StrongholdGameManager.PlayerDetectedEvent.Await();
set HasLostTarget = false
PlayBark(BarkPlayerSpotted, Guard)
PlayPlayerLostBark<private>()<suspends>:void=
Guard:=StrongholdGameManager.PlayerLostEvent.Await();
set HasLostTarget = true
PlayBark(BarkPlayerLost, Guard)
PlayGuardsSuspiciousBark<private>()<suspends>:void=
Guard:=StrongholdGameManager.GuardsSuspiciousEvent.Await();
PlayBark(BarkGuardSuspicious, Guard)
PlayGuardsUnawareBark<private>()<suspends>:void=
Guard:=StrongholdGameManager.GuardsUnawareEvent.Await();
if (HasLostTarget?):
set HasLostTarget = false
if (not StrongholdGameManager.FallbackTriggered?):
PlayBark(BarkGuardUnaware, Guard)
SubscribeToGuardSpawnerEvents(GuardSpawnerDevice:guard_spawner_device):void =
GuardSpawnerDevice.DamagedEvent.Subscribe(OnGuardDamaged)
GuardSpawnerDevice.EliminatedEvent.Subscribe(OnGuardEliminated)
GuardSpawnerDevice.EliminatingEvent.Subscribe(OnPlayerEliminated)
# Configurar todos los diálogos de reacción
ConfigureBarks():void=
# Suscripción al evento de daño a jugadores
AllPlayers := GetPlayspace().GetPlayers()
for (StrongholdPlayer : AllPlayers, StrongholdPC := StrongholdPlayer.GetFortCharacter[]):
StrongholdPC.DamagedEvent().Subscribe(OnPlayerDamaged)
# Ejecuta la lista de guardias desde el administrador de fortalezas y suscríbete a todos los eventos clave
for (GuardSpawner : StrongholdGameManager.GuardsInitialSpawners):
SubscribeToGuardSpawnerEvents(GuardSpawner)
for (GuardSpawner : StrongholdGameManager.GuardsReinforcementSpawners):
SubscribeToGuardSpawnerEvents(GuardSpawner)
# Ten un caso separado para cuando aparezcan los refuerzos
if:
FirstReinforcementSpawner := StrongholdGameManager.GuardsReinforcementSpawners[0]
then:
FirstReinforcementSpawner.SpawnedEvent.Subscribe(HandleReinforcementSpawned)
# El guardia está caído: intenta reproducir un diálogo de reacción en el guardia en alerta más cercano
OnGuardEliminated(InteractionResult:device_ai_interaction_result):void=
if (EliminatedGuard := InteractionResult.Target?):
# Encuentra al guardia vivo más cercano para reproducir este diálogo de reacción
var ClosestGuard:?agent = false
if:
set ClosestGuard = option{StrongholdGameManager.AlertedGuards[0]}
EliminatedGuardCharacter := EliminatedGuard.GetFortCharacter[]
then:
for (AlertedGuard : StrongholdGameManager.AlertedGuards, AlertedGuardCharacter := AlertedGuard.GetFortCharacter[]):
if:
not ClosestGuard? = AlertedGuard
ClosestGuardCharacter := ClosestGuard?.GetFortCharacter[]
DistanceSquaredToAlertedGuard := DistanceSquared(AlertedGuardCharacter.GetTransform().Translation, EliminatedGuardCharacter.GetTransform().Translation)
DistanceSquaredToClosestGuard := DistanceSquared(ClosestGuardCharacter.GetTransform().Translation, EliminatedGuardCharacter.GetTransform().Translation)
DistanceSquaredToAlertedGuard < DistanceSquaredToClosestGuard
then:
set ClosestGuard = option{AlertedGuard}
if (Guard := ClosestGuard?):
spawn {BarkNPCDown.PlayBark(Guard)}
# El guardia está golpeado: intenta reproducir un diálogo de reacción si el guardia no está caído
OnGuardDamaged(InteractionResult:device_ai_interaction_result):void=
if (Guard := InteractionResult.Target?):
spawn {BarkDamageTaken.PlayBark(Guard)}
# El jugador está golpeado: trata de reproducir un diálogo de reacción en el guardia que dañó al jugador
OnPlayerDamaged(DamageResult:damage_result):void=
if:
fort_character[DamageResult.Target].GetHealth() > 0.0
Guard := DamageResult.Instigator?.GetInstigatorAgent[]
then:
spawn {BarkDamagePlayer.PlayBark(Guard)}
# El jugador está caído: trata de reproducir un diálogo de reacción en el guardia que eliminó al jugador
OnPlayerEliminated(InteractionResult:device_ai_interaction_result):void=
if (Guard := InteractionResult.Source?):
spawn {BarkEliminatedPlayer.PlayBark(Guard)}
HandleReinforcementSpawned(Guard:agent):void=
spawn {BarkGoToLeash.PlayBark(Guard)}
Esta secuencia de comandos almacena una referencia a cada dispositivo Reproductor de audio y hace referencia al dispositivo de Verse Administrador de juego de fortaleza como conducto para sus referencias a los generadores de guardias.
Luces personalizables

Además de obtener retroalimentación de audio de los guardias de IA, también puedes dar retroalimentación visual del entorno a los jugadores.
En este tutorial, se utilizan dos conjuntos de dispositivos de Luz personalizable alrededor de la fortaleza. Una luz roja indica un estado de detección, mientras que una luz naranja indica un estado en alerta.
Para configurar estos dispositivos, personaliza la siguiente configuración:
Opción | Valor | Explicación |
---|---|---|
Estado inicial | Falso | Determina el estado inicial de la luz cuando el dispositivo está habilitado. |
Tamaño de la luz | 100.00 | Determina el tamaño, el alcance y la amplitud de la ráfaga de luz. |
Proyectar sombras | Verdadero | Permite que la luz proyecte las sombras. |
Habilitado durante la fase | Solo durante el juego | Las luces solo se habilitarán durante el juego. |
Intensidad de la luz | 30.0 | Determina la intensidad de la luz. |
Tiempo de ritmo | x8 | Determina el multiplicador de tiempo del prestablecido de ritmo. |
Cantidad de atenuación | 100.0 | Determina la cantidad para atenuar la luz cuando se utilizan los controles de los canales. |
Tiempo de atenuación | 0.1 | Determina la duración en segundos de la transición de atenuación. |
Creador de efectos visuales

Este tutorial también utiliza un dispositivo VFX Creator en la parte superior de la base para que actúe como bengala de señalización para los refuerzos cuando se detecta a los jugadores por primera vez. A esta bengala la controla el dispositivo de Verse, y se encenderá junto con las luces de esquina cuando se avise a los guardias para que sus estados queden visualmente claros.
Para configurar estos dispositivos, personaliza la siguiente configuración:

Opción | Valor | Explicación | |
---|---|---|---|
Iniciar los efectos al habilitar | Falso | Determina si el dispositivo ejecutará los efectos al habilitarse. | |
Tamaño del sprite | 2.0 | Establece el tamaño inicial de los sprites de efectos. | |
Duración del sprite | 5.0 | Establece por cuánto tiempo aparece cada sprite. | |
Color principal | Rojo | Establece el color principal de los efectos. | |
Brillo del color principal | 200.0 | Establece el brillo del Color principal. | |
Velocidad del sprite | 100.0 | Establece la velocidad a la que se mueven los sprites de efectos. | |
Gravedad del efecto** | 15.0 | Establece la velocidad a la que caen los sprites. | |
Aleatoriedad | 100.0 | Determina cuán aleatorio será el movimiento y agrega variación al tamaño. | |
Mantener tamaño | Falso | Determina si los sprites mantendrán su tamaño o usarán un cambio de tamaño personalizado con el tiempo. | |
Efecto de cantidad de generación | 4.0 | Establece cuántos sprites de efectos se generan. | . |
Generar forma del espacio | Punto | Determina la forma del espacio donde los sprites se generan inicialmente. | |
Tamaño de la zona de generación | 0.05 | Estable el tamaño de la forma de la aparición en cuadros. | |
Habilitado durante la fase | Solo durante el juego | Determina las fases de la partida en las que se habilitará el dispositivo. | |
Bucle | Nunca | Determina si el efecto se reproduce una vez, en bucle infinito o si se repite una cantidad de veces personalizada. |
Dispositivo Radio
En este tutorial, se utilizan dos dispositivos Radio, uno para la música de combate de alerta alta y el otro para la música de precaución.
El reproductor de música de tiempo usa: Radio > Bucles de música > Music_StW_Low_Combat01_Cue'.
La música de combate del jugador marcado utiliza Radio > Bucles de música > Music_StW_High_Combat01_Cue'.
Configura una secuencia de comandos de Verse que pueda llamar a Stronghold_Alert_Manager para escuchar cuando un guardia haya detectado al jugador, o cuando todos los guardias hayan perdido la pista del jugador para alternar entre los dos estados en la fortaleza.
Pega la siguiente secuencia de comandos de Verse.
using { /Verse.org/Simulation }
using { /Verse.org/Simulation/Tags }
using { /Verse.org/Colors }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Devices }
# etiquetas para las luces personalizables
alerted_lights_tag := class(tag){}
combat_lights_tag := class(tag){}
# Secuencia de comandos que controla la música y enciende las luces cuando se alerta a los guardias
stronghold_alert_manager := class(creative_device):
# Referencia al Administrador de juego para monitorear los eventos de percepción
@editable
StrongholdGameManager:stronghold_game_manager := stronghold_game_manager{}
# Referencia a la radio que reproduce la música de combate
@editable
RadioCombat:radio_device := radio_device{}
# Referencia a la radio que reproduce la música de alerta
@editable
RadioAlerted:radio_device := radio_device{}
# Efectos visuales que se reproducirán cuando se dispare la alarma o la bengala
@editable
FlareAlarmVFXCreator:vfx_creator_device := vfx_creator_device{}
## Datos de clase
var<private> CustomizableLightDevicesAlerted: []customizable_light_device = array{}
var<private> CustomizableLightDevicesCombat: []customizable_light_device = array{}
# Cambia el campo a en alerta cuando el jugador se pierde/muere
WaitForAlerted()<suspends>:void=
# no volver a en alerta después del último recurso
if (StrongholdGameManager.FallbackTriggered?):
Sleep(Inf)
StrongholdGameManager.GuardsUnawareEvent.Await()
Sleep(3.0)
SetAlertedMood()
# Cambia el campo a combate cuando se ve al jugador
WaitForCombat()<suspends>:void=
race:
StrongholdGameManager.PlayerDetectedEvent.Await()
StrongholdGameManager.FallbackEvent.Await()
Sleep(2.0)
SetCombatMood()
# Se ejecuta cuando el dispositivo se inicia en un juego ya ejecutado.
OnBegin<override>()<suspends>:void=
FindLightsWithTag()
MonitorStrongholdAlertStatus()
# Control de bucle principal si la fortaleza está en combate o en alerta
MonitorStrongholdAlertStatus()<suspends>:void=
loop:
WaitForCombat()
WaitForAlerted()
# Establece la Base de combate mediante el encendido de luces rojas y la reproducción de música de alta intensidad
SetCombatMood():void=
# Haz un bucle de las luces de combate y enciéndelas
for(LightsToTurnOn: CustomizableLightDevicesCombat):
LightsToTurnOn.TurnOn()
# Haz un bucle de las luces de alerta y apágalas
for(LightsToTurnOff: CustomizableLightDevicesAlerted):
LightsToTurnOff.TurnOff()
# Enciende el audio de combate y apaga el audio de alerta
RadioCombat.Play()
RadioAlerted.Stop()
FlareAlarmVFXCreator.Toggle()
# Establece la Base de En alerta mediante el encendido de luces amarillas y la reproducción de música de tensión
SetAlertedMood():void=
for(LightsToTurnOn: CustomizableLightDevicesAlerted):
LightsToTurnOn.TurnOn()
for(LightsToTurnOff: CustomizableLightDevicesCombat):
LightsToTurnOff.TurnOff()
RadioCombat.Stop()
RadioAlerted.Play()
# Haz un bucle de los dispositivos del modo Creativo para las luces con esta etiqueta de Verse específica y guárdalas en una lista
FindLightsWithTag() : void=
TaggedAlertedLightDevices := GetCreativeObjectsWithTag(alerted_lights_tag{})
TaggedCombatLightDevices := GetCreativeObjectsWithTag(combat_lights_tag{})
for(AlertedLight : TaggedAlertedLightDevices, CustomizableLight := customizable_light_device[AlertedLight] ):
CustomizableLight.TurnOff()
set CustomizableLightDevicesAlerted += array{CustomizableLight}
for(CombatLight : TaggedCombatLightDevices, CustomizableLight := customizable_light_device[CombatLight] ):
CustomizableLight.TurnOff()
set CustomizableLightDevicesCombat += array{CustomizableLight}
Creaste con éxito un juego de fortaleza.