Dans cette courte vidéo, je vais vous montrer comment j’ai créé un effet de Defocus dynamique dans Unity, en mettant au point uniquement les objets situés au centre du champ de vision de la caméra tout en floutant les autres.
La version vidéo de ce tutoriel n’est actuellement pas disponible dans cette langue.
Transcription de la vidéo
Bonjour à tous. Dans cette courte vidéo, je vais vous montrer comment j’ai créé un effet de Defocus dynamique dans Unity, en mettant au point uniquement les objets situés au centre du champ de vision de la caméra tout en floutant les autres.
Pour le moment, je vous montre l’effet final en exagérant le flou, mais cet effet est personnalisable et je vais bientôt vous expliquer comment le configurer.

La vidéo et le script ont été réalisés avec Unity 2022 et la Universal Rendering Pipeline.
Pour utiliser correctement le script, vous devez ajouter un composant Volume à la Main Camera afin de pouvoir accéder au sous-composant Depth of Field.

Vous devez modifier le mode du composant Defocus en choisissant Bokeh, car ce mode permet de définir la distance du point de mise au point et d’autres paramètres, ce qui rend l’effet final plus réaliste.

Activez ensuite les paramètres Focus Distance et Aperture.

Pour Focus Distance, vous pouvez conserver la valeur par défaut, car nous la modifierons pendant le gameplay à l’aide d’un script C#.
Concernant le paramètre Aperture, il est important de noter que plus cette valeur est faible, plus l’effet de mise au point sélective sera marqué, car la profondeur de champ sera plus réduite.
Pour vous montrer l’exemple initial, dans lequel l’effet était volontairement exagéré, j’ai réglé la valeur sur 2.4. Bien sûr, vous devrez définir une valeur adaptée à votre projet après avoir effectué quelques tests.
Avant de vous montrer le code pour implémenter le script, je vais décrire brièvement son fonctionnement.
Le script projette un rayon invisible appelé Raycast depuis la caméra vers le centre de l’image dans la scène virtuelle.
Lorsque le rayon touche un objet doté d’un composant Collider, il calcule la distance de cet objet par rapport à la caméra et inscrit cette valeur dans le champ Focus Distance du sous-composant Depth of Field.
L’opération est très simple, mais il est important de garder à l’esprit que pour être détectés, les objets doivent posséder un composant Collider, qui peut également être configuré en mode Trigger si vous souhaitez éviter que ces objets n’entravent le déplacement du personnage.

Voyons maintenant le script très simple en C# que j’ai nommé Dynamic Defocus.
Pour exécuter correctement le script, vous devez importer les modules Rendering et Rendering Universal.

Les variables privées que j’ai définies servent uniquement à accéder au composant Volume et à son sous-composant Depth of Field, afin de pouvoir en modifier les paramètres.

Plus précisément, les variables Volume et Depth of Field sont initialisées dans la fonction Start du script.

À l’intérieur de la fonction Update, qui s’exécute automatiquement à chaque frame, le rayon Raycast est projeté.

L’objet en collision est stocké dans la variable hit, mais il se peut qu’il n’existe pas, par exemple si l’utilisateur vise l’arrière-plan ou une zone de la scène où aucun objet ne possède de composant Collider.
Pour cette raison, avant d’assigner la valeur Distance de la variable hit au paramètre Focus Distance du composant Depth of Field, il est nécessaire de vérifier que le Collider de hit n’est pas null.
Le nom de l’objet intercepté par le rayon peut être obtenu en accédant au composant Collider de la variable hit, puis à son Game Object et enfin à son nom.
Après avoir enregistré le script, effectuez quelques tests dans votre projet et ajustez la valeur du paramètre Aperture jusqu’à obtenir le résultat souhaité.
J’espère que cette courte vidéo vous a été utile. À bientôt.