Dieses Feature befindet sich derzeit im Early Access. Du kannst eine Insel mit diesem Feature veröffentlichen. Beachte jedoch, dass Änderungen, die während der Early-Access-Phase durchgeführt werden, deine Insel beschädigen können und möglicherweise dein aktives Eingreifen erfordern.
NPC-Spawnpunkte benötigen eine Bindungslebenszeittrack im Sequencer. Es besteht keine Möglichkeit, diesen Track nachträglich zu bestehenden Sequenzen hinzuzufügen, die vor 31.00 erstellt wurden. Du musst alle Inseln, die einen NPC-Spawner in einer Sequenz verwenden, erneut veröffentlichen, nachdem du den Bindungslebenszeittrack hinzugefügt hast.
So fügst du eine Bindungslebenszeittrack hinzu:
-
Klicke auf das Symbol + neben dem NPC-Spawnpunkt in der Spurliste.
-
Wähle *Bindungslebenzeit im Dropdown-Menü aus.
Verwende den Sequencer, um benutzerdefinierte Charakteranimationen zu erstellen, die auf zahlreiche Arten und auf mehreren Geräten wiedergegeben werden können, einschließlich dem NPC-Spawnpunkt-Gerät. Verwende entweder Events oder den Sequencer in Kombination mit Filmsequenz-Geräten, um Animationen mit bestimmten Verhaltensweisen entlang ausgewählter Punkte im KI-Patrouillenweg festzulegen und wiederzugeben.
Du kannst benutzerdefinierte Animationen aus Unreal Engine (UE) importieren und migrieren, einschließlich MetaHumans. Dazu musst du möglicherweise ein Retargeting des Skelett-Mesh durchführen, damit es auf die NPC-Charaktere passt, da Fortnite-Charaktere ihre eigene Skelettstruktur haben.
MetaHuman-Charaktere sind speicherintensiv. Daher solltest du die Anzahl der verwendeten MetaHuman-Assets so weit wie möglich beschränken.
Animieren der NPCs mit Sequencer
Das NPC-Spawnpunkt-Gerät eröffnet dir viel Möglichkeiten der Gameplay-Kreativität für dein Projekt, von interaktiven Charakteren bis zu informativen Zwischensequenzen. Erstelle mit dem Control-Rig benutzerdefinierte Animationen für den NPC-Spawnpunkt oder importiere Animationen, die du erworben oder in anderer Software erstellt hast.
Du kannst auch mit dem FK-Control-Rig NPCs mit einer Retarget-Animation animieren oder sie Emotes ausführen lassen.
In der UE-Dokumentation erfährst du mehr über die FK-Control-Rig-Animations-Workflows.
Befolge die nachstehenden Schritte, um Animationen mit NPC-Charakteren zu erfassen.
-
Klicke mit der rechten Maustaste in den Inhaltsbrowser, um eine Levelsequenz zu erstellen.
-
Benenne die Miniaturansicht deiner Levelsequenz um.
-
Doppelklicke auf die Levelsequenz-Miniaturansicht, um denSequencer-Editor zu öffnen.
-
Klicke auf +Spur und wähle Actor zu Sequencer > NPC-Spawnpunkt aus. Damit wird das NPC-Spawnpunkt-Gerät zur Levelsequenz-Spur hinzugefügt
Du kannst das NPC-Spawnpunkt-Gerät aus dem Outliner in die Spurliste ziehen, um es zur Levelsequenz hinzuzufügen.
-
Klicke auf das Symbol + neben dem NPC-Spawnpunkt-Gerät in der Spurliste und wähle Control-Rig > Control-Rig-Klassen > FK-Control-Rig aus. Damit wird das NPC-Skelett zur Spur hinzugefügt, wodurch du Zugriff auf die einzelnen Bones des Skeletts erhältst, um sie zu verändern und aufzuzeichnen.
-
Wähle die zu bewegenden Bones im Viewport, Animations-Outliner oder Sequencer aus und bewege sie in die Ausgangsposition für deine Animation.
-
Lege den erste Keyframe fest, indem du neben den bewegten Bones auf das +-Symbol klickst.
Wenn du über eine Animation verfügst, die du als FBX-Animationssequenz-Datei erstellt oder erworben hast, kannst du diese Dateien in der Zeitleiste zur Animationsspur eines NPC-Spawnpunkt-Geräts hinzufügen, indem du auf das +-Symbol neben dem NPC-Spawnpunkt klickst und Animation > Animationsdatei auswählst.
Bewege die Bones weiter und lege weitere neue Keyframes in der Sequencer-Zeitleiste fest, bis deine Animation abgeschlossen ist. Spiele die Animation im Sequencer ab, wenn sie fertig ist, um sicherzustellen, dass die Bewegung deinen Vorstellungen entspricht.
Du kannst eine Animation ganz einfach rückwärts laufen lassen, indem du mit der rechten Maustaste in der Zeitleiste auf die Animationsdatei klickst und Eigenschaften > Umkehren auswählst.
Wenn du mit den Ergebnissen zufrieden bist, kannst du das Baking der Animation an das Skelett-Mesh durchführen. Klicke mit der rechten Maustaste auf den NPC-Spawnpunkt und wähle Animationssequenz baken.
Stelle sicher, dass die Glieder deines Skelett-Mesh nicht durch andere Teile des Skelett-Mesh-Körpers schneiden, wenn du die Animation wiedergibst.
Aufzeichnen von Verhaltensattributen
Du kannst auch Verhaltensattribute mit dem NPC-Spawnpunkt-Gerät verwenden. Die Verhaltensoptionen bestimmen die Basismerkmale, die der NPC von Fortnite Battle Royale-NPCs erbt. Diese Merkmale bestimmen, ob der NPC wie ein Wächter oder ein Wildtier agiert.
Weitere Informationen zum Festlegen der Verhaltensattribute mit dem NPC-Spawnpunkt-Gerät findest du im Dokument NPC-Charakterdefinition.
Wenn du diese Verhaltensattribute festgelegt hast, kannst du Keyframes für die Animationen in einer Levelsequenz erstellen und sie im Gameplay in einem Filmsequenz-Gerät wiedergeben. Im Gegensatz zu den oben erläuterten Schritten musst du die Performance nicht in das Control-Rig baken, da das Verhalten in den Optionen den NPC-Spawnpunkt-Geräts festgelegt ist.
Du kannst auch die erstellte Animation oder das vererbte Verhalten mit dem KI-Patrouillenweg-Knotenpunkt-Gerät verwenden und aufzeichnen, wie der NPC dem Pfad folgt, den du mit dem Filmkamera-Actor erstellst.
Spawnbare und eretzbare NPC-Bindungen
Es gibt nun zwei neue Möglichkeiten, um einen NPC euren Sequenzen hinzuzufügen: Die spawnbare NPC-Bindung und die ersetzbare NPC-Bindung. Diese Bindungen werden von NPC-Charakterdefinitionen erstellt.
Spawnbare NPC-Bindung
Mithilfe einer Filmsequenz kann die spawnbare NPC-Bindung einen Akteur basierend auf einer NPC-Charakterdefinition in die Welt spawnen. Dieser NPC kann im Sequencer auf die gleiche Weise animiert werden wie jedes andere Skelett-Mesh.
Um eine spawnbare NPC-Bindung zu erstellen, ziehe einfach deine NPC-Charakterdefinition in den Sequencer:
GIF zum Vergrößern anklicken.
Die spawnbare Bindung kann wie jeder andere Skelett-Mesh-Akteur animiert werden. Zum Beispiel:
-
Klicke auf + Animation und wähle ein Tanz-Emote für die NPC-Charakterdefinition aus.
GIF zum Vergrößern anklicken.
-
Verschiebe deinen Abspielkopf weiter nach vorne, ziehe deinen NPC an eine neue Position und setze einen neuen Keyframe. Der NPC wird sich jetzt von A nach B bewegen.
GIF zum Vergrößern anklicken.
Ersetzbare NPC-Bindung
Die ersetzbare NPC-Bindung übernimmt die Kontrolle über einen NPC, der in der Welt gespawnt wird, und füge ihn in deine Sequenz ein. Anschließend kannst du im Sequencer erstellte Animationen ausführen. Während der NPC an den Sequenzer gebunden ist, werden sein Verhalten, seine Wahrnehmung und seine Pfadverfolgung angehalten. Diese werden fortgesetzt, wenn der NPC ungebunden wird.
Der NPC wird an seinen ursprünglichen Standort zurückgesetzt, wenn er nicht länger gebunden ist.
Um eine ersetzbare NPC-Bindung zu erstellen, erstelle eine spawnbare NPC-Bindung, klicke mit der rechten Maustaste auf deine Bindung und wähle Ausgewählte Bindung konvertieren in > Ersetzbarer NPC-Charakter.
GIF zum Vergrößern anklicken.
Nach der Konvertierung wird der Track durch einen Bindungslebenszeittrack ersetzt. Alle an der spawnbaren Bindung vorgenommenen Änderungen bleiben erhalten.
Damit der NPC während des Spiels gefunden und gebunden werden kann, musst du der NPC-Charakterdefinition einen Modifikator hinzufügen: den Sequenzermodifikator. Du kannst dies mit der gleichen Methode wie andere Modifikatoren zu deiner NPC-Charakterdefinition hinzufügen. Wenn du diesen Modifikator nicht hinzufügst, tritt bei der Validierung ein Fehler auf.
GIF zum Vergrößern anklicken.
Der Sequenzer-Modifikator verfügt über die Eigenschaft Einzigartige Kennung. Diese Eigenschaft wird zum Finden des NPCs im Spiel verwendet. Der Standardwert ist der Name der NPC-Charakterdefinition. Beachte, dass, wenn zwei verschiedene NPC-Charakterdefinitionen über dieselbe einzigartige Kennung verfügen, beide gebunden werden können, wenn deine Sequenz im Spiel abgespielt wird.
Abspielen von Filmsequenzen im Spiel
Zum Abspielen deiner Sequenzen verwende wie gewohnt das Gerät für Filmsequenzen.
Eine spawnbare Bindung benötigt zum Spielen keine weiteren Einstellungen.
Für eine ersetzbare Bindung musst du deiner Welt einen NPC-Spawner hinzufügen, der deine NPC-Charakterdefinition verwendet. Wenn die ersetzbare Bindung keinen NPC zum Binden findet, wird in deinem Client-Protokoll die folgende Zeile angezeigt:
LogFortNPCMovieSceneBindings: Warnung: Eine Bindung an einen Pawn mithilfe des NPC Character Definition Guard ist nicht möglich. Stelle sicher, dass mindestens einer gespawnt wurde.
Wenn du den NPC zum selben Zeitpunkt erscheinen lassen möchtest, zu dem deine Sequenz abgespielt werden soll. Erwäge die Verwendung einer spawnbaren Bindung oder verknüpfe das Bei gespawntem Ereignis mit der Play-Funktion auf dem Filmsequenz-Gerät.
Benutzerdefinierte Blueprint-NPCs
Die meisten NPC-Typen werden als Skelett-Meshes gebunden, mit Ausnahme einer NPC-Charakterdefinition, die einen benutzerdefinierten Blueprint verwendet.

Dadurch wird der Blueprint gebunden und zusätzliche Komponenten wie VFX werden verfügbar gemacht, die dann im Sequenzer geändert werden können.
Hier kannst du sehen, dass ein Niagara-Partikelsystem im Sequencer modifiziert wurde, um den Kopf des NPCs explodieren zu lassen:
GIF zum Vergrößern anklicken.
Bekannte Einschränkungen
- Ersetzbare NPC-Bindungen können nur verwendet werden, wenn das Filmsequenz-Gerät auf Sichtbarkeit: Alle eingestellt ist. Bei Verwendung einer anderen Sichtbarkeitseinstellung schlägt die Validierung fehl.
- Der Versuch, eine ersetzbare NPC-Bindung mit reitbaren oder zähmbaren wilden NPCs zu verwenden, schlägt bei der Validierung fehl.
- Ersetzbare NPC-Bindungen, die eine NPC-Charakterdefinition verwenden, können die Option Status beibehalten erzwingen bei der Benutzeroption Abschlussstatus überschreiben beenden nicht verwenden. Der Versuch, diese Option zu verwenden, schlägt die Validierung fehl.
- Wenn ein NPC durch den Sequenzer gebunden ist, rastet er ein. Darüber hinaus können Latenzprobleme zu sehr kurzen visuellen Fehlern führen, wenn der NPC gebunden und wieder losgebunden wird. Aus diesem Grund wird dringend empfohlen, bei der Verwendung einer ersetzbaren NPC-Bindung Techniken wie das Spawnen des NPC außerhalb des Bildschirms, Bildschirmausblendungen, VFX oder die Sichtbarkeitsspur zu verwenden.
Aufrufen von Animationen mit Verse
Indem du Animationen mit der Asset-Reflexion für Verse freigibst, kannst du mit dem Animationsmodul benutzerdefinierte Animationen auf deinen NPCs wiedergeben.
Interface des Animationcontrollers
Über das Interface play_animation_controller
kannst du eine Animation auf einem Charakter wiedergeben, die mit der Funktion GetPlayAnimationController()
abgerufen werden kann. Dieses Interface gibt zwei Funktionen frei, die Animationen wiedergeben. Die synchrone Funktion Play()
und die asynchrone Funktion PlayAndAwait()
.
Beide Funktionen nehmen die folgenden Parameter an:
Option | Wert | Beschreibung |
---|---|---|
Animation | Animation auswählen | Die wiederzugebende Animation. Du musst eine Animation in der Datei Assets.digest.verse . |
PlayRate | 1,0, Wiedergaberate auswählen | Die Geschwindigkeit, mit der die Animation wiedergegeben wird. Der Wert 1,0 entspricht der Standardgeschwindigkeit der Animation. |
BlendInTime | 0,0, Einblendzeit auswählen | Wie lange die vorherige Animation in die aktuelle überblendet wird |
BlendOutTime | 0,0, Ausblendzeit auswählen | Wie lange die aktuelle Animation in die nächste überblendet wird |
StartPositionSeconds | 0,0, Startposition in Sekunden auswählen | Die Position in Sekunden, ab der die Animation wiedergegeben werden soll |
Funktion „Play and Await“
Die Funktion PlayAndAwait()
gibt eine Animation asynchron wieder und gibt eine Instanz der Enum play_animation_result
wieder, die die drei Werte Completed
, Interrupted
und Error
enthält. Diese entsprechen einer abgeschlossenen Animation, einer Animation, die unterbrochen wurde, bzw. dem Auftreten eines Fehlers. Durch das Abfragen dieser Enum kannst du basierend auf dem Ergebnis deiner Animation Code ausführen.
AnimationResult := PlayAnimController.PlayAndAwait(MyAnimation)
case(AnimationResult):
play_animation_result.Completed => Print("Animation abgeschlossen!")
play_animation_result.Interrupted => Print("Animation unterbrochen.")
play_animation_result.Error => ("Fehler während der Animation aufgetreten.")
Funktion Play
Die Funktion Play()
wird synchron ausgeführt und gibt eine Instanz der Klasse playing_animation_instance
zurück. Mit der Klasse playing_animation_instance
kannst du eine laufende Animation abfragen und verändern. Sie enthält die folgenden Werte:
Wert | Erläuterung |
---|---|
GetState() | Diese Funktion gibt den aktuellen Status der Animationswiedergabe in einer play_animation_state -Enum zurück. |
Stop() | Diese Funktion stoppt die aktuelle Animation. |
CompletedEvent | Dieses Event wird ausgelöst, wenn eine Animation abgeschlossen wird. |
InterruptedEvent | Dieses Event wird ausgelöst, wenn eine Animation unterbrochen wird. |
BlendedInEvent | Dieses Event wird ausgelöst, wenn eine Animation das Ausblenden abgeschlossen hat. |
BlendingOutEvent | Dieses Event wird ausgelöst, wenn eine Animation das Ausblenden beginnt. |
Await() | Diese Funktion wartet darauf, dass die Animation abgeschlossen oder unterbrochen wird. Bemerkenswert ist, dass dies eine play_animation_result -Enum zurückgibt und dass es funktional mit dem Aufruf von PlayAndAwait() identisch ist. |
Du kannst mit der Play()
-Funktion laufende Animationen verändern oder Code ausführen, wenn bestimmte Bedingungen in deiner Animation erfüllt sind.
# Gib eine Animation synchron wieder und ruf ihre Animationsinstanz ab.
AnimationInstance := PlayAnimController.Play(MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Abonniere eine Funktion, die ausgeführt wird, wenn die Animation abgeschlossen ist.
AnimationInstance.CompletedEvent.Subscribe(OnAnimationComplete)
Sleep(1.0)
AnimationState := AnimationInstance.GetState()
# Stoppe die Animation, wenn sie nach einer Sekunde noch läuft.
if(AnimationState = play_animation_state.BlendingOut):
AnimationInstance.Stop()
Beispiel für die Wiedergabe einer Animation
Der folgende Code zeigt ein Beispiel für das NPC-Verhalten, das eine Animation mit dem Animationsmodul wiedergibt. Beachte, dass alle benutzerdefinierten Animationen, die du auf deinen Charakteren wiedergeben möchtest, zuerst über die Asset-Reflexion für Verse freigegeben werden und in der Datei Assets.digest.verse
erscheinen müssen. In diesem Beispiel befindet sich die Animation MyAnimation im Animationsmodul des benutzerdefinierten Charakters MyCharacter in Assets.digest.verse. Daher wird sie über MyCharacter.Animations.MyCharacter aufgerufen.
using { /Fortnite.com/AI }
using { /Fortnite.com/Animation/PlayAnimation }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
basic_play_anim_example := class(npc_behavior):
# Die Geschwindigkeit, mit der die Animation wiedergegeben wird
@editable
PlayRate : float = 1.0
# Wie lange die vorherige Animation in
# die aktuelle überblendet werden soll
@editable
BlendInTime : float = 0.25
# Wie lange die aktuelle Animation in
# die nächste überblendet werden soll
@editable
BlendOutTime : float = 0.25
# Die Position in Sekunden, ab der die
# Animation wiedergegeben werden soll
@editable
StartPositionSeconds : float = 0.0
# Wie lange gewartet werden soll, bevor die Animation neu gestartet wird
@editable
SleepDuration : float = 2.0
OnBegin<override>()<suspends>:void=
if:
# Ruf den Animationscontroller des NPC-Charakters ab
Agent := GetAgent[]
FortCharacter := Agent.GetFortCharacter[]
PlayAnimController := FortCharacter.GetPlayAnimationController[]
then:
AnimationResult := PlayAnimController.PlayAndAwait(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Drucke das Ergebnis der Animationsausführung aus.
case(AnimationResult):
play_animation_result.Completed => Print("Animation abgeschlossen!")
play_animation_result.Interrupted => Print("Animation unterbrochen.")
play_animation_result.Error => ("Fehler während der Animation aufgetreten.")
Sleep(SleepDuration)
# Gib eine Animation synchron wieder und ruf ihre Animationsinstanz ab.
AnimationInstance := PlayAnimController.Play(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
Sleep(SleepDuration)
AnimationState := AnimationInstance.GetState()
# Drucke den aktuellen Status der Animation aus.
case(AnimationState):
play_animation_state.Playing => Print("Animation wird wiedergegeben!")
play_animation_state.BlendingIn => Print("Animation wird eingeblendet!")
play_animation_state.BlendingOut => Print("Animation wird ausgeblendet!")
play_animation_state.Completed => Print("Animation abgeschlossen!")
play_animation_state.Stopped => Print("Animation gestoppt!")
play_animation_state.Interrupted => Print("Animation unterbrochen!")
play_animation_state.Error => Print("Fehler während der Animation aufgetreten")
else:
Print("Animationscontroller konnte nicht abgerufen werden")