Esta sección te mostrará cómo configurar el sonido, como los ladridos, y los efectos visuales, como las sacudidas de la cámara, para crear un juego atractivo.
Dispositivo Reproductor de sonido
Puedes utilizar el dispositivo Reproductor de sonido para configurar las líneas de diálogo de uso de los guardias. En el desarrollo de juegos, a menudo se denominan ladridos.

Puedes encontrar el audio importado en «Carpeta del proyecto» > Ladridos. Haz clic en el icono Reproducir para oír 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 sonido, que se conecta a un dispositivo Verse para reproducir una serie de llamadas personalizadas de guardias. Estas llamadas reaccionan a distintos eventos, como ver al jugador o recibir daño.
Coloca un reproductor de sonido por cada pieza única de audio que quieras reproducir. Este tutorial utiliza 14 ladridos diferentes, con 14 dispositivos Reproductor de sonido 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 tu grabación. |
Reanudar sonido al activarse | True | Este audio se reproducirá desde el principio cuando se active. |
Reproducir al golpear | False | Este dispositivo no reproducirá audio cuando sea golpeado por un jugador. |
Ubicación de reproducción | Jugador instigador | El audio se reproducirá en función de la ubicación del jugador instigador en lugar de la ubicación del dispositivo. |
Habilitar atenuación del volumen | Desactivado | Cambia el volumen en función de la distancia del dispositivo o del guardia configurada para reproducirlo. En este tutorial, el jugador puede oír el sonido independientemente de la distancia a la que se encuentre. |
A continuación, configura la secuencia de comandos de Verse para que se encargue de la lógica de activación de los dispositivos Reproductores de sonido durante el juego y, después, coloca el dispositivo Verse. Para este tutorial, el dispositivo se llama Stronghold Bark Manager (Gestor de ladridos - 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 }
# Ladrido de audio que se puede reproducir en un PNJ
audio_npc_bark := class<concrete>:
# Dispositivo de sonido para reproducir ladridos
@editable
BarkDevice:audio_player_device := audio_player_device{}
# Opción para permitir que los PNJ repitan el ladrido
@editable
CanRepeat:logic = true
# Retraso entre el evento y el inicio del ladrido
@editable
Delay:float = 0.0
# Retraso antes de repetir este ladrido
@editable
Cooldown:float = 5.0
# Nombre del ladrido para el registro
@editable
BarkID:string = "ID ausente"
# ¿Se ha agotado el cronómetro de enfriamiento?
var<private> IsInCooldown:logic = false
# Evento para detener el ladrido
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 gestiona los ladridos de los guardias
stronghold_bark_manager := class(creative_device):
# Referencia al gestor de la partida para controlar los eventos de percepción
@editable
StrongholdGameManager:stronghold_game_manager := stronghold_game_manager{}
# Dispositivos reproductores de sonido
@editable
BarkNPCDown:audio_npc_bark = audio_npc_bark{BarkID := "Jugador abatido", Delay := 0.3}
@editable
BarkFallback:audio_npc_bark = audio_npc_bark{BarkID := "Alternativa", CanRepeat := false, Delay := 3.0}
@editable
BarkNeedBackup:audio_npc_bark = audio_npc_bark{BarkID := "Necesito refuerzos", CanRepeat := false, Delay := 2.0}
@editable
BarkGoToLeash:audio_npc_bark = audio_npc_bark{BarkID := "Refuerzos en camino", CanRepeat := false, Delay := 4.0}
@editable
BarkDamageTaken:audio_npc_bark = audio_npc_bark{BarkID := "Ha recibido daño", Delay := 0.2}
@editable
BarkDamagePlayer:audio_npc_bark = audio_npc_bark{BarkID := "Jugador golpeado", Delay := 0.2}
@editable
BarkEliminatedPlayer:audio_npc_bark = audio_npc_bark{BarkID := "Jugador eliminado", Delay := 0.3}
@editable
BarkPlayerSpotted:audio_npc_bark = audio_npc_bark{BarkID := "Jugador detectado", CanRepeat := false}
@editable
BarkPlayerLost:audio_npc_bark = audio_npc_bark{BarkID := "Jugador perdido", Cooldown := 10.0}
@editable
BarkGuardSuspicious:audio_npc_bark = audio_npc_bark{BarkID := "Sospechoso", Cooldown := 10.0}
@editable
BarkGuardUnaware:audio_npc_bark = audio_npc_bark{BarkID := "Desprevenido", Cooldown := 10.0}
# Variable para almacenar si los guardias buscaban objetivos
var<private> HasLostTarget:logic := false
# Se ejecuta cuando se inicia el dispositivo 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)}
# Reproducir un ladrido cuando se llama al refuerzo
AwaitReinforcements<private>()<suspends>:void=
AlertedGuard := StrongholdGameManager.ReinforcementsCalledEvent.Await()
PlayBark(BarkNeedBackup, AlertedGuard)
# Reproducir un ladrido cuando los guardias se reagrupen 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 ladridos
ConfigureBarks():void=
# Suscribirse al evento de daño al jugador
AllPlayers := GetPlayspace().GetPlayers()
for (StrongholdPlayer : AllPlayers, StrongholdPC := StrongholdPlayer.GetFortCharacter[]):
StrongholdPC.DamagedEvent().Subscribe(OnPlayerDamaged)
# Recorre la lista de generadores de guardias desde el gestor de fortaleza y suscríbete a todos los eventos clave
for (GuardSpawner : StrongholdGameManager.GuardsInitialSpawners):
SubscribeToGuardSpawnerEvents(GuardSpawner)
for (GuardSpawner : StrongholdGameManager.GuardsReinforcementSpawners):
SubscribeToGuardSpawnerEvents(GuardSpawner)
# Ten un caso aparte para cuando aparezcan los refuerzos
if:
FirstReinforcementSpawner := StrongholdGameManager.GuardsReinforcementSpawners[0]
then:
FirstReinforcementSpawner.SpawnedEvent.Subscribe(HandleReinforcementSpawned)
# El guardia ha caído, intenta reproducir un ladrido al guardia alertado más cercano.
OnGuardEliminated(InteractionResult:device_ai_interaction_result):void=
if (EliminatedGuard := InteractionResult.Target?):
# Encuentra al guardia vivo más cercano para reproducir este ladrido
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 ha recibido un golpe, intenta reproducir un ladrido si el guardia no ha sido derribado.
OnGuardDamaged(InteractionResult:device_ai_interaction_result):void=
if (Guard := InteractionResult.Target?):
spawn {BarkDamageTaken.PlayBark(Guard)}
# El jugador ha recibido un golpe, intenta reproducir un ladrido en el guardia que ha dañado 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 ha caído, intenta reproducir un ladrido sobre 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 sonido y hace referencia al dispositivo Verse Gestor de partida Fortaleza como conducto para sus referencias a los generadores de guardias.
Luces personalizables

Además de recibir información sonora de los guardias de la IA, también puedes dar a los jugadores información visual del entorno.
Este tutorial utiliza dos conjuntos de dispositivos Luz personalizable en la fortaleza. Una luz roja indica un estado detectado, mientras que una luz naranja indica un estado alertado.
Para configurar estos dispositivos, personaliza la siguiente configuración:
Opción | Valor | Explicación |
---|---|---|
Estado inicial | False | Determina el estado inicial de la luz cuando se activa el dispositivo. |
Tamaño de la luz | 100,00 | Determina el tamaño, el alcance y la amplitud del destello de luz. |
Proyectar sombras | True | Permite que la luz proyecte sombras. |
Activado durante fase | Solo en partida | Las luces solo se activarán durante la partida. |
Intensidad de la luz | 30,0 | Establece la intensidad de la luz. |
Tiempo del ritmo | x8 | Establece el multiplicador de tiempo que se aplica al preestablecido de ritmo. |
Cantidad de atenuación | 100,0 | Determina cómo de tenue será la luz al utilizar los controles del canal. |
Tiempo de atenuación | 0,1 | Establece la duración en segundos de la transición de atenuación. |
Creador de efectos visuales

Este tutorial también utiliza un dispositivo Creador de efectos visuales en la parte superior de la base que actúa como una bengala para los refuerzos cuando se detecta a los jugadores por primera vez. Este destello está controlado por el dispositivo Verse y se encenderá junto con las luces de esquina cuando se alerte a los guardias para que sus estados queden visualmente claros.
Para configurar estos dispositivos, personaliza la siguiente configuración:

Opción | Valor | Explicación |
---|---|---|
Comenzar efectos al habilitar | False | Establece si el dispositivo ejecutará los efectos al activarse. |
Tamaño de sprites | 2,0 | Establece el tamaño inicial del sprite del efecto. |
Duración del sprite | 5,0 | Establece durante cuánto tiempo aparecerá 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 de sprite | 100,0 | Establece lo rápido que empezarán a moverse los sprites de efecto. |
Gravedad del efecto | 15,0 | Establece lo rápido que pueden caer los sprites de efecto. |
Aleatoriedad | 100,0 | Determina lo aleatorio que será el movimiento y añade variación al tamaño. |
Conservar tamaño | False | Establece si los sprites conservan su tamaño o usan un cambio de tamaño personalizado con el tiempo. |
Cantidad de efectos generados | 4,0 | Determina cuántos sprites de efecto se generan. |
Forma de la zona de aparición | Punto | Determina la forma del espacio donde los sprites aparecen inicialmente. |
Tamaño de la zona de aparición | 0,05 | Establece el tamaño de la forma de aparición en teselas. |
Activado durante fase | Solo en partida | Establece las fases del juego durante las que el dispositivo estará habilitado. |
Bucle | Nunca | Establece si el efecto se reproduce una vez, en un bucle infinito o una cantidad personalizada de veces. |
Dispositivo Radio
Este tutorial utiliza dos dispositivos Radio, uno para música de combate de alerta y otro para música de precaución.
El reproductor de música utiliza: Radio > Bucles de música > Music_StW_Low_Combat01_Cue'.
La música de combate del jugador utiliza Radio > Bucles de música > Music_StW_High_Combat01_Cue'.
Configura una secuencia de comandos de Verse con la que puedas llamar a Stronghold_Alert_Manager para que note cuando un guardia haya detectado al jugador, o cuando todos los guardias hayan perdido de vista al 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 luces personalizables
alerted_lights_tag := class(tag){}
combat_lights_tag := class(tag){}
# Secuencia de comandos que gestiona la música y enciende las luces cuando se alerta a los guardias
stronghold_alert_manager := class(creative_device):
# Referencia al gestor de la partida para controlar los eventos de percepción
@editable
StrongholdGameManager:stronghold_game_manager := stronghold_game_manager{}
# Referencia a la radio que reproduce música de combate
@editable
RadioCombat:radio_device := radio_device{}
# Referencia a la radio que reproduce música de alerta
@editable
RadioAlerted:radio_device := radio_device{}
# Efectos visuales para reproducir cuando se dispara la alarma/destello
@editable
FlareAlarmVFXCreator:vfx_creator_device := vfx_creator_device{}
# Datos de clases
var<private> CustomizableLightDevicesAlerted: []customizable_light_device = array{}
var<private> CustomizableLightDevicesCombat: []customizable_light_device = array{}
# Cambia el campo a alertado cuando el jugador se pierde/muere
WaitForAlerted()<suspends>:void=
# No vuelve a alertar después de la retirada
if (StrongholdGameManager.FallbackTriggered?):
Sleep(Inf)
StrongholdGameManager.GuardsUnawareEvent.Await()
Sleep(3.0)
SetAlertedMood()
# Cambia el campo a combate cuando el jugador es localizado
WaitForCombat()<suspends>:void=
race:
StrongholdGameManager.PlayerDetectedEvent.Await()
StrongholdGameManager.FallbackEvent.Await()
Sleep(2.0)
SetCombatMood()
# Se ejecuta cuando se inicia el dispositivo en un juego en ejecución
OnBegin<override>()<suspends>:void=
FindLightsWithTag()
MonitorStrongholdAlertStatus()
# Bucle principal que comprueba si la fortaleza está en combate o alertada
MonitorStrongholdAlertStatus()<suspends>:void=
loop:
WaitForCombat()
WaitForAlerted()
# Pone la base en combate encendiendo las luces en rojo y reproduciendo música de alta intensidad
SetCombatMood():void=
# Recorre las luces de combate y las enciende
for(LightsToTurnOn: CustomizableLightDevicesCombat):
LightsToTurnOn.TurnOn()
# Recorre las luces de alerta y las apaga
for(LightsToTurnOff: CustomizableLightDevicesAlerted):
LightsToTurnOff.TurnOff()
# Activa el audio de combate y desactiva el audio de alerta
RadioCombat.Play()
RadioAlerted.Stop()
FlareAlarmVFXCreator.Toggle()
# Pone la base en alerta encendiendo las luces amarillas y reproduciendo música tensa
SetAlertedMood():void=
for(LightsToTurnOn: CustomizableLightDevicesAlerted):
LightsToTurnOn.TurnOn()
for(LightsToTurnOff: CustomizableLightDevicesCombat):
LightsToTurnOff.TurnOff()
RadioCombat.Stop()
RadioAlerted.Play()
# Recorre en bucle los dispositivos del modo Creativo para las luces con esta etiqueta de Verse específica y los guarda 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}
Ya has creado con éxito un juego de fortaleza.