[Résolu (quasi)] Création d'un effet visuel quand un objet est détecté.

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Avatar de l’utilisateur
jmhoubre
Messages : 690
Inscription : 05 Oct 2019 22:05

[Résolu (quasi)] Création d'un effet visuel quand un objet est détecté.

Message par jmhoubre » 13 Sep 2022 19:35

Bonsoir,

j'aurais pu choisir le titre "Détection d'arête", mais je ne souhaite pas orienter la solution.

je travaille sur un projet (Unity 2021.3 URP) dans lequel le personnage récupère des objets divers (armes, munitions, nourriture, médicament ...). Une de ses statistiques est la perception, lui permettant de détecter plus ou moins facilement les objets récupérables. La détection dépend également de la distance de l'objet, de l'état de fatigue et de la vitesse du personnage, et du niveau de difficulté. Tout ceci fonctionne bien : la console affiche bien les messages comme "objet machin détecté" et "objet truc perdu de vue".

L'affaire s'est gâtée quand j'ai voulu déclencher un effet visuel quand l'objet est détecté, Avec Shader Graph, j'ai réalisé un shader qui teinte l'objet détecté. Malheureusement, je n'ai pas pu combiner son material avec le material de l'objet (pour mémoire shader URP/Lit avec une texture 4k dans laquelle sont prises les couleurs et les motifs).
J'ai alors tenté d'ajouter par code mon material avec mon shader. Cela me permet, au prix d'une certaine lourdeur, soit d'afficher cette teinte en laissant la texture de l'objet apparaitre (mais l'objet devient transparent), soit à colorer l'objet (on ne voit plus la texture). De plus cette coloration complète de l'objet est assez peu esthétique.

Je creuse donc dans une autre direction, je voudrais afficher en surbrillance seulement les arêtes de l'objet quand il est détecté (pour être clair : une boîte de munitions -> 6 arêtes droites, une boîte de conserve -> 2 cercles et 2 arêtes droites). Pour le moment, je souhaite n'avoir que les arêtes visibles, mais toutes les arêtes m'ira également si c'est plus simple.

Quelles seraient les pistes à explorer pour ceci ?

PS : les objets sont issus d'un asset de Synty Studio, Apocalypse.
Dernière édition par jmhoubre le 15 Sep 2022 22:52, édité 1 fois.

Avatar de l’utilisateur
jmhoubre
Messages : 690
Inscription : 05 Oct 2019 22:05

Re: Création d'un effet visuel quand un objet est détecté.

Message par jmhoubre » 13 Sep 2022 21:00

Pistes à explorer :
  1. Script Edge detection des Standard Assets
    • (--) Semble s'appliquer à toute la scène.
  2. Node Scene Depth de Shader Graph
Voir aussi How To Use Every Node in Unity Shader Graph paragraphe 57 et An explanation of the Scene Depth node

Billet assez complet sur la notion de depth.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5835
Inscription : 28 Avr 2014 11:57
Localisation : Allériot (71)

Re: Création d'un effet visuel quand un objet est détecté.

Message par boubouk50 » 14 Sep 2022 08:57

"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
jmhoubre
Messages : 690
Inscription : 05 Oct 2019 22:05

Re: Création d'un effet visuel quand un objet est détecté.

Message par jmhoubre » 14 Sep 2022 14:40

Bonjour, et merci pour la réponse,

de ce que j'ai retenu, une outline c'est ceci (que je conserve en plan B) :
Image

Moi je cherche plutôt ceci :
Image

Le lien fourni m'indique que le site a un certificat auto-signé. Je ne suis pas allé plus loin.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5835
Inscription : 28 Avr 2014 11:57
Localisation : Allériot (71)

Re: Création d'un effet visuel quand un objet est détecté.

Message par boubouk50 » 15 Sep 2022 09:40

Plutôt un shader de wireframe alors?
https://github.com/Chaser324/unity-wireframe (exemple parmi tant d'autres)

Le plus difficile sera de décider quelles sont les arêtes qui sont visibles ou non. Essayer de trouver un algo qui décide automatiquement en fonction des normales aux arêtes (smoothing group ou normale partagée pour les faces planes)
Dans ton cube, tu dessines les arêtes franches, mais en réalité tu as aussi les arêtes transversales de chaque face.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
jmhoubre
Messages : 690
Inscription : 05 Oct 2019 22:05

Re: Création d'un effet visuel quand un objet est détecté.

Message par jmhoubre » 15 Sep 2022 11:55

Merci,

j'ai regardé, et il me semble que cette solution n'est pas compatible d'URP. Je vais quand même essayer.

Avatar de l’utilisateur
jmhoubre
Messages : 690
Inscription : 05 Oct 2019 22:05

Re: Création d'un effet visuel quand un objet est détecté.

Message par jmhoubre » 15 Sep 2022 22:50

Bonsoir,

j'ai renoncé à mettre en œuvre cette solution, pour laquelle il me manque des connaissances.

J'ai poursuivi avec mon shader, et j'ai réussi à obtenir quelque chose qui me va : j'ai exposé la texture des objets, la couleur d'émission et un booléen HighLighted qui permet de déclencher ou non l'effet. Je n'ai pas les arêtes de l'objet, mais une illumination, ce qui me suffit.

Je partage le graphe, qui n'est pas une super réalisation, mais pourra peut-être servir à d'autres. Image

Avatar de l’utilisateur
jmhoubre
Messages : 690
Inscription : 05 Oct 2019 22:05

Re: [Résolu (quasi)] Création d'un effet visuel quand un objet est détecté.

Message par jmhoubre » 16 Sep 2022 14:36

Petit complément : il n'y a pas de méthode, à ma connaissance, SetBool.

J'ai donc modifié _HighLighted en float, mode integer. Un noeud Comparison réglé sur Not Equal compare _HighLighted à 0. Il est connecté aux 2 noeuds Branch.

Voici le code que j'utilise :

Code : Tout sélectionner

using UnityEngine;

public abstract class Item : MonoBehaviour
{	
	private Renderer meshRenderer;
	private Material highlightMaterial;
	private int propertyID;

	private void Awake ()
	{
		// Récupère le material.
		meshRenderer = GetComponent<MeshRenderer> ();
		highlightMaterial = meshRenderer.material;

		// Identifiant du champ HighLighted.
		propertyID = Shader.PropertyToID ("_HighLighted");
	}

	public void ActivateHighLightedMaterial ()
	{
		highlightMaterial.SetFloat (propertyID, 1);
	}

	public void UnActivateHighLightedMaterial ()
	{
		highlightMaterial.SetFloat (propertyID, 0);
	}
}

Répondre

Revenir vers « Unity le logiciel »