add : unabomber scene

This commit is contained in:
2026-09-28 14:58:25 +02:00
parent e95980d88c
commit 769a75f9bb
137 changed files with 12749 additions and 9 deletions
@@ -0,0 +1,182 @@
# 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.