The Projects - A Modular UE5 City
di Filipp Sparak
Ciao,
C’è un momento in cui un’idea nasce in piccolo, contenuta.
Poi, col tempo, continua a maturare lentamente nella tua mente, si arricchisce di dettagli, cresce, si espande in più direzioni.
Ed è lì che devi scegliere se potare per fermarla, o continuare a coltivarla nella speranza di una fioritura..
L’obiettivo
In questo progetto personale ho scelto la seconda opzione.
Doveva essere solo un isolato, mi dissi.
Poi, aggiungendo edifici di sfondo, capii che era l’occasione giusta per provare qualcosa che non avevo mai fatto: una città vera e funzionale, adatta sia a cinematiche che a progetti in prima persona, con interni unici e fedeli alla struttura dell’edificio.
La preparazione
Con conoscenze limitate sugli aspetti tecnici come le performance, l’uso di World Partition o l’istanziamento, e senza una vera stima dei tempi, iniziai il progetto senza sapere quanti blocchi sarei riuscito a completare prima che il mio PC si rifiutasse di collaborare.
La cosa migliore che potessi fare a quel punto era stabilire alcune regole, in modo da rendere più semplice tornare indietro, rifare, tagliare e ottimizzare gli elementi in futuro:
Edifici modulari e moduli stradali con metriche rigide e adesione alla griglia mi avrebbero permesso di assemblare rapidamente grandi volumi del paesaggio urbano senza perdere tempo ad allineare ogni elemento.
Il grande svantaggio di questo approccio è che spesso le composizioni completamente modulari tendono a risultare squadrate e rigide, quindi bisogna tenere conto di questo fin da subito e sostituire gli elementi più problematici con moduli più grandi e dall’aspetto più naturale, per esempio.
Un’altra cosa che ho deciso fin dall’inizio è stato il metodo da usare per la texturizzazione.
Con la quantità di moduli e props che avrei dovuto creare, non volevo doverli modificare uno per uno, quindi ho introdotto una libreria di materiali "tileable" da applicare a tutti i moduli e oggetti del progetto.
All’inizio, però, è bastata una raccolta di materiali colorati di base.
Sapevo che le sole texture "tileable" non sarebbero bastate, quindi ho introdotto anche il vertex paint per alcuni tipi di materiali.
Un ulteriore elemento utile per evidenziare i dettagli geometrici è stata una maschera RGB, che veniva “baked” (cucinata) per ogni asset — o gruppo di asset — nel secondo canale UV, e poi applicata sopra le texture per far risaltare i bordi, riempire le aree concave e rompere la monotonia con macchie e variazioni di colore, ottenendo così un risultato ricco e dettagliato.
Poiché Nanite era appena stato introdotto in Unreal Engine, ero curioso di scoprire quanto fosse davvero potente questo nuovo strumento.
Considerando che non avrei avuto il tempo per creare geometrie low poly e che l’obiettivo era comunque ottenere il massimo dettaglio geometrico possibile, ho deciso che tutti i nuovi asset introdotti avrebbero contenuto solo la geometria reale necessaria per rappresentare ogni dettaglio.
Niente normal map pre-baked, solo vertici grezzi e, eventualmente, mesh decals.
Detto questo, dovevo mantenere coerenza nei dettagli e nelle dimensioni degli smussi (bevel) in tutta la libreria di asset, quindi ho stabilito una larghezza unificata per tutti i bevel; ho riutilizzato piccoli oggetti come bulloni, maniglie, rivetti ecc.; e tenevo sempre un personaggio 3D nella scena di 3ds Max vicino al kit che stavo modellando, per avere un riferimento costante delle proporzioni.
Intoppi
Questi punti chiave hanno aiutato moltissimo a rendere la produzione più fluida, ma non tutto è filato liscio.
Nonostante avessi già lavorato a progetti videoludici con mappe urbane aperte (cosa che mi ha sicuramente aiutato a visualizzare meglio l’intero ambiente e a trovare in anticipo risposte a problemi che sapevo sarebbero arrivati), era comunque la prima volta in vita mia che affrontavo da solo qualcosa di questa scala.
Non avendo una base solida da cui partire — come quella che normalmente fornisce un level designer — mi sono reso conto, a un certo punto, che l’altezza dei soffitti era troppo bassa, le strade troppo strette per essere realisticamente utilizzabili, o per permettere il parcheggio laterale senza bloccare il traffico.
Così, mentre alzavo i muri e allargavo le strade, spostando edifici già piazzati in una trentina di isolati, ho capito in che palude mi ero davvero infilato.
Visione e Pipeline
Per fortuna, all’epoca avevo un buon lavoro che mi permetteva di prendermi il tempo necessario per dedicarmi a questo progetto.
Una volta risolti i problemi critici, per un po’ si è trattato semplicemente di modellare kit di edifici, propagarli, vedere come si integravano con gli altri kit e poi passare ai primi oggetti di scena di grandi dimensioni, e così via.
L’approccio, essenzialmente, era quello di partire dal grande per arrivare al piccolo, controllare quali altri elementi cruciali mancassero e ridurre sempre di più la lista.
Poiché l’intera pipeline di The Projects era piuttosto unica — nel senso che avevo chiara in mente l’immagine finale da raggiungere e non dovevo trasmetterla a un team — non avevo bisogno di creare complessi blockout per la disposizione delle strade, i moduli, le strutture o i props.
Mi sono limitato a realizzare qualche schizzo generale per mantenere coerente il linguaggio visivo, e poi ho raccolto un bel po’ di foto di riferimento di varie strade ed edifici.
Tornando alla modellazione, dopo aver completato alcuni kit modulari iniziali, ho iniziato ad aggiungere un gruppo di asset completato dopo l’altro in zone della mappa che prima erano completamente vuote — un po’ come aggiungere pezzi a un puzzle, piuttosto che seguire un approccio iterativo tradizionale.
Di fatto, a questo punto avevo completamente saltato la fase di blockout.
I vantaggi di questo workflow sono enormi risparmi di tempo, perché non ti perdi nel vedere una scena piena di asset incompleti, a chiederti quale sistemare per primo per poi magari lasciarlo comunque a metà.
Invece, quando noti che manca un gruppo di asset con una funzione precisa nell’ambiente (come un kit di grandi cassonetti e bidoni), lo modelli, lo texturizzi, lo integri, lo propaghi — e poi passi a identificare cos’altro serve.
Ripeti il processo.
Con abbastanza esperienza e una chiara visione dell’obiettivo finale del progetto, questo metodo fa risparmiare molto tempo e ti evita di girare a vuoto su mille elementi senza mai completarli davvero.
Fissati un livello target di qualità e completezza per i tuoi asset e rispettalo.
Questa soglia si alzerà naturalmente, poco alla volta, con ogni nuovo gruppo di asset che crei, mantenendo comunque una qualità coerente lungo tutto il progetto.
Questo approccio non è adatto a tutti né a ogni tipo di progetto, tuttavia, se ti senti a tuo agio con i tuoi strumenti e le tue capacità organizzative, se stai pianificando un ambiente di grandi dimensioni e disponi di una vasta libreria di asset, potrebbe davvero valere la pena provarci.
Interni e Prefabbricati
Man mano che la parte esterna cominciava a prendere forma con kit sempre più completi, una libreria di materiali in continua crescita e diverse iterazioni sull’illuminazione, ho spostato il mio focus sugli interni per portarli allo stesso livello.
L’approccio generale è stato simile a quello degli esterni: partire dal grande (layout modulare) per poi arrivare al piccolo (props, vegetazione).
A un certo punto mi sono reso conto che l'illuminazione all'interno degli edifici stava diventando un problema crescente. Mentre lo stato dell'esterno andava bene, gli interni non ricevevano abbastanza luce. A questo si aggiungeva un altro problema: tutti gli edifici sullo sfondo (vista), che erano gli stessi prefabbricati usati nell'area attiva della mappa, iniziavano a pesare troppo sulle prestazioni a causa della presenza della geometria interna.
Per risolvere la questione, ho separato tutti gli interni dalle loro strutture esterne, trasformandoli in prefabbricati a parte.
È stato creato anche un altro prefabbricato che fungeva da "tappo" opaco per chiudere finestre e porte degli edifici che non richiedevano un interno. Questo mi ha permesso di alleggerire la vista in lontananza, pur continuando a propagare eventuali modifiche alla struttura esterna degli edifici.
Va notato che l’obiettivo di questo progetto era ottenere un risultato visivo il più bello possibile, senza dedicare troppo tempo all’ottimizzazione, motivo per cui questo approccio si è rivelato efficace.
In questo contesto, i prefabbricati sono “Packed Level Actors” (PLA) annidati all’interno di una Level Instance. I PLA servono per istanziare mesh statiche in modo non distruttivo, ma possono contenere solo quel tipo di attore. Quindi, decals, vegetazione e blueprint vengono inseriti nella Level Instance, che diventa il prefabbricato finale.
Un’altra cosa fatta per risolvere il problema dell’illuminazione interna è stata l’aggiunta di un Post Process Volume (PPV) a ogni singolo prefabbricato degli interni, con una priorità più alta rispetto al PPV globale (unbound) usato per l’esterno. Questo volume seguiva con precisione la forma dell’interno, in modo che, quando la telecamera si trovava all'interno dell’edificio, ci fossero pochissime zone non influenzate dal PPV interno. Questo PPV aveva l’esposizione e altri parametri post-process modificati, così da funzionare in armonia con quello esterno, sovrascrivendo gli stessi valori ma senza doverli toccare nel PPV dell’esterno.
Durante la produzione, le performance hanno iniziato a calare. Avere ogni singolo asset elencato nel World Partition Outliner separatamente stava diventando un problema in termini di drawcall e framerate. Per risolvere, le mesh statiche sono state raggruppate in Packed Level Actors (PLA), ciascuno contenente un isolato urbano circa. È stata poi creata un’ulteriore Level Instance per ospitare altri attori, come blueprint, automobili e altri elementi di scena. Dopo aver convertito tutto a questa nuova struttura, potevo nuovamente caricare l’intera mappa tutta insieme, mantenendo un framerate abbastanza stabile da poter continuare a lavorarci.
Conclusione
A quel punto, non rimaneva molto da fare: creare più decalcomanie per aggiungere dettagli come sporcizia, graffiti ecc.; realizzare un atlante di vegetazione e le rispettive mesh; creare asset di spazzatura per dare un senso di trascuratezza e abbandono; infine, aggiungere VFX di base per dare varietà e dinamismo alla scena.
Ho poi creato tutti questi elementi come gli altri asset del progetto, usando Photoshop, Substance Painter, Substance Designer e 3ds Max.
Dopo gli ultimi ritocchi all’illuminazione e 2 anni e mezzo di lavoro, la città era finalmente completa.
Grazie per la lettura e buona fortuna per il tuo prossimo progetto!
Filipp Sparak – Tutti i Link:
Articoli recenti
Risorse FAB gratuite - fino all'8 settembre 2026
Nuovi asset disponibili gratuitamente su FAB, disponibili fino al 8 settembre 2026
Immens: tre veterani di Epic Games stanno sviluppando un game engine con l'AI
Tre veterani di Epic Games stanno sviluppando Immens, un nuovo game engine AI-native pensato per ridurre costi e complessità dello sviluppo videoludico grazie a workflow aperti, modulari e altamente personalizzabili.
Arthur Tasquin: ottimizzare il workflow di produzione in Unreal Engine
Arthur Tasquin mostra come ottimizzare il workflow in Unreal Engine attraverso shortcut, configurazioni personalizzate, template e Content-Only Plugin.