add : unabomber scene
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user