Techniques avancées de Script IA
A la demande générale, voici quelques techniques de script .u2s. En revanche, aucun tutorial ne peut remplacer la lecture de la documentation sur L'IA, alors je vous suggère de vous y référer. Jetez aussi un oeil aux scripts du jeu. Si vous n'arrivez pas à faire quelque chose, essayez de trouver une technique de ce genre utilisé quelque part dans le jeu et ouvrez les scripts de cette map.
Voici une liste de ce que nous allons voir:
- Décisions aléatoires
- Rencontres aléatoires en utilisant "setlocation"
- Trouver des actors dynamiquement et y envoyer le NPC
Décisions aléatoires
Vous pouvez introduire un facteur de hasard dans votre script en utilisant la commande "testrandom". Voila comment cela fonctionne : testrandom génère un nombre aléatoire compris entre 0 et 1, et vous permet de faire sauter le script à un label suivant le résultat. Voici un exemple:
testrandom 0.5 gotolabel Conséquence2
gotolabel Conséquence2
:Conséquence1
[...]
:Conséquence2
[...]
Si le chiffre généré est supérieur ou égal à 0.5, le script sautera au label "Conséquence 1. Sinon, l'exécution continuera normalement (et le script passera donc au label Conséquence 2). Remarquez que vous n'avez pas besoin d'ajouter un gotolabel après le testrandom pour passer à Conséquence2, mais cela rend le script plus clair en créant une cassure nette, plus facile à lire.
Bien sur, vous pouvez avoir plus de conséquences:
testrandom 0.66 gotolabel Conséquence1
testrandom 0.66 gotolabel Conséquence2
gotolabel Conséquence3
Ici, il y a 33% de sauter à chaque label. Remarquez que vous créez un nouveau chiffre aléatoire à chaque fonction testrandom, mais qu'à la fin, le résultat est le même. 33% de chances d'avoir un premier effet et 33% de chances d'en avoir un autre font qu'automatiquement, vous avez 33% de chances d'avoir un troisième effet.
Note aussi que vous utilisez le chiffre 0.66 pour avoir 33% de chances ! le testrandom réussis si le chiffre généré est plus grand ou égal à la valeur spécifiée. Dans notre cas, ce sera entre 0.66 et 1 (donc à peu près une chance sur trois). Vous pouvez aussi appeler des labels avec testrandom :
testrandom 0.5 gotolabel Conséquence1
gotoactor PathNode3
[...]
:Conséquence1
gotoactor PathNode1
return
Ici, il y a 50% de chances que l'IA saute au label Conséquence1 (et marche vers PathNode1), puis revienne (et se rende ensuite vers Pathnode3). Dans 50% des cas, il ira directement à PathNode3 en sautant le label Conséquence1.
Rencontres aléatoires avec "setlocation"
Setlocation Vous permet de téléporter un NPC à n'importe quel endroit de la map. Vous mettez simplement "setlocation PathNode11" et le NPC y apparaitra. Vous pouvez utiliser cette commande pour tout un tas de choses, mais l'une des plus intéressantes est le placement des ennemis. Disons que vous avez un chemin linéaire qui mène à trois pièces, et qu'un Skaarj doit se trouver quelque part sur le chemin. Vous pouvez rendre le passage intéressant à refaire en rendant l'emplacement du Skaarj aléatoire.
testrandom 0.66 gotolabel TeleportPiece1
testrandom 0.66 gotolabel TeleportPiece12
setlocation PathNode3 //Pathnode dans la pièce #3
sleep
:TeleportPiece11
setlocation PathNode1 //Pathnode dans la pièce #1
sleep
:TeleportPiece12
setlocation PathNode2 //Pathnode dans la pièce #2
sleep
Le moteur ne vérifie pas la visibilité du point où se téléporte le NPC, alors faites en sorte que les PathNodes ne soient pas visibles au moment de la téléportation, sinon le Skaarj apparaitra d'un coup dans le viseur du joueur.
Si vous avez besoin de rendre le spawn invisible, utilisez un PawnFactory et des SpawnPoints. L'implémentation du testrandom marche mieux sur les NPC qui se trouvent déjà dans le Level et ont besoin d'un script complexe (bien que vous puissiez assigner un script à des PawnFactory, mais c'est un autre sujet). Je préfère cette méthode parce qu'elle est plus simple que celle des SpawnPoints (enfin je trouve :)).
Trouver des actors à la volée et s'y rendre
FindActor est une super petite commande que vous pouvez utiliser pour de super effets. En l'utilisez vous pouvez rechercher en cours de jeux des actors définis dans un certain radius, et y amener les NPC avec des gotoactor found.
FindActor est assez complexe et propose plein de paramètres, étudions-les points par points. Voici la description dans la documentation sur l'IA:
FindActor [NomdeCible [Min [Max [TypedeDistance [Visibilité [Nombre [gotolabel/Appel label ciblé]]]]]]]
Les crochets indiquent des paramètres facultatifs, que nous n'avons pas à spécifier à chaque fois. Une simple utilisation de FindActor pourrait ressembler à ça :
FindActor engine.pathnode 32 1024 1
gotoactor found
Ainsi, le NPC recherchera des PathNodes dans un rayon commençant à 32unités et s'arrêtant à 1024 unités. le paramètre (1) signifie que le spécimen le plus proche est enregistré et gardé en mémoire dans la variable "found". La seconde ligne est une ligne utilisée pour envoyer le NPC en direction de l'actor trouvé.
Cet exemple devrait vous éclairer sur les possibilités quid écoulent de l'utilisation de cette commande. Vous pourriez par exemple, créer un scientifique terrifié qui suis le joueur, mais s'enfuit au moindre signe de danger et se rend à la cachette la plus proche (des actors spéciaux que vous auriez placé dans le niveau, dans notre cas, des ShadowNodes). Voici comment vous pourriez procéder (les // indiquent des commentaires non traités par le script) :
:SuivreJoueur
onevent SeeEnemy gotolabel ChercherCachette
gotoactor Player 128 // Suit le joueur à 128 unités
sleep 3
gotolabel SuivreJoueur //Au cas où le NPC rejoint le joueur, attendre 3 secondes et recommencer.
:ChercherCachette
FindActor U2AI.ShadowNode 0 2048 1 gotolabel Cacher // Se rendre au label Cacher si on trouve on ShadowNode
message "pas de cache trouvée, continue l'exécution" // Pas d'actor adéquats dans un rayon de 2047 unités
sleep 1
gotolabel SuivreJoueur
:Cacher
gotoactor found 64 // Approche le ShadowNode à 64 unités
FindActor // Vide la mémoire
setstance crouching
onevent SeePlayer gotolabel SuivreJoueur
Ajoutez deux lignes au début et à la fin du script et supprimez la dernière commande pour obtenir ceci :
FindActor u2.alarmtrigger 0.0 4096.0 0 0 0 gotolabel useit // Trouve au premier dans un rayon de 4000 unités, sans test de visibilité
FindActor u2.alarmtrigger 0.0 4096.0 1 0 0 gotolabel useit // Trouve au plus proche dans un rayon de 4000 unités, sans test de visibilité
FindActor u2.alarmtrigger 0.0 4096.0 2 0 0 gotolabel useit // Trouve au plus loin dans un rayon de 4000 unités, sans test de visibilité
FindActor u2.alarmtrigger 0.0 4096.0 3 0 2 gotolabel useit // Trouve tout dans un rayon de 4000 unités, sans test de visibilité, en en comptant deux au maximum
FindActor u2.alarmtrigger 0.0 0.0 2 0 0 gotolabel useit // Se rend au plus loin, sans test de visibilité
FindActor u2.alarmtrigger 0.0 0.0 2 1 0 gotolabel useit // Se rend au plus loin visible
Téléchargez cette archive pour plus d'information sur les scripts IA (en anglais).
Tutorial de Matthias Worch.