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.
Das Verhalten eines NPC-Charakters wird durch sein Verhaltensskript definiert. Das Verhaltensskript gibt den Charakteren vor, welche Aktionen sie in der Welt ausführen sollen, z. B. wohin sie gehen, was sie bekämpfen und wie sie mit anderen Charakteren interagieren sollen. Charaktere wie Wächter und Wildtiere können zusätzliche Verhaltensweisen haben, wie z. B. Wahrnehmung, Wachsamkeit und die Fähigkeit, angeheuert oder gezähmt zu werden.
Ein NPC-Verhalten ist ein benutzerdefiniertes Verse-Skript, das den bestehenden Verhaltensweisen eines NPC-Charakters zusätzliche Funktionalitäten hinzufügt. Mit der npc_behavior
-API kannst du Code definieren, der ausgeführt wird, wenn ein NPC-Charakter spawnt oder de-spawnt, und du kannst damit benutzerdefinierte Charaktere wie Sanitäter, Ladenbesitzer oder Bosse erstellen. NPC-Verhaltensweisen erben von der abstrakten Klasse npc_behavior
und erfordern zur Nutzung den Import von /Fortnite.com/AI
des Moduls `/Fortnite.com/AI`.
Um ein NPC-Verhaltensskript auszuführen, musst du es an eine NPC-Charakterdefinition ankoppeln. Wie ein NPC-Verhaltensskript mit einer Charakterdefinition interagiert, hängt vom NPC-Charaktertyp ab. Benutzerdefinierte NPCs brauchen ein Verhaltensskript, um Aktionen auszuführen, während NPCs vom Typ Wächter und Wildtier ihr Standardverhalten ausführen, wenn sie kein Verhaltensskript erhalten. Weitere Informationen zur Erstellung einer NPC-Charakterdefinition und zu den verschiedenen Charaktertypen findest du auf der Seite Charakterdefinition.
In diesem Tutorial werden die Grundlagen für die Erstellung eines NPC-Verhaltensskripts erläutert und du lernst, wie du einen NPC spawnen und ihn zu einem Ziel navigieren kannst.
Ein neues NPC-Verhaltensskript erstellen
Befolge diese Schritte, um ein NPC-Verhaltensskript in UEFN zu erstellen, das einen Wächter spawnen und zwischen zwei Punkten patrouillieren lässt.
Öffne dein Projekt in UEFN und gehe dann in der Menüleiste zu Verse > Verse-Explorer.
Klicke im Verse-Explorer mit der rechten Maustaste auf deinen Projektnamen und wähle Neue Verse-Datei zum Projekt hinzufügen aus, um das Fenster Verse-Script erstellen zu öffnen.
Klicke im Fenster „Verse-Skript erstellen“ auf NPC-Verhalten, um es als Vorlage auszuwählen.
Benenne dein NPC-Verhalten, indem du den Text im Feld NPV-Verhalten Name in den Namen deines Geräts änderst. In diesem Beispiel heißt das Gerät my_first_npc_behavior.
Klicke auf Erstellen, um die Verse-Datei zu erstellen.
Doppelklicke im Verse-Explorer auf den Namen deiner Verse-Datei, um sie in Visual Studio Code zu öffnen.
Speichere deinen Code, kompiliere ihn und erstelle eine neue NPC-Charakterdefinition. Weitere Informationen zur Erstellung eines NPC-Charakters findest du auf der Seite Charakterdefinition.
Weise dein Skript
my_first_behavior
als Verse-Verhalten deiner neuen Charakterdefinition zu.Klicke auf Sitzung starten in der UEFN-Symbolleiste, um dein Level zu testen. Wenn du dein Level testest, sollten die Charaktere, die von deinem NPC-Spawner gespawnt werden, einen zufälligen Punkt in der Nähe des Spawners auswählen und dorthin navigieren. Wenn sie diesen Punkt erreichen, sollten sie eine bestimmte Zeit warten und dann zu ihrem Ausgangspunkt zurück navigieren. Wenn du Verse-Debugging-Zeichnen aktiviert im Insel-Einstellungen-Gerät aktiviert hast, solltest du Pfeile sehen, die anzeigen, worauf der Charakter seinen Fokus richtet, sowie Boxen, die den Punkt anzeigen, zu dem ein Charakter navigiert.
Navigierbar
Du kannst die Navigatable
nutzen, um Charaktere zu bestimmten Zielen zu führen sowie für Dinge wie Patrouillen, das Bewachen eines Punktes oder das Verfolgen eines anderen Charakters. NPCs vom Typ Wächter können dies mit KI-Patrouillenwegknoten tun, aber hier verwendest du Verse, um diese Funktionalität auf jeden Typ von Charakter auszuweiten und zu vermeiden, dass zusätzliche Geräte im Level platziert werden. Das navigatable
-Interface des Charakters erlaubt es dir, Charaktere zu einem navigation_target
zu navigieren, das du aus einem agent
oder einer position
erstellen kannst. Alle benutzerdefinierten, Wächter- und Wildtier-NPCs können das „navigatable“-Interface nutzen. Um das navigatable
-Interface des Charakters zu erhalten, musst du zuerst eine Referenz auf seinen fort_character
holen. Das kannst du tun, indem du GetFortCharacter[]
aufrufst.
# Get the Navigatable Interface, this allows you to tell it to move.
Navigatable := Character.GetNavigatable[]
In dem Vorlagenbeispiel wählt der Code eine Position aus einem zufälligen Versatz, an dem der Charakter spawnen soll, und speichert sie in der Variable GoToPoint
. Es erstellt dann ein navigatoin_target
sowohl aus dem GotToPoint
als auch aus dem Spawnpunkt des Charakters.
# Create a random offset from the spawn point to walk toward.
GoToPoint := NPCSpawnPoint + vector3{X := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
Y := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
Z := 0.0 }
if(ShowAIDebug?):
Print(my_first_npc_behavior_message_module.OnNavigateBeginMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTi
# Create a navigation target from these two positions that the navigation interface can use.
NavTargetStart := MakeNavigationTarget(GoToPoint)
Die Funktion NavigateTo()
gibt ein navigation_result
-Enum zurück, das Informationen darüber enthält, ob der Charakter sein navigation_target
erreicht hat. Du kannst den Wert deines navigation_result
prüfen, um Charakteren Verhaltensweisen zu geben, die darauf basieren, ob sie ihr Ziel erreicht haben oder nicht.
# Check to see if something has interfered with the NPC reaching the intended location and print a
# message to the output log.
if (NavResultGoTo <> navigation_result.Reached):
if(ShowAIDebug?):
Print(my_first_npc_behavior_message_module.OnNavigateErrorMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTime)
else:
# Once it arrives at its location, wait for this duration in seconds
Navigatable.Wait(?Duration := MoveToWaitDuration)
Weitere Informationen darüber, wie die Charaktere durch die Welt navigieren und wie die verschiedenen Gebiete visualisiert werden, zu denen die Charaktere navigieren können, findest du auf der Seite Navigationsmesh.
Fokus
Wenn Charaktere Aktionen durchführen, schauen sie auf bestimmte Ziele. Das Ziel, das ein Charakter anschaut, ist der Fokus des Charakters. Charaktere fokussieren den Charakter, mit dem sie sprechen, das Ziel, das sie angreifen, oder die Position, zu der sie navigieren. Mit dem focus_interface
kannst du bestimmte Ziele angeben, die deine Charaktere fokussieren sollen. Alle benutzerdefinierten, Wächter- und Wildtier-NPCs können das Fokus-Interface nutzen. Die Funktion MaintainFocus()
fokussiert deinen Charakter auf ein Ziel, das entweder eine vector3
-Position oder ein agent
sein kann. Das focus_interface
ist Teil des fort_character
-Interface, und du kannst es mit GetFocusInterface[]
abrufen.
# Get the Focus Interface, this allows you to tell it to look at something or somewhere.
Focus := Character.GetFocusInterface[]
In dem Vorlagenbeispiel verwendet der Code MaintainFocus()
, nachdem der Charakter beginnt, zur Ausgangsposition zurück zu navigieren, um den Fokus auf das vorherige navigation_target
zu setzen. Dadurch geht der Charakter rückwärts und sieht hinter sich, während er zu seinem Ausgangspunkt zurückkehrt.
# Leveraging concurrency to wait until the NPC reaches its destination, while the calls to look back at its origin point
# and drawing a debug arrow never completes, continuing, ensures only the NavigateTo can win the race.
NavResultGoToNext := race:
# Move back to its starting position.
Navigatable.NavigateTo(NavTargetEnd)
# Sets NPC to look at its previous position which will make it walk backwards.
# This is meant to show the utility of the focus interface.
block:
Focus.MaintainFocus(GoToPoint)
Anleinbar
Wenn Wächter ein Objekt bewachen, solltest du sicherstellen, dass sie in einem Gebiet um das Objekt bleiben und nicht zu weit weglaufen. Das fort_leashable
-Interface ist ein spezifisches Interface für Wächter-NPCs, mit dem du einen Radius um ein Ziel festlegen kannst, das die Wächter beim Patrouillieren nicht verlassen können. Du kannst Wächter an bestimmte Positionen oder andere NPCs anleinen, und die Wächter aktualisieren ihre Position, um in der Nähe ihres angeleinten Ziels zu bleiben, wenn es sich bewegt. Beachte, dass benutzerdefinierte und Wildtier-NPC-Charaktere das fort_leashable
-Interface derzeit nicht nutzen können. Du kannst das fort_leashable
-Interface mit GetFortLeashable[]
abrufen.
# Get the Leash Interface, which lets you confine a guard to a certain area.
Leashable := Character.GetFortLeashable[]
Du kannst Wächter entweder an Positionen oder an andere Agenten anleinen, z. B. wenn du einen Eroberungspunkt bewachen oder einen wichtigen NPC schützen willst. Jede Leine hat einen InnerRadius
und einen OuterRadius
, die angeben, wie nah bzw. wie weit in Zentimetern die Wächter von ihrem Ziel entfernt bleiben sollen. Das Vorlagenbeispiel verwendet das leashable
-Interface nicht, aber du könntest es nützlich finden, wenn du deine eigenen Wächter-NPCs erstellst.
# Leash the guard to a position so they stay between 500 and 1000
# cm of the position they're leashed to
Leashable.SetLeashPosition(NPCSpawnPoint, InnerRadius := 500.0, OuterRadius := 1000.0)
# Leash the guard to an agent so they stay between 500 and 1000
# cm of the agent they're leashed to
Leashable.SetLeashAgent(AgentToFollow, InnerRadius := 500.0, OuterRadius := 1000.0)
# Clear all leashes on the guard
Leashable.ClearLeash()
Debugging-Zeichnen
Oben in der Datei definiert diese Vorlage einen eigenen Kanal für Debugging-Zeichnen. Mit dem Debug Draw kannst du bestimmte Spieldaten zu Testzwecken visualisieren. Du kannst zum Beispiel den Bereich der Sichtbarkeit deines Charakters visualisieren oder eine Form um die Position zeichnen, zu der er reist. Verse Debugging-Zeichnen muss im Tab Debugging in den Insel-Einstellungen aktiviert werden, um diese Debugging-Formen zu visualisieren, und sie werden nicht in veröffentlichten Erlebnissen erscheinen. Mit dem Kanal oben in der Datei kannst du alle Debugging-Formen in einem Kanal mit einer einzigen Methode ausblenden, anzeigen oder löschen.
# Create a dedicated debug channel to draw to for this behavior
npc_debug_draw := class(debug_draw_channel) {}
Die Vorlage new_npc_behavior
definiert mehrere Werte, die für Visualisierung und Bewegung verwendet werden.
Die
MoveToWaitDuration
definiert, wie lange in Sekunden dein Charakter an einem Punkt wartet, bevor er sich bewegt.Verse# How long to wait in seconds after the NPC navigates to a point before moving on. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5}, MaxValue:=option{10.0} MoveToWaitDuration:float = 5.0
DistanceFromSpawnPtToMove
definiert den Bereich des zufälligen Versatzes vom Spawnpunkt, in dem sich dein Charakter bewegen soll.Verse# The negative min and absolute max x & y coordinate offset in centimeters to tell the NPC to move to @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.0} DistanceFromSpawnPtToMove:float = 1500.0
Mit dem Wert der
ShowAIDebug
-Logik kannst du das Zeichnen von Debugging-Formen im Editor einschalten.Verse# Whether to draw debug to the NPC channel when Verse Debug Draw is enabled in Island Settings. @editable: Categories:=array{my_first_npc_behavior_message_module.SettingsCategory} ShowAIDebug:logic = true
Mit dem Float
AIDebugDrawTime
kannst du die Zeit angeben, die zum Rendern der Debugging-Zeichnen-Position benötigt wird.~~(verse) # Wie lange in Sekunden wird die Position des Debugging-Zeichnens gerendert und Text gedruckt. # Es wird empfohlen, dies mit MoveToWaitDuration synchron zu halten, da der Ausdruck sonst nicht angezeigt wird, wenn eine vorherige Nachricht angezeigt wird. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} AIDebugDrawTime:float = 5.0 ~~
Mit dem Float
LookAtDebugDrawDuration
kannst du festlegen, wie lange der Debugging-Blickpfeil gerendert werden soll.Verse# How long in seconds to render the look at arrow's debug draw. LookAtDebugDrawDuration:float = 0.5
Der Kanal
DebugDrawNPC
definiert die Debugging-Zeichnen-Instanz und benutzt den Kanal, der oben in der Datei definiert ist.Verse# How long in seconds to render the look at arrow's debug draw. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} LookAtDebugDrawDuration:float = 0.5
Schließlich definiert
VerticalOffsetToNPCHead
den Versatz von der Hüfte des NPCs zum Kopf, von dem aus der Debugging-Blickpfeil gezeichnet werden soll. Ohne diesen Versatz würde der Debugging-Blickpfeil vom Zentrum des NPCs aus gezeichnet werden.Verse# Used for specifying a point offset from the NPC pelvis to the head to draw the look at arrow from. VerticalOffsetToNPCHead<private>:float = 55.0
Zwei Funktionen in der Vorlageklasse new_npc_behavior
zeichnen Debugging-Formen. Die Funktion DrawDebugLocation()
zeichnet einen großen Punkt an einer bestimmten Position für eine bestimmte Zeit LookAtDebugDrawDuration.
# This function draws a box around a specified position for a finite amount of time.
# NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
DrawDebugLocation(Location:vector3):void =
DebugDrawNPC.DrawPoint( Location,
?Color := NamedColors.SteelBlue,
?Thickness := 100.0,
?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration,
?Duration := AIDebugDrawTime )
Mit der Funktion DrawDebugLookAt()
kannst du visualisieren, wohin ein Charakter schaut, indem du einen Pfeil vom Kopf des Agents zu seinem Blickpunkt zeichnest.
# This function draws an arrow from the Agent's head to its look at point every half a second.
# NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
DrawDebugLookAt(Character:fort_character, LookAtPoint:vector3)<suspends>:void=
loop:
DebugDrawNPC.DrawArrow( Character.GetTransform().Translation + vector3{ Z := VerticalOffsetToNPCHead},
LookAtPoint,
?ArrowSize := 50.0,
?Color := NamedColors.Yellow,
?Thickness := 5.0,
?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration,
Deinen Charakter zum Level hinzufügen
Nachdem du nun das NPC-Verhaltensskript kennengelernt hast, ist es an der Zeit, einen Charakter zu erstellen und das Skript auf einer Insel anzuwenden. Der folgende Workflow ist für Charaktere vom Typ Wächter gedacht, aber das NPC-Verhaltensskript funktioniert auch für benutzerdefinierte Typen und Wildtier-Charaktere.
Erstelle eine neue NPC-Charakterdefinition mit dem Namen MyFirstCharacterDefinition. Klicke auf deine neue Charakterdefinition, um den Bildschirm Charakterdefinition zu öffnen.
Passe im Bildschirm Charakterdefinition die folgenden Eigenschaften an:
Setze unter NPC-Charaktertyp den Typ auf Wächter. Über das Wächter-Interface hast du Zugang zu wächterspezifischen Funktionalitäten, wie z. B. Events, wenn der Wächter alarmiert oder misstrauisch ist, und du kannst Wächter als Verbündete anheuern. Wächter können auch Waffen ausrüsten, während benutzerdefinierte und Wildtier-Typen dies derzeit nicht können. Du kannst auch den Namen deines Charakters unter dem Tab Name ändern.
Setze unter NPC-Charakterverhalten das Verhalten auf Verse-Verhalten. Setze dann das NPC-Verhaltensskript auf
my_first_npc_behavior
. Dein Charakter hat weiterhin Zugriff auf die Funktionalitäten des Wächter-Interfaces, entscheidet aber mithilfe deines Verse-Skriptes, was er währendOnBegin
undOnEnd
tun soll.Klicke im Tab Modifikatoren unter Wächter-Spawn-Modifikator auf den Tab Kosmetik, um das kosmetische Aussehen deines Charakters anzupassen. Du kannst aus einer bereits vorhandenen Kosmetik auswählen oder Charakterkosmetik-Retargeting aktivieren, um ein benutzerdefiniertes Modell zu verwenden. Beachte, dass nur Wächter und benutzerdefinierte Typen das Kosmetik-Retargeting nutzen können, Wildtiere hingegen nicht. Weitere Informationen über Modifikatoren und welche Modifikatoren auf verschiedene Typen angewendet werden, findest du auf der Seite NPC-Charakterdefinition.
Klicke im Tab Modifikatoren auf Element hinzufügen, um einen neuen Modifikator zu deinem Charakter hinzuzufügen. Ändere den Typ des neuen Modifikators in Inventarmodifikator. Beachte, dass nur Wächter den Inventarmodifikator benutzen können.
Klicke unter Inventarmodifikator auf Element hinzufügen, um ein neues Element zum Inventar deines Charakters hinzuzufügen. Setze die Item-Definition auf eine Waffe, einen Gegenstand oder etwas anderes, das dein Charakter haben soll. Du kannst mehrere Gegenstände zum Inventar deines Charakters hinzufügen, und deine Charaktere werden Waffen zum Kämpfen, Gegenstände zum Heilen usw. benutzen.
Klicke im Tab Modifikatoren auf Element hinzufügen, um einen neuen Modifikator zu deinem Charakter hinzuzufügen. Ändere den Typ des neuen Modifikators in UI-Modifikator.
Klicke unter UI-Modifikator auf die Registerkarte Name, um den Namen deines Charakters zu ändern. Der Name deines Charakters wird über seinem Kopf angezeigt.
Speichere deine NPC-Charakterdefinition. Ziehe im Inhaltsbrowser deine NPC-Charakterdefinition ins Level. Dadurch wird automatisch ein neuer NPC-Spawner erstellt und deine Charakterdefinition wird ihm zugewiesen.
Wähle deinen NPC-Spawner. Im Outliner unter Benutzeroptionen:
Setze Spawn-Anzahl auf 20. Du wirst ein paar Wächter brauchen, die dir helfen, also hab Spaß und schöpfe das Maximum aus.
Klicke auf Sitzung starten in der UEFN-Symbolleiste, um dein Level zu testen. Wenn du spielst, sollte dein Charakter zwischen ihrem Startpunkt und einem zufälligen Punkt in der Nähe spawnen und patrouillieren und alle Feinde auf dem Weg angreifen.
Du bist am Zug
Nach dem Abschluss dieser Anleitung hast du gelernt, wie du ein NPC-Verhaltensskript erstellst, um deine ganz eigenen benutzerdefinierten Charaktere zu erstellen. Wenn du mehr darüber lesen und lernen möchtest, wie du bestimmte Typen von Charakteren und Szenarien erstellst, sieh dir einige der unten aufgelisteten Tutorials zum NPC-Verhalten an.
Tutorials zum NPC-Verhalten
Erstelle deinen eigenen NPC-Sanitäter
Nutze Verse-Code, um einen benutzerdefinierten NPC-Sanitäter zu erstellen.