Dernière mise à jour : 28/10/2019 à 13h35

Current Project : Who knows?

Index des tutoriaux

Introduction aux scripts IA

Ce tutorial vous montrera comment manipuler les scripts IA à travers la création d'un .u2s simple et en expliquant quelques commandes.

Scene de base

Préparation

créez le dossier où vous enregistrerez vos .u2s (voir le tutorial approprié), nous appellerons celui-ci "u2stutorial". Téléchargez le niveau de ce tutorial ICI. C'est une simple pièce avec 4 PathNode, un playerstart, une light et un Light Marine. J'ai paramétré le MapName en "u2stutorial" pour faire le lien avec le dossier que nous venons de créer.

Testez. Le marine erre sans but (il est autonome), car il n'a pas de script. Dans ces conditions, le code IA prend le relais et réagis aux stimulis externes (vue/audition d'un ennemi, etc.)

Créez un fichier texte "marine01.u2s" dans "../Scripts/u2stutorial". Ce sera le script auquel se référera la marine. Faites attention, certains éditeurs de texte ajoute un .txt ) la fin du nom du fichier.

Ouvrez les propriétés du Marine. Dans l'onglet AI, chercher le champ "CommandFileName". Mettez "marine01" (sans extension!) et sauvegardez. Le marine sait où chercher son script.

Une patrouille

Ajoutez les lignes suivantes au fichier "marine01.u2s" puis sauvez-le.


sleep 2
gotoactor PathNode0
gotoactor PathNode1
sleep 2
gotoactor PathNode2
agentcall Event_U_Wave 1
gotoactor PathNode3
sleep

Testez et observez. Quand le jeu commence, le marine attend pendant deux secondes, cours vers le PathNode0, le PathNode1 (où il attend deux autres secondes), puis le PathNode2 (où il joue l'animation "Event_U_Wave"). Puis il court au Pathnode3, où il s'arrête pour de bon.

Jetons un oeil aux commandes utilisées (les paramètres entre parenthèses sont nécessaires, ceux entre crocher sont optionnels):
sleep [une durée en seconde] - Dit à un NPC d'attendre x secondes. Si vous ne spécifiez pas de temps, le NPC attendra jusqu'à la fin de la partie, ou jusqu'à ce qu'un évènement vienne le perturber.
gotoactor (actor) - Dit au NPC de se déplacer vers un actor. Vous devez utiliser le nom de l'objet, pas son tag. Le nom de l'actor est dans les propriétés de l'actor, sous l'onglet Object. Gotoactor est une commande à latence, c'est à dire que le script s'arrête tant que l'action spécifiée n'a pas été finie (tant que le NPC n'a pas rejoint sa destination).
agentcall (nom de l'action) (0/1) - joue une action d'agent, que vous pouvez considérer comme une animation (plus sur ces actions à la Golem University). 1 donne une latence à l'action agentcall (Le NPC n'exécute pas la suite du script tant qu'il n'a pas fini l'action), 0 ne donne pas de latence, et le NPC entame immédiatement la suite des commandes. Vous pouvez voir la différence en mettant "agentcall Event_U_Wave 0" dans votre script et en testant : le marine va commencer son animation et commencer tout de suite la suite de son chemin.

Les Labels

Vous pouvez créer des "labels" et les utiliser pour vous y référer en interne dans le script (par exemple pour faire des suites d'actions se suivant en boucle.

Ajoutez deux lignes à votre script et supprimez la dernière, afin que votre script soit comme ceci :


:MarinePatrol
sleep 2
gotoactor PathNode0
gotoactor PathNode1
sleep 2
gotoactor PathNode2
agentcall Event_U_Wave 1
gotoactor PathNode3
gotolabel MarinePatrol
Testez et constatez. Vous définissez un label en ajoutant le ":" au début d'une ligne, et vous pouvez y aller tout de suite avec la commande "gotolabel".

Vous pouvez aussi appeler des labels. Le script va se rendre au label, l'exécuter, puis revenir à la ligne de l'appel et exécuter la suite du script où il y a eu un appel quand il arrivera à la commande return.


:WaitABit
sleep 5
call PatrolThisArea
sleep 3
gotolabel WaitABit

:PatrolThisArea
gotoactor PathNode0
gotoactor PathNode1
return
Ce script fait attendre le marine 5 secondes, puis aller au PathNode0, au PathNode1, attendre 3 secondes puis recommencer.

Messages et débogage

Pour mieux comprendre ce qui se passe, vous pouvez faire apparaitre des messages. Ils n'apparaitront à l'écran que si vous avez activé la console de débogage.

Modifiez votre script comme ceci:


:MarinePatrol
message "sleeping 2 seconds"
sleep 2
message "going to pathnode 0, then PathNode1"
gotoactor PathNode0
gotoactor PathNode1
message "sleeping 2 seconds"
sleep 2
message "going to pathnode 2"
gotoactor PathNode2
message "waving!"
agentcall Event_U_Wave 1
gotoactor PathNode3
message "starting over"
gotolabel MarinePatrol
Quand vous jouerez votre map, le script vous dira "Note that "gotoactor" and "sleep" are latent commands". Vous devez afficher le message de ce que le NPC va faire avant de lui faire exécuter.

Un moyen plus facile est d'utilise le mod débogage du jeu vous pouvez lire à ce sujet le tutorial sur le mode Debug. Supprimez tout les messages du script et ajoutez la ligne "debugmode 11" au tout début, avant le label :MarinePatrol. Jouez et regardez.

Quelque commande supplémentaire

Voici quelques commandes choisies pour leur utilité (bon d'accord, choisies au hasard ;)), indiquées par le "->" (n'ajoutez pas la flèche dans votre script):

Transformez votre script comme ceci:


:MarinePatrol
sleep 2
gotoactor PathNode0
-> turntoactor Light0
-> fire 2
-> firealt 2
gotoactor PathNode1
sleep 2
-> setmovespeed 0.5
gotoactor PathNode2
-> setmovespeed 1
agentcall Event_U_Wave 1
gotoactor PathNode3
gotolabel MarinePatrol
Explanation:
turntoactor (actor) - Dit à un NPC de se tourner vers un actor.
fire (duration) - Fait tirer un NPC pendant x secondes.
firealt (duration) - LE NPC tire en mode secondaire pendant x secondes.
setmovespeed - Change la vitesse du NPC

Events

Les events sont des outils importants pour les scripts IA. Voici un petit résumé :

Il y a déjà un trigger dans la map qui envoi l'event "ChangeMarinePatrol". Pour pouvoir actionner un NPS, vous devez mettre Trigger=>bTriggerNPCs=>Vrai. Le marine ne réagira pas parce qu'on ne lui a pas dit quoi faire.

J'ai un peu simplifié le script précédent. Supprimez tout le contenu de votre script et mettez :


:MarinePatrol
ontrigger ChangeMarinePatrol gotolabel MarinePatrol2
gotoactor PathNode0
gotoactor PathNode1
sleep 2
gotolabel MarinePatrol

:MarinePatrol2
ontrigger ChangeMarinePatrol gotolabel MarinePatrol
gotoactor PathNode2
gotoactor PathNode3
sleep 2
gotolabel MarinePatrol2
Jouez la map. Le marine joue le label MarinePatrol en boucle jusqu'à ce qu'il soit activé par le trigger, puis joue MarinePatrol2 en boucle.

Explications:

ontrigger (event) gotolabel (label) - le script saute au label spécifié quand le NPC reçoit l'event choisi. Les ontrigger qui peuvent survenir après écrasent systématiquement l'ancien, donc vous pouvez utiliser un seul event pour faire faire plusieurs choses au marines (c'est d'ailleurs comme ça que fonctionne le script ci-dessus).

Tutorial de Matthias Worch.

2005-2022, by Hellkeeper.

Valid XHTML 1.1 CSS 2.1