In questo breve video, vi mostro come ho realizzato un effetto di Defocus dinamico in Unity, in modo da mettere a fuoco solo gli oggetti al centro dell'inquadratura della telecamera, sfocando gli altri.
Trascrizione del video
Salve a tutti! In questo breve video, vi mostro come ho realizzato un effetto di Defocus dinamico in Unity, in modo da mettere a fuoco solo gli oggetti al centro dell'inquadratura della telecamera, sfocando gli altri.
In questo momento, sto mostrando a video l'effetto finale accentuando molto la sfocatura, ma questo effetto è personalizzabile e a breve vi mostrerò come farlo.

Il video e lo script sono stati realizzati utilizzando la versione 2022 di Unity e la Universal Rendering Pipeline.
Per poter utilizzare correttamente lo script, è necessario fornire un componente di tipo Volume alla Main Camera, così da avere a disposizione un sotto-componente di tipo Depth of Field.

È necessario cambiare la modalità del componente Defocus in Bokeh, perché questa modalità ci consente di specificare la distanza del punto da mettere a fuoco e altri effetti, che rendono l'effetto finale più realistico.

Attiviamo, in particolare, i parametri Focus Distance e Aperture.

Per quanto riguarda Focus Distance, possiamo lasciare il valore di default, perché modificheremo questo valore durante l'esecuzione del gioco mediante script.
Per quanto riguarda il valore del parametro Aperture, va detto che più basso sarà questo valore e maggiore sarà l'effetto di messa a fuoco selettiva, perché la profondità di campo sarà minore.
Per mostrarvi l'esempio iniziale, dove l'effetto era volutamente accentuato, ho impostato 2.4 come valore, ma ovviamente qui dovrete impostare un valore adeguato al vostro progetto, dopo aver fatto alcune prove.
Prima di mostrarvi il codice dell'implementazione dello script, vi descrivo brevemente il suo funzionamento.
Lo script proietterà un raggio invisibile, chiamato Raycast, dalla telecamera verso il centro dell'inquadratura nella scena virtuale.
Quando il raggio incontrerà un oggetto provvisto di un componente Collider, calcolerà la distanza di tale oggetto dalla telecamera e scriverà questo valore nel campo Focus Distance del sotto-componente Depth of Field.
L'operazione è quindi semplicissima, ma bisogna tenere a mente che, per essere rilevati, gli oggetti devono essere provvisti di un componente Collider, che può essere impostato anche in modalità Trigger, se volete evitare che questi oggetti ostacolino il movimento del personaggio.

Passiamo adesso ad esaminare il semplicissimo script in linguaggio C#, che ho chiamato Dynamic Defocus.
Per poter eseguire correttamente lo script è necessario importare i moduli Rendering e Rendering Universal.

Le variabili private che ho definito servono solo ad accedere al componente Volume e al suo sotto-componente Depth of Field, per poterne modificare i parametri.

In particolare, le variabili Volume e Depth of Field vengono inizializzate nella funzione Start dello script.

All'interno della funzione Update, che viene eseguita automaticamente ad ogni fotogramma dell'esecuzione, viene proiettato il raggio Raycast.

L'oggetto della collisione viene scritto nella variabile hit, ma potrebbe non esistere, ad esempio perché l'utente sta inquadrando lo sfondo o una porzione di scena dove non sono presenti oggetti provvisti di componenti Colliders.
Per questo motivo, prima di assegnare il valore Distance della variabile Hit al parametro Focus Distance del componente Depth of Field, è necessario verificare che il Collider di Hit non sia null.
Il nome dell'oggetto intercettato dal raggio può essere recuperato accedendo al componente collider della variabile Hit e, da questo componente, al suo Game Object e infine al nome.
Dopo aver salvato lo script, fate delle prove nel vostro progetto e modificate il valore del parametro Aperture fino ad arrivare al risultato che preferite.
Spero che questo breve video vi sia stato utile! A presto!