Warpzones
Définition
Une warpzone est une zone dont le portal affiche une autre zone, physiquement séparée, dans laquelle le joueur peut passer en traversant le portal. Du point de vue du joueur, rien de particulier n'est affiché et le mouvement est normal. Pourtant, le passage à travers le portal mène le joueur ailleurs dans la map. Cela permet le déplacement sans rupture visible entre des zones non contiguës, sans manifester le déplacement d'un lieu à un autre par une transition visible comme avec un téléporteur.
Une warpzone se réalise en créant en deux points du niveau un passage fermé contenant un portal derrière lequel se trouve une WarpZoneInfo. Les deux passages apparaissent séparés dans l'éditeur mais communiquent en jeu. C'est l'espace derrière le portal et contenant la WarpZoneInfo, inaccessible et invisible pour le joueur, qui est nommé warpzone.
Les warpzones sont sujettes à de nombreuses limitations et ne fonctionnent pas de la même façon dans les différentes versions du moteur.
Pour des raisons de clarté et de simplicité, ce tutoriel consiste en une explication détaillée du fonctionnement des warpzones sous l'Unreal Engine 1 suivie d'une explication des différences de comportement sous l'Unreal Engine 2.
Fonctionnement
Une warpzone fonctionne par portals communiquants. À l'arrivée et au départ, deux passages identiques contiennent un portal derrière lequel se trouve une WarpZoneInfo, sous-classe de la ZoneInfo normale.
L'espace entre le portal et le fond doit être plus profond que le rayon du cylindre de collision du joueur afin que le centre de celui-ci puisse passer de l'autre côté. Si cette condition n'est pas remplie, le joueur qui tente d'emprunter la warpzone entre en collision avec le fond et ne peut donc passer entièrement de l'autre côté. Le cylindre de collision du joueur mesure 17 unités de rayon dans Unreal et UT99, c'est donc la profondeur minimale de la warpzone si le joueur doit pouvoir l'emprunter et non simplement voir à travers.
L'utilisation la plus simple des warpzones consiste en la création de deux passages identiques avec chacun un portal et une WarpZoneInfo. Dans l'onglet WarpZoneInfo de leurs propriétés, il suffit de faire correspondre le champ OtherSideURL de l'un au champ ThisTag de l'autre.
Les deux portals doivent être traversés par le joueur dans le même "sens". Si le joueur pénètre par l'avant du premier portal, il doit ressortir, de l'autre côté, par l'arrière du second portal. Dans l'image suivante, le sens du portal est représenté par un segment perpendiculaire. Si d'un côté de la warpzone, le joueur entre par le côté arbitrairement noté "A", il doit ressortir par le côté "B". Dans le cas présent (avec un joueur traversant le portal par le sud et en ressortant par le nord), il n'est pas nécessaire de retourner le portal.
Si le joueur rentre dans le portal par le côté sud et ressort vers le sud également, les deux portals doivent être en sens inverse. L'un des deux doit donc être retourné à 180 degrés.
Si l'orientation n'est pas bonne, le portal affichera un hall of mirrors. Un moyen simple de déterminer l'orientation du portal est de lui appliquer une texture asymétrique. Elle sera affichée normalement d'un côté du portal mais apparaîtra retournée (avec sa gauche et sa droite inversées) de l'autre. La texture de l'actor teleporter, Engine.S_Teleport, s'y prête particulièrement puisqu'elle inclut une flèche.
Notez que sous Unreal avec le patch 227, l'orientation des portals est affichée quand la WarpZoneInfo est sélectionnée. Celle-ci est également reliée par une ligne au portal dont elle dépend.
Si les portals ne sont pas orientés correctement, en plus du hall of mirrors, le joueur restera coincé entre les deux zones. En effet, l'orientation du joueur à la sortie de la warpzone dépend de l'orientation des deux portals. Si le joueur rentre dans le premier portal du côté A et sort du second par le même côté A, il arrive dans la seconde zone en faisant face au portal de sortie (comme s'il s'était instantanément retourné à 180 degrés). En continuant d'avancer, il rentre immédiatement dans le second portal et se retrouve dans la zone de départ, faisant de face au premier portal, dans lequel il entre immédiatement. Le cycle continue, jusqu'à ce qu'il s'arrête exactement à la jonction des deux zones et marche à reculons pour s'éloigner du portal auquel il fait face.
Une fois les portals placés dans le bon sens et chaque WarpZoneInfo paramétrée avec ThisTag et OtherSideURL, la warpzone est déjà fonctionnelle. Dans mon exemple, la warpzone est matérialisée par l'éclairage rouge d'un côté et jaune de l'autre. La limite des deux couleurs marque le passage d'un côté à l'autre.
Les warpzones ne sont pas forcées de fonctionner deux par deux. Il est possible d'avoir une WarpZoneInfo 1 ayant pour destination une WarpZoneInfo 2 qui elle-même a pour destination une WarpZoneInfo 3. L'effet sera désorientant pour le joueur car une fois passé le premier portal, il ne verra pas, s'il se retourne, la zone dont il vient, mais une troisième zone. Il est également possible d'avoir plusieurs warpzones avec la même destination, ce qui permet d'avoir plusieurs routes menant au même point.
À l'inverse, si plusieurs WarpZoneInfos partagent le même ThisTag et qu'une autre WarpZoneInfo a ce ThisTag pour destination, une seule WarpZoneInfo servira de destination : celle placée le plus haut dans l'ordre hiérarchique des actors (ce qui peut-être modifié en cliquant droit sur la WarpZoneInfo et en choisissant To First ou To Last dans le menu Order).
Il est possible de faire aboutir une warpzone dans la même pièce qu'elle-même, ce qui permet au joueur de se voir et de se tirer dessus lui-même.
Si les deux portals ne sont pas exactement similaires, l'envers de la géométrie devient visible et un hall of mirrors sera affiché au-delà des bords du portal là où les deux côtés de la warpzone ne correspondent pas et s'il n'y a pas de géométrie derrière.
Détail des paramètres
Les paramètres de la WarpZoneInfo sont peu nombreux :
- bNoTelefrag : Si vrai, empêche les téléfrags en empêchant les joueurs d'apparaître à l'intérieur de la collision d'autres joueurs en sortie.
- Destinations : Liste (dans l'ordre) des destinations successives de la warpzone. Cette liste permet de changer de destination à la volée en déclenchant le tag de la WarpZoneInfo. À chaque déclenchement, elle passe à la destination suivante dans l'ordre. Lorsque la dernière cible fournie est atteinte, la liste recommence à zéro. Au lancement de la map, la destination à l'index [0] est chargée en mémoire mais n'est pas activée, ce qui a une certaine importance, comme expliqué ci-dessous.
- OtherSideURL : Destination de la warpzone au lancement de la map.
- ThisTag : Tag de cette warpzone. Il s'agit de l'identifiant unique de cette WarpZoneInfo à indiquer à une autre, dans son champ OtherSideURL ou dans sa liste Destinations.
Pour alterner entre plusieurs points d'arrivée à l'aide de la liste Destinations, il faut déclencher la WarpZoneInfo. Cela peut se faire, par exemple avec un Trigger, non pas en déclenchant le ThisTag de la WarpZoneInfo mais son Tag, dans l'onglet Events de ses propriétés de base.
Plusieurs précisions doivent être apportées quand à l'utilisation de la liste Destinations et à ses contraintes particulières.
- La destination à l'index [0] est chargée en mémoire au lancement de la map, mais n'est pas activée automatiquement. Cela signifie que si une destination par défaut n'est pas ajoutée dans OtherSideURL, la warpzone sera désactivée au début du jeu, jusqu'à ce que la WarpZoneInfo soit déclenchée. Une fois la WarpZoneInfo déclenchée pour la première fois, la warpzone n'active pas la destination [0] mais la destination [1]. Cela revient à faire de l'index [0] la dernière cible activable de la liste, et non la première.
- Le champ OtherSideURL est la destination par défaut de la warpzone au lancement de la map (elle sera donc désactivée avant déclenchement si ce champ est vide). Lorsque la WarpZoneInfo est déclenchée, la nouvelle destination remplace le contenu de ce champ. Si la cible par défaut dans OtherSideURL n'est pas comprise dans la liste Destinations, la cible par défaut ne sera plus accessible par déclenchement de la WarpZoneInfo car seules les cibles de la liste Destinations seront désormais parcourues.
- Si le champ OtherSideURL contient une cible qui se trouve également dans la liste Destinations mais pas en première place, lors du premier déclenchement, la warpzone ne changera pas pour la première cible normale (c'est-à-dire celle à l'index [1], mais pour la cible qui se trouve à l'index suivant la position de la cible d'OtherSideURL dans la liste Destinations.
- La liste Destinations ne se comporte pas correctement si elle contient des doublons. Si deux destinations sont répétées, la warpzone commencera par fonctionner normalement à chaque déclenchement. Cependant, une fois arrivée à une cible citée pour la deuxième fois, elle ne passera pas à la suite normale de la liste mais reviendra à la cible suivant la première mention de la destination en doublon et ne pourra plus que faire cette boucle.
- Une destination vide dans la liste interrompt le déroulement de la liste. Si la cible suivante est vide, déclencher à nouveau la WarpZoneInfo fera repartir la liste à l'index [0], même si d'autres cibles se trouvent après l'index vide. La seule exception est l'index [0], qui peut ne rien contenir sans interrompre le déroulement de la liste. Cela permet d'ajouter la possibilité de désactiver la warpzone lorsque cette destination vide devient active.
Spécificités sous l'Unreal Engine 2
Les warpzones fonctionnent globalement de la même façon sous l'Unreal Engine 1 et 2, mais quelques détails sont à noter.
Par rapport à UT99 ou Unreal, le cylindre de collision du joueur est plus grand dans UT2004, avec un rayon de 25 unités au lieu de 17. C'est donc la profondeur minimale d'une warpzone pour qu'elle puisse être franchie. Une bonne pratique est donc de donner au moins 32 unités de profondeur à la warpzone sous les deux versions du moteur pour ne pas rencontrer de problème.
Les portals sont normalement toujours invisibles en jeu, ce qui est le cas dans l'Unreal Engine 1. Cependant, lorsqu'ils délimitent des warpzones, ils restent visibles sous l'Unreal Engine 2 et empêchent donc de voir la zone de destination de l'autre côté. Pour contourner la difficulté, il est donc nécessaire d'attribuer au portal d'une warpzone un material invisible afin de ne pas empêcher l'affichage de la zone de destination derrière lui. Un tel material peut être improvisé en créant un FinalBlend ayant pour material de base la texture UCGeneric.SolidColours.Black et le paramètre FrameBufferBlending réglé sur FB_Brighten.
Concernant l'orientation du portal lui-même, un moyen simple de manifester le sens du portal sous l'Unreal Engine 2 est de décocher Two Sided dans ses propriétés de surface. Le portal étant une feuille 2D sans épaisseur, un seul de ses côtés est alors affiché, l'autre étant invisible. Cette manœuvre peut aider à déterminer l'orientation du portal même si la face visible porte le FinalBlend invisible créé ci-dessus, car le portal ne pourra alors être sélectionné que d'un seul côté (celui portant le material), ce qui permet de connaître son orientation.
Sous l'Unreal Engine 1, les portals restent toujours double-face, cette méthode ne fonctionne donc pas.
Le joueur ne peut pas se voir lui-même dans des conditions normales (en vue à la première personne) sous l'Unreal Engine 2. Si le joueur regarde à travers une warpzone dans la zone où il se trouve lui-même, il ne se voit pas. S'il tire, les projectiles sembleront apparaître du néant. Passer en vue à la troisième personne (F4) force l'affichage du modèle du joueur, ce qui lui permet alors de se voir reflété dans les warpzones.
Enfin, sous l'Unreal Engine 2, le déclenchement de la WarpZoneInfo n'a pas d'effet et la liste Destinations est par conséquent quasiment inutile. Seul l'index [0] fonctionne : s'il contient une destination valide et que le champ OtherSideURL est vide, alors la destination [0] est active par défaut et ne peut pas être changée. Si OtherSideURL est rempli, la liste est entièrement ignorée.
Limitations
Tous les objets du jeu ne peuvent pas passer à traver une warpzone. Le portal laisse passer joueurs et projectiles, mais les armes hitscan (qui n'émettent pas un projectile mais appliquent instantanément des dégâts au point visé, par exemple le tir primaire du fusil shock, le sniper ou le minigun) ne peuvent normalement pas tirer à travers. Le tir s'arrête net au niveau du portal (l'unique exception est Unreal avec le patch 227, où les armes hitscan traversent les warpzones). Les objets physiques (cadavres des joueurs, objets karma, etc.) et les véhicules d'UT2004 ne traversent pas les warpzones mais restent coincés dans l'espace sans issue situé derrière le portal. Ils ne sont alors que partiellement visibles pour un observateur situé du même côté qu'eux de la warpzone, mais invisible pour un observateur du côté de la zone de destination.
Une explosion d'un côté du portal ne peut pas causer de dégâts à un adversaire de l'autre côté. Malgré les apparences, le joueur de l'autre côté du portal se trouve dans un lieu physiquement séparé et ne peut donc pas être pris dans le rayon d'action d'une explosion, même un tir de rédempteur juste de l'autre côté du portal. De même, la lumière, les projectors et les particules ne se projettent pas à travers une warpzone.
Les bots ne voient et n'entendent pas à travers les warpzones et ne tirent donc pas sur les adversaires se trouvant de l'autre côté. Ils sont également incapables d'anticiper la trajectoire d'un projectile tiré vers eux à travers une warpzone. Ils sont par contre capable de se déplacer à travers les warpzones si le réseau de navigation leur permet.
Les projectiles, quant à eux, voient leur rotation réinitialisée à chaque passage à travers une warpzone. En ralentissant le jeu et en tirant une roquette à travers un des portals, on constate que la roquette pivote à 90 degrés et se retrouve perpendiculaire à sa propre trajectoire. Dans UT2004, la combinaison du tir secondaire et du tir primaire du lance-roquette fait partir les projectiles en spirale autour d'un centre commun. En passant une warpzone, la direction des roquettes en rotation est perturbée. Elles peuvent partir chacune dans un sens différent ou effectuer une brusque rotation. Sous certaines conditions, il est même possible de les faire tourner en rond.
Ici, les roquettes tournent en rond de la warpzone de droite à celle de gauche, leur trajectoire décrivant une courbe. On remarque que même si elles se déplacent de droite à gauche, elles sont orientées vers la droite et se déplacent donc latéralement ou à reculons.
Enfin, les warpzones permettent de mettre en évidence quelques limites des capacités du moteur quant à ce qu'il affiche. Si deux warpzones sont placées en vis-à-vis, la map devrait sembler se prolonger à l'infini. Le moteur n'affichera cependant pas plus de 3 warpzones d'affilée (différentes ou la même en cascade) avant d'afficher un hall of mirrors au-delà du dernier portal.
Si plusieurs suites de warpzones sont visibles, chacune peut être affichée jusqu'à 3 niveaux de profondeur.
Si une même zone est en cascade plusieurs fois dans la même scène, une seule affichera une enfilade de 3 répétitions. Les autres n'afficheront qu'une seule instance de profondeur.
Sous l'Unreal Engine 1, à la place du hall of mirrors, le fond de la warpzone est affiché au-delà de la troisième itération.
Si une skybox est intégrée à la map, son affichage en même temps qu'une warpzone peut poser problème. Il est donc déconseillé d'avoir une skybox visible quand une warpzone est présente dans la map. Sous l'Unreal Engine 1, la skybox ne s'affiche que dans la zone où le joueur se trouve. Si elle est visible à travers une warpzone, elle ne s'affiche pas et est remplacé par un hall of mirrors. Sous Unreal, avec le patch 227, la skybox s'affiche correctement à travers les warpzones.
Sous l'Unreal Engine 2, si le joueur se trouve dans une zone avec des surfaces en Fake Backdrop (c'est-à-dire avec le ciel directement visible), les warpzones ne s'affichent pas et donnent sur le ciel. Elles restent cependant fonctionnelles et le joueur peut les emprunter.
Si la skybox est visible dans une autre pièce qui est elle-même visible à travers une warpzone, cette zone et la skybox s'affichent correctement. Si plusieurs autres warpzones sont visibles au même moment, seule la warpzone avec la skybox s'affiche, les autres donnent sur le ciel. Elles fonctionnent cependant normalement.
Un dernier problème d'affichage concerne le brouillard volumétrique. Par défaut, le brouillard généré par une lumière s'affiche correctement mais ne déborde pas à travers une warpzone.
sous Unreal 227, le brouillard se répand au-delà de la warpzone seulement si le joueur se trouve du même côté que l'actor Light qui le génère. S'il se trouve de l'autre côté, l'effet s'interrompt également au niveau du portal.
En revanche, le brouillard généré par une ZoneInfo, qui n'est qu'un filtre de couleur appliqué sur l'image, fonctionne correctement.
Dans UT2004, le brouillard ne peut pas venir d'une lumière, il n'est géré qu'au niveau de la ZoneInfo. Si le joueur se trouve dans une zone avec du brouillard, celui-ci s'arrête net au niveau du portal d'une warpzone et n'affecte pas les zones au-delà.
Si un brouillard différent est configuré de part et d'autre de la warpzone, le passage de l'une à l'autre est brutal en raison de cette limitation. Comme il ne s'affiche pas au-delà du portal, il apparaît brusquement après le franchissement de la warpzone, puis fait immédiatement une transition pour se conformer aux paramètres de la seconde ZoneInfo.
Toutes ces limitations signifient que les warpzones doivent être cantonnées à des scènes simples sans effets visuels avancés pour ne pas briser l'illusion ou créer des problèmes d'affichage.
Warpzones avancées
Portals et rotation
L'utilisation de base des warpzones nécessite de comprendre que les portals ont une face avant et une face arrière. Lorsqu'un joueur passe par une warpzone, il doit rentrer dans le portal par un de ses deux côtés et en sortir par le côté opposé du portal de la seconde warpzone. Si l'un des portals n'est pas orienté correctement, la warpzone fonctionnera mal et affichera un hall of mirrors.
Si l'orientation avant/arrière des deux portals doit obligatoirement répondre à ce critère, il n'en est pas de même de l'orientation haut/bas du portal. Celle-ci peut être manipulée avec des résultats intéressants en appliquant une rotation au portal ou à sa seule texture. Une texture asymétrique permet de voir précisément l'orientation du portal.
Le portal étant défini comme Two Sided, la texture apparaît aussi de l'autre côté du portal, mais inversée de gauche à droite. Cela permet de savoir quelle est la face avant de chaque portal.
Si la texture d'un des portals est pivotée par rapport à l'autre, la warpzone affichera la zone de destination avec la même rotation. Si l'on pivote à 90 degrés la texture de l'un des deux portals, après un rebuild, la zone sera affichée avec le même angle, ce qui placera le sol à la verticale.
En utilisant des textures différentes pour le sol, les murs et le plafond, identiques dans les deux pièces, l'effet est tout à fait frappant :
L'effet peut être répété avec la texture pivotée à 180 degrés, auquel cas le sol de la zone au-delà de la warpzone sera au plafond. Si la texture est pivotée à 90 degrés dans l'autre sens, la warpzone sera à angle droit dans l'autre sens. Tant que les deux entrées sont de même forme, il est possible de réaliser une warpzone donnant sur une autre zone à n'importe quel angle. Si l'on pivote le portal et son passage, il est possible de faire des effets surréalistes.
À noter que l'effet peut être obtenu en pivotant la texture mais aussi en pivotant le portal lui-même, à condition de respecter l'orientation avant/arrière.
Ici, le portal et le brush négatif carré qui contient la warpzone ont été pivotés dans la pièce où se trouve le joueur. La zone de destination est normale et c'est la rotation du portal d'entrée qui fait apparaître la destination comme retournée.
Il s'agit d'une illusion car les deux zones sont en réalité horizontales. Lorsque le joueur passe le portal, sa vue et son avatar sont, par rapport à la zone d'arrivée, pivotés d'autant de degrés que la texture du portal l'est. Les deux sont instantanément réalignés avec le sol de la zone d'arrivée, ce qui donne un à-coup visuel brutal.
Si d'autres joueurs se trouvent au-delà de la warpzone, ils semblent alors se déplacer sur les murs ou au plafond. L'effet est le même si la zone de destination de la warpzone est la zone où le joueur se trouve : il se verra lui-même sur le mur ou au plafond.
Il est impossible d'afficher une zone "en miroir" en inversant la droite et la gauche de la texture avec les boutons Flip U ou Flip V. La warpzone fonctionnera mais affichera un hall of mirror à travers lequel seuls certains objets seront visibles. En revanche, en utilisant Flip U et Flip V en même temps, la texture fait une rotation à 180 degrés et fonctionne donc correctement, la scène de l'autre côté apparaissant la tête en bas.
Portals en angle
Il est également possible d'incliner les portals vers l'avant ou l'arrière.
Si plusieurs pièces sont reliées les unes aux autres de cette façon, il est possible de créer un monde en anneau à la façon de Halo (à très petite échelle). Si la pièce boucle sur elle-même, l'illusion est identique mais le joueur peut se voir sur chaque segment de l'anneau.
Dans l'autre sens, il est possible de créer un petit planétoïde que le joueur peut parcourir en étant toujours aligné sur la surface.
Il est même possible de joindre deux zones différentes par une warpzone au niveau du sol, mais la gravité étant dirigée vers le bas dans les deux zones, le joueur tombera dans la zone du dessous sans conserver d'inertie vers le plafond de la seconde zone. Il retombera donc directement dans la première zone et sera pris dans une boucle de chute entre les deux. Sa vue et son avatar ne cesseront de se retourner en l'air et il n'aura aucun contrôle sur ses mouvements. Si deux zones sont reliées par leur plafond, alors les joueurs verront leurs adversaires courir au-dessus d'eux.