In diesem Abschnitt erfährst du, wie du benutzerdefinierte Heartbeat-VFX (visuelle Effekte) zu deinem Gameplay hinzufügst, die den Standort eines unbeweglichen Props verraten.
Wenn ein Spieler des Prop-Teams zu lange untätig ist, wird ein visueller Heartbeat-Effekt für diesen Spieler abgespielt, um das Jägerteam zu informieren. Dieser visuelle Effekt wird für jeden Spieler des Prop-Teams registriert, wenn er im Spiel spawnt.
Du wirst VFX-Spawner-Geräte zusammen mit Verse verwenden, um die Heartbeat-Funktionalität zu implementieren. Dies umfasst:
-
Aktivieren der visuellen Effekte.
-
Teleportieren des VFX-Spawners zu den Spielern.
-
Erstellen einer Benutzeroberfläche, die den Mitgliedern des Prop-Teams anzeigt, wie lange sie noch Zeit haben, sich zu bewegen, bevor der Heartbeat ertönt.
Dieses Tutorial enthält Verse-Snippets, die zeigen, wie die in diesem Spiel benötigten Gameplay-Mechaniken ausgeführt werden. Befolge die folgenden Schritte und kopiere das vollständige Script in Schritt 6 dieses Tutorials.
Bevor du anfängst
Eine gute Vorgehensweise ist es, Assets und Geräte in Ordnern aufzubewahren, um sie leichter auffinden zu können. Du kannst Geräte nach Verwendungszweck, Standort, Typ oder wie auch immer du möchtest gruppieren.
Du kannst platzierte Assets in von dir erstellte Ordner und Actors verschieben.
Im obigen Gif wird das VFX-Spawner-Gerät zu Organisationszwecken in den HeartBeatVFX-Ordner des Prop-Teams gezogen. Du kannst auch mit der rechten Maustaste klicken und Verschieben nach wählen, um den Ordner auszuwählen, in den du das Asset verschieben möchtest.
Verwendete Geräte:
~ 16 VFX-Spawner
VFX-Spawner-Gerät
Erstelle einen VFX-Spawner für jeden Spieler. Wenn ein Spieler den VFX benötigt, wird er an den Standort des Spielers teleportiert. Wenn er nicht mehr benötigt wird, wird er ausgeblendet, bis er wieder gebraucht wird.
Die VFX-Spawner in dieser Vorlage verwenden Niagara VFX, um benutzerdefinierte Assets zu erstellen, die während des Gameplays angezeigt werden. Die in diesem Tutorial verwendeten VFX-Assets sind so festgelegt, dass sie einen Heartbeat anzeigen, um unbewegliche Spieler des Prop-Teams zu zeigen. Dieser VFX wird über Props angezeigt, die mindestens 15 Sekunden lang statisch sind.
Im Abschnitt Visuelle Effekte unserer Dokumentation findest du viele Anleitungen zur Erstellung von Heartbeat-VFX. Du kannst dann den benutzerdefinierten Heartbeat verwenden, den du mit dem VFX-Spawner erstellt hast.
Du kannst dies ausprobieren, wenn du einen VFX-Spawner platzierst. Wähle im Details-Panel deinen benutzerdefinierten Effekt aus dem Dropdown-Menü Benutzerdefinierter visueller Effekt aus. Aktiviere Benutzerdefinierter visueller Effekt Override, damit die ausgewählten VFX im Viewport erscheinen.
Von hier aus kannst du deinen Effekt im Details-Panel weiter anpassen, indem du Farben hinzufügst und festlegst, wann die VFX abgespielt werden und für wen sie bestimmt sind.
Platziere dieses Gerät an einem Ort, der von den Spielern nicht gesehen werden kann, und konfiguriere die Benutzeroptionen so, dass sie der unten stehenden Tabelle entsprechen. Kopiere dann dieses Gerät und füge es so ein, dass es der Anzahl der Spieler entspricht, die dein Spiel erlaubt.
| Option | Wert | Beschreibung |
|---|---|---|
| Benutzerdefinierter visueller Effekt | HeartBeatVFX | Definiert ein benutzerdefiniertes Partikel, das anstelle eines Partikels aus der Voreinstellungsliste verwendet werden soll. |
| Benutzerdefinierter visueller Effekt Override | True | Bestimmt, ob Entwicklereffekte verwendet werden. |
| Aktiviert bei Phase | Nur Gameplay | Bestimmt, in welchen Spielphasen das Gerät aktiviert ist. Ein eingeschalteter VFX-Spawner spielt seinen definierten Partikeleffekt ab. |
Heartbeat-Effekte an einem Ort abspielen
Befolge diese Schritte, um das VFX-Spawner-Gerät in Verse zu verschieben, um den Heartbeat-Effekt bei Spielern des Prop-Teams abzuspielen und zu stoppen.
-
Erstelle eine neue Verse-Datei in deinem Projekt namens heartbeat.verse. Es handelt sich nicht um ein Verse-Gerät, du kannst es also als leere Verse-Datei erstellen.
-
Doppelklicke auf die Verse-Datei, die du erstellt hast, um die folgenden Verse-Pfade zum Importieren hinzuzufügen.
using { /Fortnite.com/Characters } using { /Fortnite.com/Devices } using { /Fortnite.com/UI } using { /UnrealEngine.com/Temporary/SpatialMath } using { /UnrealEngine.com/Temporary/Diagnostics } using { /UnrealEngine.com/Temporary/UI } using { /Verse.org/Colors } using { /Verse.org/Simulation } -
Dieser Code erstellt eine Klasse namens
heartbeat_vfxin heartbeat.verse. Die Klasseheartbeat_vfxenthält eine Struktur von Daten, umvfx_spawner_deviceObjekte pro Spieler zu verfolgen, sowie die Funktionen, um die VFX auf eine Position zu setzen oder zurückzusetzen.log_heart_beat := class(log_channel){} # Diese Nachrichten werden verwendet, um einem Prop-Agenten mit einer Nachricht mitzuteilen (oder diese zu verbergen), wenn er sich bewegen muss, damit sein Herzschlag nicht sichtbar wird. HeartBeatWarningMessage<localizes>(Time:int):message = "Herzschlag in {Time} Sekunden. Beweg dich!" HeartBeatWarningClear<localizes>:message = "" # Diese Klasse gibt die bearbeitbaren Eigenschaften für den Heartbeat an das prop_hunt Verse-Gerät weiter. heart_beat := class<concrete>(): Logger:log = log{Channel:=log_heart_beat} @editable # Die Anzahl der Sekunden, bevor sich ein Prop-Agent bewegen muss, bevor der Herzschlag seine Position verrät MoveTime:float = 15.0 @editable # Die verbleibenden Sekunden, bevor die Herzschlag-Warnung erscheint Sollte nicht > als HeartBeatTimer sein. WarningTime:float = 5.0 @editable # Ein Array von Herzschlag-VFX-Geräten Es gibt eines pro Spieler. AgentVFX:[]heartbeat_vfx = array{} @editable # Das Radioplayer-Gerät, das für die Wiedergabe der Herzschlag-Soundeffekte (SFX) verwendet wird. SFXPlayer:radio_device = radio_device{} # Diese Karte ordnet jedem Prop-Agent eine Benutzeroberfläche für die Anzeige der Herzschlag-Warnung zu. var WarningUI:[agent]heartbeat_warning_ui = map{} # Behält im Auge, wie viele Spieler einen aktiven Herzschlag haben, damit wir das SFX-Gerät verwalten können var NumberOfHeartBeats:int = 0 # Richtet die Herzschlag-Benutzeroberfläche für den Agenten ein SetUpUI(PropAgent:agent):void = if: not WarningUI[PropAgent] AsPlayer := player[PropAgent] PlayerUI := GetPlayerUI[AsPlayer] then: UIData:heartbeat_warning_ui = heartbeat_warning_ui{} UIData.CreateCanvas() PlayerUI.AddWidget(UIData.Canvas, player_ui_slot{ZOrder := 1}) if (set WarningUI[PropAgent] = UIData) {} # Aktiviert die Herzschlag-VFX und SFX für den angegebenen Spieler Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # Ruft den Charakter ab, der verwendet wird, um die Position des Prop-Agent in der Szene zu finden Character := PropAgent.GetFortCharacter[] then: # Setzt die Position der Herzschlag-VFX auf die Position des Prop-Agent. HeartBeatVFXData.Activate(Character.GetTransform()) # Inkrementiert die Herzschlag-Zahl; wenn dies der erste Herzschlag ist, müssen wir den Ton abspielen, um ihn zu starten set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # Registriert den Prop-Agent beim Audioplayer, so dass der Herzschlag-Ton von dieser Position aus abgespielt wird. SFXPlayer.Register(PropAgent) else: Logger.Print("Charakter, Index oder HeartBeatVFXData nicht gefunden. Kann Herzschlag nicht starten.") # Löscht die Herzschlag-VFX und SFX für den angegebenen Prop-Agent Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Herzschlag wird deaktiviert.") # Deaktiviert die visuellen VFX-Effekte HeartBeatVFXData.Deactivate() # Hebt die Registrierung des Prop-Agent beim Audioplayer auf, wodurch der Herzschlag-Ton gestoppt wird. SFXPlayer.Unregister(PropAgent) # Dekrementiert den Herzschlagzähler. Dieser Zähler sollte nie unter 0 fallen. set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 # Löscht die Herzschlag-VFX und SFX für alle Prop-Agents DisableAll():void = Logger.Print("Alle Herzschläge werden deaktiviert.") # Iteriert durch alle VFX und verschiebt sie auf 0,0,0 for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # Hebt die Registrierung aller Spieler aus dem Herzschlag-Audio auf SFXPlayer.UnregisterAll() # Reinitialisiert den Herzschlag-Zähler auf 0 set NumberOfHeartBeats = 0 # Die Klasse heartbeat_warning_ui enthält eine Struktur von Daten, um die UI-Canvas und text_block pro Spieler zu verfolgen, sowie die Funktion, um einen neuen Herzschlag-Warnung-UI-Canvas zu erstellen. heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # Erzeugt die UI-Canvas für die Warnmeldung CreateCanvas():void = set Text = text_block{DefaultTextColor := NamedColors.White, DefaultShadowColor := NamedColors.Black} set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.5, Y := 0.75}, Maximum := vector2{X := 0.5, Y := 0.75}} Versätze := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.5, Y := 1.0} SizeToContent := true Widget := Text -
Dieser Code erstellt eine Methode
Activate()in der Klasseheartbeat_vfx, die ein Transform-Argument annimmt und das VFX-Spawner-Gerät zu diesemtransformbewegt.# Die Klasse heartbeat_vfx enthält eine Struktur von Daten, um die Stamm- und vfx_spawner_device-Objekte der VFX pro Spieler zu verfolgen, sowie die Funktionen, um die VFX auf eine Position zu setzen oder sie zurückzusetzen. heartbeat_vfx := class<concrete>: @editable # Das VFX-Gerät für jeden Herzschlag VFXDevice:vfx_spawner_device = vfx_spawner_device{} # Dieser Versatz wird verwendet, um den Herzschlag über dem Kopf des Prop-Agent zu positionieren HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} # Setzt die Position der Herzschlag-VFX und aktiviert dann die VFX. Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() -
Dieser Code erstellt eine
Deactivate()-Methode in der Klasseheartbeat_vfx, die das VFX-Spawner-Gerät deaktiviert und somit die Herzschlaganzeige ausblendet.# Die Klasse heartbeat_vfx enthält eine Struktur von Daten, um die Stamm- und vfx_spawner_device-Objekte der VFX pro Spieler zu verfolgen, sowie die Funktionen, um die VFX auf eine Position zu setzen oder sie zurückzusetzen. heartbeat_vfx := class<concrete>: @editable # Das VFX-Gerät für jeden Herzschlag VFXDevice:vfx_spawner_device = vfx_spawner_device{} # Dieser Versatz wird verwendet, um den Herzschlag über dem Kopf des Prop-Agent zu positionieren HeartBeatVFXOffset:vector3 = vector3{X := 0.0, Y := 0.0, Z := 110.0} # Setzt die Position der Herzschlag-VFX und aktiviert dann die VFX Activate(Transform:transform):void = VFXPosition := Transform.Translation + HeartBeatVFXOffset if (VFXDevice.TeleportTo[VFXPosition, Transform.Rotation]): VFXDevice.Enable() # Deaktiviert die VFX und blendet die Herzschlaganzeige aus Deactivate():void = VFXDevice.Disable()
Heartbeat-Warnung für einen Spieler anzeigen
Befolge diese Schritte, um eine benutzerdefinierte Benutzeroberfläche mit einem Textblock einzurichten, der die Heartbeat-Warnmeldung anzeigt. Siehe In-Game-Benutzeroberflächen, um mehr über die Erstellung von benutzerdefinierten UI und anderen UI-Komponenten in Verse zu erfahren.
-
Die beiden folgenden Konstanten steuern den Text, der den Spielern des Prop-Teams zu verschiedenen Zeitpunkten im Spiel angezeigt wird.
-
Die Konstante
HeartBeatWarningMessageist eine Funktion, die eineintannimmt und den Typmessagezurückgibt. Dieser Typ wird in UI-Elementen verwendet, da er lokalisiert werden kann. Dies ist der Text, den die Spieler sehen, wenn sie sich bewegen müssen, um zu vermeiden, dass ihr Herzschlag-Effekt ihre Position verrät. -
Die Konstante
HeartBeatWarningClearist eine leeremessage, die angezeigt wird, damit die Spieler die Warnmeldung nicht mehr sehen.
# Diese Nachrichten werden verwendet, um einem Prop-Agenten mit einer Nachricht mitzuteilen (oder diese zu verbergen), wenn er sich bewegen muss, damit sein Herzschlag nicht sichtbar wird. HeartBeatWarningMessage<localizes>(Time:int):message = "Herzschlag in {Time} Sekunden. Beweg dich!" HeartBeatWarningClear<localizes>:message = "" -
-
Erstelle eine neue Klasse mit dem Namen
heartbeat_warning_uiin heartbeat.verse. Die Klasse heartbeat_warning_ui enthält eine Struktur von Daten, um die UI-Canvas und text_block pro Spieler zu verfolgen, sowie die Funktion, um einen neuen Heartbeat-Warnung-UI-Canvas zu erstellen.# Die Klasse heartbeat_warning_ui enthält eine Struktur von Daten, um die UI-Canvas und text_block pro Spieler zu verfolgen, sowie die Funktion, um einen neuen Herzschlag-Warnung-UI-Canvas zu erstellen. heartbeat_warning_ui := class: var Canvas:canvas = canvas{} var Text:text_block = text_block{} # Erzeugt die UI-Canvas für die Warnmeldung CreateCanvas():void = set Text = text_block{DefaultTextColor := NamedColors.White, DefaultShadowColor := NamedColors.Black} set Canvas = canvas: Slots := array: canvas_slot: Anchors := anchors{Minimum := vector2{X := 0.5, Y := 0.75}, Maximum := vector2{X := 0.5, Y := 0.75}} Versätze := margin{Top := 0.0, Left := 0.0, Right := 0.0, Bottom := 0.0} Alignment := vector2{X := 0.5, Y := 1.0} SizeToContent := true Widget := Text
Heartbeat-Effekte verwalten
Befolge diese Schritte, um den Heartbeat-Manager zu erstellen.
-
Mit dem nachstehenden Code wird in heartbeat.verse eine Klasse namens
heart_beaterstellt. Diese Klasse stellt dem prop_hunt-Gerät die bearbeitbaren Eigenschaften für den Heartbeat zur Verfügung und verwaltet die Heartbeat-Effekte.log_heart_beat := class(log_channel){} # Diese Klasse stellt die bearbeitbaren Eigenschaften für den Heartbeat dem prop_hunt-Gerät zur Verfügung. heart_beat := class<concrete>(): Logger:log = log{Channel:=log_heart_beat} @editable MoveTime:float = 15.0 - Dieser Code fügt der Klasse
heart_beatdie folgenden bearbeitbaren Eigenschaften hinzu.-
Dieser Code steuert die Sekunden, bevor sich ein Prop-Agent bewegen muss, bevor der Heartbeat-Effekt seine Position verrät.
@editable MoveTime:float = 15.0-
Dieser Code steuert die verbleibenden Sekunden, bevor auf dem Bildschirm eine Warnung für ein Mitglied des Prop-Teams erscheint mit der Aufforderung, sich zu bewegen, bevor der Herzschlag ausgelöst wird.
@editable WarningTime:float = 5.0 -
Dieser Code ist ein Array von Heartbeat-VFX-Geräten. Es gibt eines pro Spieler.
@editable AgentVFX:[]heartbeat_vfx = array{} -
In diesem Code wird das Radioplayer-Gerät zum Abspielen der Herzschlag-Soundeffekte (SFX) verwendet.
@editable SFXPlayer:radio_device = radio_device{}
-
-
-
Dieser Code ordnet jedem Prop-Agent eine Benutzeroberfläche zur Anzeige der Heartbeat-Warnung zu.
# Diese Karte ordnet jedem Prop-Agent eine Benutzeroberfläche für die Anzeige der Herzschlag-Warnung zu. var WarningUI:[agent]heartbeat_warning_ui = map{} -
Dieser Code verfolgt, wie viele Spieler einen aktiven Heartbeat haben, damit wir das SFX-Gerät verwalten können.
# Behält im Auge, wie viele Spieler einen aktiven Herzschlag haben, damit wir das SFX-Gerät verwalten können var NumberOfHeartBeats:int = 0 -
Dieser Code zeigt die Warn-UI für Spieler an.
# Richtet die Herzschlag-Benutzeroberfläche für den Agenten ein SetUpUI(PropAgent:agent):void = if: not WarningUI[PropAgent] AsPlayer := player[PropAgent] PlayerUI := GetPlayerUI[AsPlayer] then: UIData:heartbeat_warning_ui = heartbeat_warning_ui{} UIData.CreateCanvas() PlayerUI.AddWidget(UIData.Canvas, player_ui_slot{ZOrder := 1}) if (set WarningUI[PropAgent] = UIData) {} -
Dieser Code aktiviert die visuellen Effekte (VFX) und die Soundeffekte (SFX) für den angegebenen Player.
# Aktiviert die Herzschlag-VFX und SFX für den angegebenen Spieler Enable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = if: # Ruft den Charakter ab, der verwendet wird, um die Position des Prop-Agent in der Szene zu finden Character := PropAgent.GetFortCharacter[] then: # Setzt die Position der Herzschlag-VFX auf die Position des Prop-Agent HeartBeatVFXData.Activate(Character.GetTransform()) # Inkrementiert die Herzschlag-Zahl; wenn dies der erste Herzschlag ist, müssen wir den Ton abspielen, um ihn zu starten set NumberOfHeartBeats += 1 if (NumberOfHeartBeats = 1) then SFXPlayer.Play() # Registriert den Prop-Agent beim Audioplayer, sodass der Herzschlag-Ton von dieser Position aus abgespielt wird SFXPlayer.Register(PropAgent) else: Logger.Print("Charakter, Index oder HeartBeatVFXData nicht gefunden. Kann Herzschlag nicht starten.") -
Dieser Code erstellt eine Methode, um die VFX und SFX für einen Spieler zu deaktivieren, und eine andere, um sie für alle Spieler zu deaktivieren.
# Löscht die Herzschlag-VFX und SFX für den angegebenen Prop-Agent Disable(PropAgent:agent, HeartBeatVFXData:heartbeat_vfx):void = Logger.Print("Herzschlag wird deaktiviert.") # Deaktiviert die visuellen VFX-Effekte HeartBeatVFXData.Deactivate() # Hebt die Registrierung des Prop-Agent vom Audioplayer-Gerät auf, wodurch der Herzschlag-Ton gestoppt wird SFXPlayer.Unregister(PropAgent) # Dekrementiert den Herzschlagzähler. Dieser Zähler sollte nie unter 0 fallen. set NumberOfHeartBeats -= 1 if (NumberOfHeartBeats < 0) then set NumberOfHeartBeats = 0 # Löscht die Herzschlag-VFX und SFX für alle Prop-Agents DisableAll():void = Logger.Print("Alle Herzschläge werden deaktiviert.") # Iteriert durch alle VFX und verschiebt sie auf 0,0,0 for (HeartBeatVFXDevice : AgentVFX): HeartBeatVFXDevice.Deactivate() # Hebt die Registrierung aller Spieler aus dem Herzschlag-Audio auf SFXPlayer.UnregisterAll() # Reinitialisiert den Herzschlag-Zähler auf 0 set NumberOfHeartBeats = 0