Files
Ipseity-Demo/Assets/_Content/Models/Environments/Unabomber/PortalB_Meadow.md
T
2026-09-28 14:58:25 +02:00

11 KiB

Prairie de PortalB

La scene Assets/_Content/Scenes/Unabomber.unity porte le composant PortalMeadow sur ///Environment/PortalB. Il genere automatiquement le sol et l'herbe en mode edition et en jeu. Les maillages temporaires ne sont pas enregistres dans la scene et sont liberes a la desactivation du composant.

Reglages

  • Sur PortalB : dimensions, centre local, densite, hauteur, largeur et graine. Valeurs initiales : 32 x 48 metres, 46 080 brins repartis sur 24 tuiles.
  • Dans Materials/M_PortalB_Meadow.mat : couleurs, force/vitesse/direction du vent, courbure, angle, distance de debut et influence horizontale.
  • Bend angle oriente la courbure dans le repere de la camera : 0 degres vers le bas, 90 vers la droite, 180 vers le haut, 270 vers la gauche, pour une courbure positive. Le sol, les brins et les normales suivent cet angle.
  • Collider Thickness sur PortalB regle l'epaisseur de la BoxCollider (0.2 m par defaut). Sa largeur, sa longueur et son centre suivent le terrain ; sa face superieure est au niveau du sol non deforme. Elle est generee sous Grass Ground (generated) et regeneree lorsque les reglages changent.
  • Courbure initiale : 0.006 ; debut a 6 m ; influence horizontale : 0.12. Une courbure negative inverse le sens, zero desactive la deformation.
  • Le menu contextuel du composant propose Regenerate meadow.
  • L'animation utilise le temps du shader. En Scene View, activer les materiaux animes / le rafraichissement temps reel pour voir le vent sans lancer Play.

Rendu

Le shader URP partage CurvedWorld.hlsl entre le sol et les brins. Il reprend la formule fournie : deformation quadratique dans l'espace de la camera active. Le vent est applique avant la courbure et ne deplace pas les racines. Les passes couleur, profondeur et normales utilisent la meme geometrie deformee.

Le masque de portail existant est disponible dans le materiau : Default (0), Outside (1), Inside (2), avec les conventions de Mask.hlsl du projet. PortalB etait un groupe vide, sans composant Portal : le nouveau composant ne cree pas de porte ni de zone de transition et utilise Default initialement.

La courbure reste visuelle : la BoxCollider est plane et ne suit pas la deformation du shader. Les ombres projetees sont desactivees pour eviter de calculer la courbure depuis la vue d'une lumiere. L'eclairage est volontairement simple, avec couleurs de racine/pointe, ambiance et lumieres URP ; il ne reproduit pas les hachures EnkiBilal. Les bounds sont elargis pour la deformation GPU ; en cas de courbure extreme, ajuster Bounds Padding. Cette marge privilegie la continuite visuelle au culling.

Cercles de serveurs

PortalMeadow centre le terrain et sa BoxCollider sur la position XZ initiale du joueur, une seule fois au chargement et au lancement du jeu. La hauteur du sol reste celle de Center.y. Initial Player permet de choisir le joueur ; sinon le composant cherche le tag Player dans la scene, puis Camera.main. Le centre initial reste la reference des anneaux et de la sortie ; en mode Endless, le disque visible suit le joueur. Le menu contextuel Recenter on player once permet de reprendre un nouveau centre explicitement.

Le composant PortalServerGrid conserve son nom pour garder les references serialisees, mais genere maintenant Server Rings (generated). Les anneaux sont concentriques autour de ce centre initial. Chaque serveur regarde le centre lors du placement ; sa rotation n'est pas recalculee quand le joueur bouge. En mode Endless, les instances sorties du disque sont recyclees au loin.

  • First Ring Radius : rayon du premier cercle (8 m), laissant le centre libre.
  • Spacing X : distance minimale entre voisins sur un meme cercle (5 m).
  • Spacing Y : distance entre les cercles (6 m).
  • Angle Offset : rotation d'ensemble des anneaux. Les anneaux alternes sont decales d'une demi-case pour eviter des alignements trop reguliers.
  • Edge Margin : marge interieure du terrain. Seuls les cercles complets qui tiennent dans le terrain sont generes, avec une reserve pour le modele.
  • Offset Z : correction du pivot le long de la direction vers le centre (positif = vers le joueur initial, negatif = vers l'exterieur).
  • Height Offset : decalage vertical supplementaire.
  • Rotation : Y = 180 est configure pour que la face avant du ServerRack regarde le joueur initial. Scale Multiplier conserve l'echelle du prefab.
  • Menu contextuel Regenerate server rings : reconstruction manuelle.

La taille reelle du modele est mesuree avant le placement. Son pivot est compense pour poser sa base au sol. Les distances prennent en compte son empreinte et les cordes entre voisins pour eviter les chevauchements. Une configuration depassant 4096 instances est refusee avec un avertissement.

Les instances utilisent des copies temporaires des materiaux du prefab, avec le shader Unheimlich/Portal Curved Server. Les textures, normales, metallicite, occlusion et emission URP Lit sont conservees. Les quatre parametres de courbure sont synchronises avec le materiau de la prairie avant chaque camera. Ils sont declares dans le meme cbuffer UnityPerMaterial que les proprietes Lit, via CurvedServerLitInput.hlsl (copie locale de l'include URP 17.3 etendue), pour respecter SRP Batcher et GPU Resident Drawer. Le shader partage CurvedWorld.hlsl avec le terrain pour les passes couleur, profondeur et normales. Les transforms restent fixes : seule la geometrie affichee est deformee selon la camera active. Les collisions restent planes. Les ombres projetees sont desactivees, comme pour la prairie, pour eviter une courbure depuis la lumiere. Les materiaux et objets temporaires sont liberes a la desactivation du composant.

Ciel local de PortalB

PortalSkyDome genere une sphere autour du terrain, visible depuis l'interieur. Elle ne modifie pas RenderSettings.skybox : le ciel global reste disponible pour l'autre univers. Sa taille inclut la taille du terrain et la marge de courbure. Elle est dessinee apres la skybox globale, avec test de profondeur, avant les transparences ordinaires ; les objets opaques peuvent donc l'occulter.

Dans Materials/M_PortalB_Sky.mat, regler les couleurs Zenith / Horizon / Below horizon, l'exposition, ou choisir une cubemap et activer Use Cubemap.

Sur le composant, Visibility propose :

  • Preview : ciel visible partout depuis l'interieur, pour travailler avant l'installation du portail (valeur initiale dans la scene).
  • PortalOnly : depuis l'exterieur, visible uniquement au travers des masques actifs du PortalManager existant. Sans masque actif, il est cache.
  • Hidden : entierement cache.

Les fonctions publiques EnterPortalB() et ExitPortalB() sont pretes pour les futurs UnityEvents de transition : l'entree montre tout le ciel et la sortie revient a la vue limitee par les masques. Elles activent le mode PortalOnly. Pas de trigger de passage automatique ajoute : le raccord attend la prochaine configuration du portail. Le ciel utilise pour l'instant l'union des trois masques existants, comme le systeme actuel ; un filtrage par univers pourra etre ajoute lors du branchement. La sphere ne change pas l'eclairage ambiant ni les reflexions.

Disque et marche sans bord

Circular dans PortalMeadow decoupe visuellement le sol et les brins en disque, dans les passes couleur, profondeur et normales. Le rayon vaut la moitie du plus petit axe de Size. Edge Fade et Edge Color adoucissent la limite dans une brume. La collision reste une BoxCollider plane, comme avant.

Endless est active dans Unabomber : en Play, le disque, son collider et le ciel suivent la position XZ du joueur. Le controleur du joueur garde son vrai deplacement. Les tuiles d'herbe sont recyclees sur une grille torique plus grande que le disque, et les serveurs au-dela de la limite visible sont reutilises a l'autre extremite. Aucune regeneration de maillage ni creation continue d'objets pendant la marche. Les objets proches ne suivent pas le joueur : il peut les depasser normalement. Les cercles sont la disposition initiale ; en marchant, le motif se repete au loin. C'est une fenetre de rendu mobile sur un decor periodique, pas un monde sauvegarde sans limite. Les coordonnees mondiales continuent d'augmenter pendant la marche. Desactiver Endless permet de revenir au terrain fixe ; le mode Edition reste fixe.

PortalExitMarker place une porte au centre de chaque espace entre quatre repetitions voisines de serveurs. La periode provient de PortalServerGrid : centres des portes = centre initial + ((i + 0.5) * periode, (j + 0.5) * periode). Un pool de neuf cubes couvre les espaces proches et se recycle hors du disque. Une porte proche reste fixe et atteignable. Rotation Y et Dimensions reglent sa silhouette. M_PortalB_Exit regle sa couleur et son emission HDR. Le marqueur partage le shader courbe des serveurs et reste un repere : aucun changement de scene n'est branche sur son trigger pour le moment.

Brume autour du joueur

PortalFogRings genere quatre rideaux circulaires concentriques suivant le centre du disque en XZ, sans recreer les maillages pendant la marche. Le shader Unheimlich/Portal Fog reutilise directement la fonction de Models/VFX/Fog/ShadersA/Fog.hlsl employee par M_Fog_Omnissiah, avec le meme bend que le sol. Le materiau d'Omnissiah reste inchange.

Materials/M_PortalB_Fog.mat contient les couleurs bleu-gris, leurs alphas et Density. Sur PortalB : Layers regle le nombre de couches, Inner Radius et Outer Radius leurs distances en fractions du rayon du terrain, Height leur hauteur et Base Offset leur penetration dans le sol. Le bruit reste ancre dans le monde pendant le deplacement. Les couches se dessinent de la plus lointaine a la plus proche, apres le dome de ciel. Il s'agit de rideaux transparents, pas d'un volume physique de brouillard. Le masquage par le futur portail reste a brancher avec le reste du decor lors de la configuration de la transition.

Bavures colorees

Le post-traitement EnkiBillal actif utilisait une difference RGB additive amplifiee, qui surexposait les silhouettes devant le ciel. La bavure melange maintenant la couleur de la surface la plus proche parmi les echantillons, avec comparaison de profondeur. Le shader ToonBilal conserve aussi la teinte lorsqu'il limite les hautes lumieres, au lieu d'ecreter independamment les trois canaux. Ces corrections des shaders partages concernent les autres scenes qui les utilisent.

Verification

Compilation C# et compilation des six shaders concernes verifiees dans Unity 6000.3.4f1 / URP 17.3, dans un projet isole : aucune erreur de compilation. Terrain, serveurs, ciel et brume : code de compatibilite SRP Batcher = 0. Les post-traitements conservent leurs avertissements historiques de compilation.

Test en Play : 30 positions du joueur sur environ 4 km, avec verification de la couverture du disque, du nombre constant de tuiles et serveurs, de la position des neuf portes aux centres des espaces, du suivi des quatre couches de brume, de l'immobilite des serveurs proches et du centrage du collider. Le test emploie des cubes comme serveurs et une densite d'herbe reduite ; il ne mesure pas les performances du prefab ServerRack dans la scene complete. Le rendu final dans Unabomber reste a inspecter dans l'editeur de travail.