C'est le script de comportement d'un PNJ qui détermine son comportement. Le script de comportement est ce qui indique aux personnages quelles actions entreprendre dans le monde, par exemple, où aller, quoi combattre et comment interagir avec d'autres personnages. Les personnages tels que les gardes et la faune sauvage peuvent avoir des comportements supplémentaires, tels que la perception, la vigilance et la capacité d'être recrutés ou apprivoisés.
Un comportement de PNJ est un script Verse défini par l'utilisateur qui ajoute des fonctionnalités supplémentaires aux comportements existants d'un PNJ. L'API npc_behavior vous permet de définir le code qui s'exécute lorsqu'un PNJ apparaît ou disparaît ; vous pouvez l'utiliser pour créer des personnages personnalisés tels que des médecins, des commerçants ou des boss. Les comportements des PNJ héritent de la classe abstraite npc_behavior et vous devez importer le module /Fortnite.com/AI pour les utiliser.
Pour exécuter un script de comportement de PNJ, vous devez le joindre à une définition de personnage PNJ. Le mode d'interaction d'un script de comportement de PNJ avec une définition de personnage dépend du type de PNJ. Les PNJ personnalisés ont besoin d'un script de comportement pour effectuer des actions, tandis que les PNJ de type garde et faune sauvage exécuteront leur comportement par défaut s'ils ne se voient pas attribuer de script de comportement. Pour plus d'informations sur la création d'une définition de personnage PNJ et les différents types de personnages, consultez la page Définition de personnage.
Ce tutoriel couvre les bases de la création d'un script de comportement de PNJ et vous apprend à faire apparaître un PNJ et à le diriger vers un objectif.
Créer un nouveau script de comportement de PNJ
Procédez comme suit pour créer un script de comportement de PNJ dans l'UEFN qui fait apparaître un garde et le fait patrouiller entre deux points.
Ouvrez votre projet dans l'UEFN puis, dans la barre de menus, accédez à Verse > Explorateur Verse.
Dans l'explorateur Verse, faites un clic droit sur le nom de votre projet et choisissez Ajouter un nouveau fichier Verse au projet pour ouvrir la fenêtre Créer le script Verse.
Dans la fenêtre Créer le script Verse, cliquez sur Comportement de PNJ pour le sélectionner comme modèle.
Nommez votre comportement de PNJ en remplaçant le texte du champ Nom du comportement de PNJ par le nom de votre appareil. Dans cet exemple, l'appareil est nommé my_first_npc_behavior.
Cliquez sur Créer pour créer le fichier Verse.
Dans l'explorateur Verse, double-cliquez sur le nom de votre fichier Verse pour l'ouvrir dans Visual Studio Code.
Enregistrez votre code, compilez-le et créez une nouvelle définition de personnage PNJ. Pour plus d'informations sur la création d'un personnage PNJ, consultez la page Définition de personnage.
Assignez votre script
my_first_behaviorcomme comportement Verse de votre nouvelle définition de personnage.Cliquez sur Lancer une session dans la barre d'outils de l'UEFN pour tester votre niveau. Lorsque vous testez votre niveau, les personnages générés par votre générateur de PNJ doivent choisir un point aléatoire à proximité lorsqu'ils apparaissent et se diriger vers celui-ci. Une fois ce point atteint, ils doivent attendre un certain temps avant de revenir à leur point de départ. Si vous avez activé l'option Affichage de débogage Verse activé dans l'appareil Paramètres de l'île, vous devriez voir apparaître des flèches qui indiquent où le personnage concentre son attention, ainsi que des boîtes qui indiquent le point vers lequel un personnage se dirige.
Navigatable
Vous pouvez utiliser l'API Navigatable pour diriger les personnages vers certaines cibles et pour exécuter certaines actions comme patrouiller, monter la garde ou suivre un autre personnage. Les PNJ de type garde peuvent le faire avec les nœuds AI Patrol Path, mais ici vous utiliserez le code Verse pour étendre cette fonctionnalité à tout type de personnage et éviter de placer des appareils supplémentaires dans le niveau. L'interface navigatable du personnage permet de diriger les personnages vers une cible navigation_target, que vous pouvez créer à partir d'un agent ou d'une position. Les PNJ de type Personnalisé, Garde et Faune sauvage peuvent tous utiliser l'interface navigable. Pour récupérer l'interface navigatable d'un personnage, vous devez d'abord obtenir une référence à son fort_character en appelant GetFortCharacter[].
# Get the Navigatable Interface, this allows you to tell it to move.
Navigatable := Character.GetNavigatable[]
Dans l'exemple du modèle, le code choisit une position à partir d'un décalage aléatoire où le personnage apparaît et l'enregistre dans une variable GoToPoint. Il crée ensuite une cible navigatoin_target à partir de GotToPoint et du point d'apparition du personnage.
# 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 := AIDebugDrawTime)
# Create a navigation target from these two positions that the navigation interface can use.
NavTargetStart := MakeNavigationTarget(GoToPoint)
La fonction NavigateTo() renvoie une énumération navigation_result, qui contient des informations indiquant si le personnage a atteint sa cible navigation_target ou non. Vous pouvez vérifier la valeur de votre navigation_result pour affecter aux personnages des comportements selon qu'ils ont atteint leur cible ou non.
# 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)Pour en savoir plus sur la façon dont les personnages se déplacent dans le monde et pour visualiser les différentes zones accessibles aux personnages, consultez la page Maillage de navigation.
Focus
Lorsque les personnages effectuent des actions, ils regardent des cibles spécifiques. La cible spécifique qu'un personnage regarde est le focus du personnage. Les personnages se focalisent sur le personnage à qui ils parlent, la cible qu'ils attaquent ou la position vers laquelle ils se déplacent. L'interface focus_interface vous permet de spécifier des cibles spécifiques sur lesquelles vos personnages peuvent se focaliser. Les PNJ de type personnalisé, garde et faune sauvage peuvent tous utiliser l'interface de focalisation (focus). La fonction MaintainFocus() focalise votre personnage sur une cible, qui peut être une position vector3 ou un agent. L'interface focus_interface fait partie de l'interface fort_character et vous pouvez la récupérer en utilisant GetFocusInterface[].
# Get the Focus Interface, this allows you to tell it to look at something or somewhere.
Focus := Character.GetFocusInterface[]
Dans l'exemple du modèle, après que le personnage a commencé à retourner à la position de départ, le code utilise MaintainFocus() pour le forcer à se focaliser sur la cible navigation_target précédente. Cela amène le personnage à marcher à reculons et à regarder derrière lui pendant qu'il revient à son point de départ.
# 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)
Leashable
Lorsque des gardes protègent un objectif, vous devez vous assurer qu'ils restent dans une zone autour de l'objectif et qu'ils ne s'en éloignent pas trop. L'interface fort_leashable est une interface propre aux PNJ de type garde qui vous permet de spécifier un rayon autour d'une cible que les gardes ne dépasseront pas pendant leur patrouille. Vous pouvez tenir les gardes en laisse à des positions spécifiques ou vis-à-vis d'autres PNJ, et les gardes mettront à jour leur position pour rester près de leur cible de laisse si elle se déplace. Notez qu'actuellement les PNJ de type Personnalisé et Faune ne peuvent pas utiliser l'interface fort_leashable. Vous pouvez récupérer l'interface fort_leashable en utilisant GetFortLeashable[].
# Get the Leash Interface, which lets you confine a guard to a certain area.
Leashable := Character.GetFortLeashable[]
Vous pouvez tenir les gardes en laisse à des positions spécifiques ou vis-à-vis d'autres agents, par exemple pour protéger un point de capture ou un PNJ important. Chaque laisse possède un InnerRadius et un OuterRadius qui précisent respectivement les distances, en centimètres, auxquelles les gardes peuvent se tenir par rapport à la cible de leur laisse. L'exemple du modèle n'utilise pas l'interface leashable, mais elle pourrait vous être utile lors de la création de vos gardes PNJ.
# 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()
Affichage de débogage
En haut du fichier, ce modèle définit un canal dédié au dessin de débogage. Vous pouvez utiliser le dessin de débogage pour visualiser certaines données de jeu à des fins de test. Par exemple, vous pouvez visualiser la portée de visibilité de votre personnage ou dessiner une forme autour de l'emplacement vers lequel il se déplace. Vous devez activer l'option Affichage de débogage Verse dans l'onglet Débogage des Paramètres de l'île pour visualiser ces formes de débogage ; celles-ci ne seront pas visibles dans les expériences publiées. Le canal en haut du fichier vous permet de masquer, afficher ou effacer toutes les formes de débogage d'un canal en utilisant une seule méthode.
# Create a dedicated debug channel to draw to for this behavior
npc_debug_draw := class(debug_draw_channel) {}
La classe modèle new_npc_behavior définit plusieurs valeurs utilisées pour la visualisation et le déplacement.
MoveToWaitDurationdéfinit le temps, en secondes, pendant lequel votre personnage attend à un point avant de se déplacer.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.0DistanceFromSpawnPtoMovedéfinit la portée du décalage aléatoire du point d'apparition pour le déplacement de votre personnage.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.0La valeur logique
ShowAIDebugpermet d'activer ou de désactiver l'affichage des formes de débogage dans l'éditeur.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 = trueLe float
AIDebugDrawTimepermet de spécifier la durée du rendu de l'emplacement d'affichage de débogage.Verse# How long in seconds to render the debug draw location and print text. # It is recommended to keep this in sync with MoveToWaitDuration otherwise the print will not be shown if a previous message is displayed. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} AIDebugDrawTime:float = 5.0Le float
LookAtDebugDrawDurationpermet de spécifier la durée de rendu d'affichage de débogage de la flèche de regard.Verse# How long in seconds to render the look at arrow's debug draw. LookAtDebugDrawDuration:float = 0.5Le canal
DebugDrawNPCdéfinit l'instance d'affichage de débogage, et utilise le canal défini en haut du fichier.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.5Enfin,
VerticalOffsetToNPCHeaddéfinit le décalage entre le bassin et la tête du PNJ à partir duquel sera affichée la flèche de regard du débogage. Sans ce décalage, la flèche de regard de débogage serait dessinée à partir du centre du PNJ.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
Deux fonctions dans la classe modèle new_npc_behavior affichent des formes de débogage. La fonction DrawDebugLocation() affiche un grand point à une position spécifiée pendant une durée 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 )
La fonction DrawDebugLookAt() vous permet de visualiser la direction vers laquelle un personnage regarde en affichant une flèche de la tête de l'agent vers son point d'observation.
# 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,
Ajouter votre personnage au niveau
Maintenant que vous en savez plus sur le script de comportement des PNJ, il est temps de créer un personnage et d'utiliser le script sur une île. Le flux de travail suivant est conçu pour les personnages de type garde, mais le script de comportement de PNJ fonctionnera également pour les personnages de type personnalisé et de type faune sauvage.
Créez une nouvelle définition de personnage PNJ nommée MyFirstCharacterDefinition. Cliquez sur votre nouvelle définition de personnage pour ouvrir l'écran Définition de personnage.
Dans l'écran Définition de personnage, modifiez les propriétés suivantes :
Sous Type de personnage PNJ, définissez Type sur Garde. L'interface des gardes vous permet d'accéder à des fonctionnalités spécifiques aux gardes, telles que des événements lorsque le garde est alerté ou a des soupçons, et vous permet de recruter des gardes à utiliser comme alliés. Les gardes peuvent également s'équiper d'armes, tandis que les personnages de type personnalisé et faune sauvage ne le peuvent actuellement pas. Vous pouvez également modifier le nom de votre personnage dans l'onglet Nom.
Sous Comportement de personnage PNJ, définissez Comportement sur Comportement Verse. Ensuite, définissez le script de comportement PNJ sur
my_first_npc_behavior. Votre personnage aura toujours accès aux fonctionnalités de l'interface des gardes, mais utilisera votre script Verse pour décider quoi faire pendantOnBeginetOnEnd.Dans l'onglet Modificateurs, sous Modificateur d'apparition de garde, cliquez sur l'onglet Cosmétique pour modifier l'apparence de votre personnage. Vous pouvez choisir un cosmétique préexistant ou activer l'option Reciblage cosmétique des personnages pour utiliser un modèle personnalisé. Notez que seuls les gardes et les personnages de type personnalisé peuvent utiliser le reciblage cosmétique des personnages, ce qui n'est pas le cas de la faune sauvage. Pour plus d'informations sur les modificateurs de personnage et ceux qui s'appliquent aux différents types de personnage, consultez la page Définition de personnage PNJ.
Sur l'onglet Modificateurs, cliquez sur Ajouter un élément pour ajouter un nouveau modificateur à votre personnage. Remplacez le type du nouveau modificateur par Modificateur d'inventaire. Notez que seuls les gardes peuvent utiliser le modificateur d'inventaire.
Sous Modificateur d'inventaire, cliquez sur Ajouter un élément pour ajouter un nouvel objet à l'inventaire de votre personnage. Définissez l'option Définition de l'objet sur une arme, un objet ou tout autre élément que votre personnage devrait avoir. Vous pouvez ajouter plusieurs objets à l'inventaire de vos personnages pour qu'ils puissent utiliser des armes pour se battre, des objets pour se soigner, etc.
Sur l'onglet Modificateurs, cliquez sur Ajouter un élément pour ajouter un nouveau modificateur à votre personnage. Remplacez le type du nouveau modificateur par Modificateur de l'IU.
Sous Modificateur de l'IU, cliquez sur l'onglet Nom pour modifier le nom de votre personnage. Le nom de votre personnage s'affichera au-dessus de sa tête.
Enregistrez votre définition de personnage PNJ. Dans le navigateur de contenu, faites glisser votre définition de PNJ dans le niveau. Cela créera automatiquement un nouveau générateur de PNJ et lui attribuera votre définition de personnage.
Sélectionnez votre générateur de PNJ. Dans l'organisateur, sous Options utilisateur :
Définissez Nombre à faire apparaître sur 20. Vous aurez besoin de quelques gardes pour vous aider, alors amusez-vous et maximisez vos chances.
Cliquez sur Lancer une session dans la barre d'outils de l'UEFN pour tester votre niveau. Lors du test, votre personnage doit apparaître et patrouiller entre son point de départ et un point aléatoire à proximité tout en attaquant les ennemis en chemin.
À vous de jouer
Dans ce guide, vous avez appris à créer un script de comportement de PNJ pour personnaliser vos personnages non-joueurs. Pour en savoir plus et apprendre à créer des types de personnages et de scénarios spécifiques, consultez les tutoriels ci-dessous sur le comportement des PNJ.