In diesem Abschnitt erfährst du, wie du Audioeffekte, z. B. Bellen, und visuelle Effekte, z. B. Kamerawackeln, einrichtest, um ein fesselndes Gameplay zu schaffen.
Audioplayer-Gerät
Du kannst den Audioplayer verwenden, um Dialogzeilen von Wächtern zu verwenden. In der Spieleentwicklung werden diese oft als Barks bezeichnet.

Du findest importiertes Audio in "Projektordner" > Barks. Klicke auf das Wiedergabesymbol, um die Audiodatei anzuhören, und ziehe sie dann per Drag & Drop auf deine Insel.

Wenn du eine Audiodatei auf deiner Insel ablegst, wird ein Audioplayer platziert, der mit einem Verse-Gerät verbunden ist, um eine Reihe von Wächter-Rufen abzuspielen. Diese Appells reagieren auf verschiedene Events, z. B. wenn der Spieler entdeckt wird oder Schaden nimmt.
Platziere einen Audioplayer für jedes einzelne Audiomaterial, das du abspielen möchtest. In diesem Tutorial werden 14 verschiedene Barks verwendet, die mit 14 verschiedenen Audioplayern abgespielt werden.
Um diese Geräte einzurichten, nimm die folgenden Einstellungen vor:

Option | Wert | Beschreibung |
---|---|---|
Lautstärke | 4.0 | Diese Einstellung kann je nach Aufnahme variieren. |
Neustart des Tons bei Aktivierung | True | Dieser Ton wird bei der Aktivierung von Anfang an abgespielt. |
Abspielen bei Treffer | False | Dieses Gerät spielt keinen Ton ab, wenn es von einem Spieler getroffen wird. |
Wiedergabestandort | Anstiftender Spieler | Audio wird basierend auf dem Standort des anstiftenden Spielers und nicht auf dem Standort des Geräts wiedergegeben. |
Lautstärke-Abschwächung aktivieren | False | Ändert die Lautstärke basierend auf der Entfernung zum Gerät oder zum Wächter, der für die Wiedergabe eingestellt ist. Bei diesem Tutorial kann der Spieler den Ton hören, egal wie weit er entfernt ist. |
Richte als Nächstes das Verse-Script ein, um die Logik für die Auslösung der Audioplayer-Geräte während des Spiels zu steuern, und platziere dann das Verse-Gerät. In diesem Tutorial wird das Gerät Festung Bark Manager genannt.
Füge das folgende Verse-Script ein.
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-Bark, das auf einem NPC abgespielt werden kann
audio_npc_bark := class<concrete>:
# Audiogerät zum Abspielen von Barks
@editable
BarkDevice:audio_player_device := audio_player_device{}
# Option, um NPCs zu erlauben, den Callout zu wiederholen.
@editable
CanRepeat:logic = true
# Verzögerung zwischen dem Event und dem Beginn des Barks
@editable
Delay:float = 0.0
# Verzögerung vor der Wiederholung dieses Barks
@editable
Cooldown:float = 5.0
# Bark-Name für die Aufzeichnung
@editable
BarkID:string = "Missing ID"
# Ist die Abklingzeit abgelaufen?
var<private> IsInCooldown:logic = false
# Event, um den Bark zu stoppen
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()
# Script, das Barks von Wächtern verarbeitet
stronghold_bark_manager := class(creative_device):
# Verweis auf den Spielmanager zur Überwachung von Wahrnehmungsereignissen
@editable
StrongholdGameManager:stronghold_game_manager := stronghold_game_manager{}
# Audioplayer-Geräte
@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}
# Zu speichernde Variable, ob die Wächter nach Zielen suchen
var<private> HasLostTarget:logic := false
# Wird ausgeführt, wenn das Gerät in einem laufenden Spiel gestartet wird
OnBegin<override>()<suspends>:void=
ConfigureBarks()
sync:
AwaitReinforcements()
AwaitFallback()
PlayAwarenessBarks()
PlayBark(Bark:audio_npc_bark, Guard:agent):void=
spawn {Bark.PlayBark(Guard)}
# Spiele einen Bark ab, wenn die Verstärkung aufgerufen wird.
AwaitReinforcements<private>()<suspends>:void=
AlertedGuard := StrongholdGameManager.ReinforcementsCalledEvent.Await()
PlayBark(BarkNeedBackup, AlertedGuard)
# Spiele einen Bark ab, wenn sich die Wachen in der Festung neu formieren
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)
# Konfiguriere alle Barks
ConfigureBarks():void=
# Abonniere das Event Spielerschaden
AllPlayers := GetPlayspace().GetPlayers()
for (StrongholdPlayer : AllPlayers, StrongholdPC := StrongholdPlayer.GetFortCharacter[]):
StrongholdPC.DamagedEvent().Subscribe(OnPlayerDamaged)
# Gehe durch die Wächter-Spawner-Liste des Festungs-Managers und abonniere alle wichtigen Events
for (GuardSpawner : StrongholdGameManager.GuardsInitialSpawners):
SubscribeToGuardSpawnerEvents(GuardSpawner)
for (GuardSpawner : StrongholdGameManager.GuardsReinforcementSpawners):
SubscribeToGuardSpawnerEvents(GuardSpawner)
# Ein separater Fall für das Spawnen der Verstärkung
if:
FirstReinforcementSpawner := StrongholdGameManager.GuardsReinforcementSpawners[0]
then:
FirstReinforcementSpawner.SpawnedEvent.Subscribe(HandleReinforcementSpawned)
# Wache ist außer Gefecht, versuche, ein Bark auf der nächstgelegenen alarmierten Wachen abzuspielen
OnGuardEliminated(InteractionResult:device_ai_interaction_result):void=
if (EliminatedGuard := InteractionResult.Target?):
# Finde den nächsten lebenden Wächter, um dieses Bark abzuspielen.
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)}
# Wache wird getroffen, versuche, ein Bark abzuspielen, wenn die Wache nicht am Boden liegt
OnGuardDamaged(InteractionResult:device_ai_interaction_result):void=
if (Guard := InteractionResult.Target?):
spawn {BarkDamageTaken.PlayBark(Guard)}
# Spieler wird getroffen, versuche ein Bark auf dem Wächter abzuspielen, der den Spieler beschädigt hat
OnPlayerDamaged(DamageResult:damage_result):void=
if:
fort_character[DamageResult.Target].GetHealth() > 0.0
Guard := DamageResult.Instigator?.GetInstigatorAgent[]
then:
spawn {BarkDamagePlayer.PlayBark(Guard)}
# Spieler ist am Boden, versuche, einen Bark auf dem Wächter abzuspielen, der den Spieler eliminiert hat
OnPlayerEliminated(InteractionResult:device_ai_interaction_result):void=
if (Guard := InteractionResult.Source?):
spawn {BarkEliminatedPlayer.PlayBark(Guard)}
HandleReinforcementSpawned(Guard:agent):void=
spawn {BarkGoToLeash.PlayBark(Guard)}
Dieses Script speichert eine Referenz auf jedes Audioplayer-Gerät und verweist auf das Festungsspiel-Manager Verse-Gerät als Leitung für seine Referenzen auf die Wächter-Spawner.
Anpassbare Lichter

Zusätzlich zum Audio-Feedback der KI-Wachen kannst du den Spielern auch visuelles Feedback aus der Umgebung geben.
Dieses Tutorial verwendet zwei Sets von anpassbaren Licht--Geräten, die rund um die Festung platziert werden. Ein rotes Licht zeigt einen erkannten Status an, während ein oranges Licht einen alarmierten Status anzeigt.
Um diese Geräte einzurichten, nimm die folgenden Einstellungen vor:
Option | Wert | Beschreibung |
---|---|---|
Anfangszustand | False | Bestimmt den anfänglichen Lichtzustand, wenn das Gerät aktiviert wird. |
Lichtgröße | 100.00 | Bestimmt die Größe, Reichweite und Amplitude des Lichts. |
Wirft Schatten | True | Ob das Licht Schatten wirft. |
Eingeschaltet während Phase | Nur während Gameplay | Die Lichter werden nur während des Gameplay aktiviert. |
Lichtintensität | 30.0 | Bestimmt die Intensität des Lichts. |
Rhythmuszeit | x8 | Bestimmt den Zeitmultiplikator für das Rhythmus-Preset. |
Dimmwert | 100.0 | Bestimmt den Wert, um den das Licht bei Verwendung der Kanalsteuerungen gedimmt wird. |
Dimmzeit | 0.1 | Bestimmt die Dauer des Dimmübergangs in Sekunden. |
VFX Creator

Dieses Tutorial verwendet auch ein Grafikeffekt-Ersteller-Gerät, ein Gerät an der Spitze der Basis, das als Signalfackel für Verstärkung dient, wenn Spieler zum ersten Mal entdeckt werden. Diese Fackel wird vom Verse-Gerät gesteuert und geht zusammen mit den Eckleuchten aus, wenn die Wachen alarmiert werden, um ihren Zustand visuell deutlich zu machen.
Um diese Geräte einzurichten, nimm die folgenden Einstellungen vor:

Option | Wert | Beschreibung |
---|---|---|
Effekte bei Aktivierung starten | False | Legt fest, ob das Gerät die Effekte bei Aktivierung ausführt. |
Sprite-Größe | 2.0 | Legt die Anfangsgröße des Effekt-Sprites fest. |
Sprite-Dauer | 5.0 | Legt fest, wie lange jedes Sprite angezeigt wird. |
Hauptfarbe | Rot | Legt die Hauptfarbe für die Effekte fest. |
Hauptfarbhelligkeit | 200.0 | Stellt die Hauptfarbhelligkeit ein. |
Sprite-Geschwindigkeit | 100.0 | Legt fest, wie schnell sich die Effekt-Sprites zu bewegen beginnen. |
Effekt-Schwerkraft | 15.0 | Legt fest, wie schnell die Effekt-Sprites fallen können. |
Zufälligkeit | 100.0 | Legt fest, wie zufällig die Bewegung sein wird, und variiert die Größe. |
Größe beibehalten | False | Bestimmt, ob Sprites ihre Größe beibehalten oder eine benutzerdefinierte Größe verwenden, die sich mit der Zeit ändert. |
Anzahl der Effektgenerierung | 4.0 | Legt fest, wie viele Effekt-Sprites generiert werden. |
Form der Spawnzone | Punkt | Bestimmt die Form des Raums, in dem die Sprites anfangs erscheinen. |
Größe der Spawnzone | 0.05 | Legt die Größe der Spawnform in Kacheln fest. |
Eingeschaltet während der Phase | Nur Gameplay | Bestimmt die Spielphasen, während der das Gerät aktiviert wird. |
Schleifen | Nie | Bestimmt, ob der Effekt einmal abgespielt wird, ob die Schleife unbegrenzt weiterläuft oder ob sie nach einer bestimmten Anzahl von Wiederholungen endet. |
Radio-Gerät
In diesem Tutorial werden zwei Radio-Geräte verwendet, eines für Kampfmusik in höchster Alarmbereitschaft und das andere für angespannte Musik.
Der Player für angespannte Musik verwendet: Radio > Musikschleifen > Music_StW_Low_Combat01_Cue'.
Die Kampfmusik bei Entdeckung des Spielers verwendet Radio > Musikschleifen > Music_StW_High_Combat01_Cue'.
Richte ein Verse-Script ein, das du Stronghold_Alert_Manager nennen kannst, um zu hören, wenn eine Wache den Spieler entdeckt hat, oder wenn alle Wachen den Spieler aus den Augen verloren haben, um zwischen den beiden Zuständen in der Festung zu wechseln.
Füge das folgende Verse-Script ein.
using { /Verse.org/Simulation }
using { /Verse.org/Simulation/Tags }
using { /Verse.org/Colors }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Devices }
# Tags für anpassbare Lichter
alerted_lights_tag := class(tag){}
combat_lights_tag := class(tag){}
# Script, das Musik steuert und Lichter einschaltet, wenn Wachen alarmiert werden
stronghold_alert_manager := class(creative_device):
# Verweis auf den Spielmanager zur Überwachung von Wahrnehmungsereignissen
@editable
StrongholdGameManager:stronghold_game_manager := stronghold_game_manager{}
# Referenz zu Radio, das Kampfmusik spielt
@editable
RadioCombat:radio_device := radio_device{}
# Referenz auf Radio, das angespannte Musik spielt
@editable
RadioAlerted:radio_device := radio_device{}
# VFX, die abgespielt werden, wenn der Alarm/das Leuchtsignal ausgelöst wird
@editable
FlareAlarmVFXCreator:vfx_creator_device := vfx_creator_device{}
# Klassendaten
var<private> CustomizableLightDevicesAlerted: []customizable_light_device = array{}
var<private> CustomizableLightDevicesCombat: []customizable_light_device = array{}
# Ändere das Camp auf alarmiert, wenn Spieler verloren geht / getötet wird
WaitForAlerted()<suspends>:void=
# nach dem Fallback nicht auf Alarmzustand zurückgehen
if (StrongholdGameManager.FallbackTriggered?):
Sleep(Inf)
StrongholdGameManager.GuardsUnawareEvent.Await()
Sleep(3.0)
SetAlertedMood()
# Ändere das Lager auf Kampf, wenn der Spieler entdeckt wird
WaitForCombat()<suspends>:void=
race:
StrongholdGameManager.PlayerDetectedEvent.Await()
StrongholdGameManager.FallbackEvent.Await()
Sleep(2.0)
SetCombatMood()
# Wird ausgeführt, wenn das Gerät in einem laufenden Spiel gestartet wird
OnBegin<override>()<suspends>:void=
FindLightsWithTag()
MonitorStrongholdAlertStatus()
# Hauptschleife, die prüft, ob die Festung im Kampf oder alarmiert ist
MonitorStrongholdAlertStatus()<suspends>:void=
loop:
WaitForCombat()
WaitForAlerted()
# Schaltet die Basis auf Kampf, indem die Lichter rot leuchten und Musik mit hoher Intensität gespielt wird
SetCombatMood():void=
# Schleife durch die Kampflichter und schalte sie ein
for(LightsToTurnOn: CustomizableLightDevicesCombat):
LightsToTurnOn.TurnOn()
# Schleife durch die Warnlichter und schalte sie aus
for(LightsToTurnOff: CustomizableLightDevicesAlerted):
LightsToTurnOff.TurnOff()
# Schaltet die Kampfmusik ein und die Alarmmusik aus.
RadioCombat.Play()
RadioAlerted.Stop()
FlareAlarmVFXCreator.Toggle()
# Schaltet die Basis auf Alarm, indem die Lichter gelb leuchten und eine angespannte Musik abgespielt wird
SetAlertedMood():void=
for(LightsToTurnOn: CustomizableLightDevicesAlerted):
LightsToTurnOn.TurnOn()
for(LightsToTurnOff: CustomizableLightDevicesCombat):
LightsToTurnOff.TurnOff()
RadioCombat.Stop()
RadioAlerted.Play()
# Durchläuft die Kreativmodus-Geräte für die Lichter mit diesem speziellen Verse-Tag und speichert sie in einer Liste.
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}
Du hast nun erfolgreich ein Festungs-Spiel erstellt.