Les Zones dans Unreal

Définition

Une zone, c'est une région de la carte isolée du reste. Si par exemple on construit deux salle indépendantes, après compilation on obtient deux zones distinctes qui peuvent recevoir chacune, via l'item "ZoneInfo", des propriétés définies différemment pour l'éclairage, la pesanteur, les effets spéciaux comme le brouillard, l'écho, etc.. C'est de cette manière par exemple qu'on crée une piscine où la surface de l'eau sépare le milieu aérien du milieu aquatique.

Les zones sont visibles dans l'éditeur dans le mode d'affichage spécifique dans la fenêtre 3D :

On voit bien là l'intérêt qu'il pourrait y avoir, mais à moins de se téléporter d'une zone dans l'autre, comment maintenir cette division fonctionnelle si les deux salles sont reliées par un couloir ? Il suffit de placer dans ce couloir une séparation (occlusion totale!) réalisée par une feuille 2D qu'on ajoute avec le bouton "AddSpecialBrush" en lui donnant la propriété "ZonePortal".
En fait seul le paramètre "ZonePortal" est nécessaire. Par exemple si on veut que cette forme serve aussi de vitre, on la rendra visible.

La feuille peut être ajustée à l'ouverture ou déborder en zone vierge. En fait, on pourrait utiliser une forme 3D pourvu qu'elle soit ajoutée dans le niveau de la même manière via l'outil "AddSpecialBrush". On définit alors une zone supplémentaire de transition.

 

Ajoutons deux "ZoneInfo" à chaque bout de cette carte en définissant la couleur rouge pour l'un et bleu pour l'autre. Lorsqu'on est dans le jeu, chaque zone a une lumière colorée propre. La zone de transition pour laquelle on n'a ici rien défini est noire. Lorsq'on s'y trouve, on voit bien ce qu'il y a dans les autres, mais à moins de placer des sources lumineuses, rien dans la zone noire ne peut être visible.
Evidemment, plus la surface de séparation est importante, comme par exemple un vaste plan d'eau, le cloisonnement d'un espace vaste pour isoler des effets de lumière, plus le moteur est sollicité pour afficher en même temps tous ces effets.

 

 

 

L'acteur "ZoneInfo"

Si l'on veut qu'une zone ait des propriétés spécifiques comme par exemple de milieu aquatique, d'éclairage, de réverbération, il faut y ajouter un acteur "ZoneInfo" en plaçant l'icône n'importe où DANS l'espace de cette zone. En placer UNE SEULE par zone. On la trouve dans le catalogue : Classes/Info/ZoneInfo. Si le niveau ne comporte qu'une seule zone, les propriétés peuvent être définies dans "LevelProperties/ZoneInfo..ZoneLight". Les propriétés de chaque zone définie dans une carte sont prioritaires sur les définitions données pour l'ensemble de la carte dans "LevelProperties/ZoneInfo..ZoneLight".

D'une façon générale, les propriétés de zone sont définies a priori. Elles ne sont pas sensibles aux déclencheurs, à l'exception de la "PressureZone" qui doit être activée. Une seule propriété fait aussi exception : bPainZone (faux --> vrai). L'"Event" du déclencheur doit être égal au "Tag" défini dans "ZoneTag".

Les propriétés sont accessibles par BD sur l'icône qui ouvre la fenêtre des propriétés de zone :
Paramètres :
- bDestructive : si vrai, les restes et carcasses diverses ne traînent pas
- bFogZone : si vrai, l'effet de brouillard est possible à partir des sources de lumière. Si on veut que le brouillard soit visible dans une zone à partir d'une autre zone, ce paramètre doit y être activé
- bKillZone : Tue celui qui y entre (ne fonctionne pas)
- bNeutralZone : le joueur ne peut y subir de blessure du fait des propriétés de cette zone
- bGravityZone : utilise le paramètre "ZoneGravity". Pas d'effet propore
- bPainZone : Elle est inflige des blessures ; quantité définie dans "DamagPerSec".
- bDestructive : elle détruit les carcasses
- bMoveProjectile : permet aux projectiles d'avoir leur vitesse affectée par ZoneVelocity.
- bNoInventory : empêche que des objets d'inventaire puissent subsister dans cette zone
- ZoneTag : définit l'étiquette d'une zone qu'on pourra activer par une gâchette "ZoneTrigger".
- ZoneFog et ZoneFlash dans ZoneLight : permettent de changer l'aspect de brouillard coloré dans la zone concernée.
- ZoneTerminalVelocity : change la vitesse de chute maximale dans la zone.

- bWaterZone : définit un milieu aquatique. Bruits d'éclaboussures à l'entrée et à la sortie de la zone. Comportement de nage à l'intérieur. Il est préférable que la surface soit transparente.
- DamagePerSec : quantité de dommages infligés par seconde. Par contre, une valeur négative donne des points de vie (bPainZone doit être vrai).

- DamageString : message affiché
- DamageType : concerne le comportement de l'écran et de l'affichage
- EntryActor : acteur qui apparaît quand le joueur entre dans la zone (avec bWater vrai) - idem pour ExitActor
- EntrySound : son audible quand le joueur entre dans la zone (avec bWater vrai) - Idem pour ExitSound
- MaxCarcasses : combien de débris organiques peuvent être affichés en même temps
- ZoneGroundFriction : définit la friction au sol : 4 par défaut. Des valeurs négatives élevées correspondent à un sol glissant.
- ZoneFluidFriction : viscosité d'un milieu liquide, qui définit bien sûr la vitesse de progression.

- ZoneGravity : Par défaut, la gravité s'exerce verticalement sur l'axe Z donc, où elle prend la valeur -950. La pomme tombe verticalement sur la tête de Newton.. Mais si l'on veut figurer un courant, ou pourra donner des valeurs sur les autres axes :

- ZonePlayerEvent : Evènement déclenché lorsqu'un joueur entre dans la zone
- ZoneTerminalVelocity : Vitesse de la chute, supplante la valeur de la gravité
- ZoneVelocity : ajoute une vitesse constante à tout ce qui bouge dans la zone

Un zone peut avoir des caractéristiques de base concernant l'éclairage :

- AmbientBrightness : valeur lumineuse par défaut
- AmbientHue : coloration par défaut de la lumière ambiante
- AmbientSaturation : degré d'application de cette coloration (max à 0)
- TexUPanSpeed : affecte la vitesse de défilement des textures horizontalement (paramètre USpan des propriétés de surfaces)
- TexVPanSpeed : idem pour le défilement horizontal

- ViewFlash : 0 à -1 en association avec ViewFog contrôle la luminosité
- ViewFog : 0 à -1

 

 

 

Dans les propriétés sonores, à noter la réverbération :

- bReverbZone : active/inactive l'écho dans cette zone
- CutOffHz : exclut les sons plus graves (fréquence plus faible que cette limite)
- Delay : délai d'apparition de l'écho
- Gain : gain en volume de chaque écho
- MasterGain : gain global
- SpeedOfSound : à quelle vitesse jouer le son

 

 

 

 

 

 

Il y a diverses sortes de ZoneInfo :

-CloudZone : mortelle d'emblée.. Détruit aussi tout ce qui passe dans la zone : créatures, objets, et donc projectiles. Ceci peut être utilisé pour empêcher l'impact des projectiles sur des murs qui afficheraient le contenu de la boîte à ciel.

-KillingField (UT) : Ne fonctionne pas.

-LavaZone : Milieu volcanique de lave en fusion. Vite mortelle (dommages de 40 pdv par seconde). Message : "Burned", brûlé..

-LevelInfo : en fait placée automatiquement par le programme. On n'a pas à s'en préoccuper. Contient les spécifications du type de jeu.

-NitrogenZone : Milieu d'azote liquide.. très toxique (20pdv par seconde). Message : "Frozen", gelé..

-PressureZone (UT) : Lorsqu'elle est activée par un déclencheur (l'action peut être répétée), tout joueur à l'intérieur est éclaté.. Elle est paramétrable notamment :
..........DieDrawScale : la taille du corps du joueur
..........DieFatness : la corpulence
..........DieFOV : facteur de zoom (90 = sans changement)
..........KillTime : délai avant de mourir
Le jeu mémorise qui déclenche l'action et qui la subit, ce qui compte dans les points de jeu.

-SkyZone : surtout utilisé dans la boîte à ciel. Fonctionne comme une caméra panoramique dont l'image est projetée sur les surfaces qui ont l'attribut "FakeBackdrop" coché.

-SlimeZone : Milieu liquide toxique et vite mortel (-40 pdv par seconde).

-TarZone : Milieu liquide visqueux où l'on progresse lentement. Trop lentement..

-TeleporterZone : lorsque le joueur y entre, il est téléporté par le téléporteur défini dans "TeleporterZone’s TeleporterTag".

-ToggleZoneInfo : Ne fonctionne pas.

-VacuumZone : Mort subite..

-WarpZoneInfo : définit la zone de portail qui permet de passer d'un endroit à un autre, comme par téléport, mais avec en plus la possibilité de voir à travers le portail ce qui se trouve dans l'autre région. Voir à Portails pour le détail.

-WaterZone : milieu liquide où l'on se déplace en nageant et où on peut se noyer si on oublie de respirer. Cet inconvénienbt peut être paramétré à l'envers pour en faire une eau de vie qui régénère.

LocationID (dans la classe "KeyPoint") :

Lorsqu'on n'utilise pas de zone, ou à l'intérieur d'une grande zone, il peut être utile de désigner un endroit avec un nom :
- LocationName : le nom de ce lieu-dit
- Radius : l'aire désignée par ce nom

Utilisation

On a vu que le découpage d'une carte en zones permettait d'y définir des propriétés variées d'une région à l'autre. Mais ce découpage permet aussi au moteur du jeu de ne pas anticiper le calcul du rendu visuel d'une zone tant qu'on n'y a pas accès (visuellement ou physiquement). Il en résulte un accroissement relatif des performances d'affichage. C'est particulièrement important si on recherche plus de fluidité dans le jeu.

Dans le cas où le souci d'économie prédomine, et que l'on veut éviter que le moteur ait à calculer d'avance le rendu d'une zone, on optimisera ceci en plaçant les séparations dans des passages étroits dont les détours ou l'incurvation ou encore la présence de portes ne pemettront pas de voir directement la zone en question.

Ceci devient capital pour des cartes dont la dimension atteint 10 à 20 000 polygones. Il ne faut alors pas hésiter à cloisonner : Un niveau peut comporter jusqu'à 64 zones.

Pour tester ce problème du rendu, j'ai comparé deux situation d'une même carte : avec et sans zone. Il s'agissait d'une carte moyenne de 5500 polys. Le test n'a pas donné les résultats que j'attendais avec une absence de différence significative. Je compte retenter l'expérience prochainement ...