[RESOLU]Regroupe Component avec Color

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
EmileF
Messages : 674
Inscription : 18 Mars 2017 19:39

[RESOLU]Regroupe Component avec Color

Message par EmileF » 13 Mai 2020 17:14

Bonjour,
mon titre n'est pas très clair, excuses

Voilà, je voudrais créer une fonction pour colorer n'importe quel objet avec une simple commande du genre

Code : Tout sélectionner

public void Colore(GameObject Objet, Color color)
Pour être plus clair, j'ai écrit un petit scrip d'exemple.
Je sais qu'il ne fonctionne pas. c'est juste pour montrer le principe de ce que je voudrais obtenir, sachant que le script final sera plus long avec des options de temps et de couleur. C'est le principe de base que je cherche.

Code : Tout sélectionner

    public void Colore(GameObject Objet, Color color)
    {
        Object cible = new Object();
        if (Objet.GetComponent<Renderer>())
            cible = Objet.GetComponent<Renderer>().material.color;
        if (Objet.GetComponent<TextMesh>())
            cible = Objet.GetComponent<TextMesh>();
        if (Objet.GetComponent<Image>())
            cible = Objet.GetComponent<Image>().color;
        if (Objet.GetComponent<Light>())
            cible = Objet.GetComponent<Light>().color;
        if (Objet.GetComponent<Camera>())
            cible = Objet.GetComponent<Camera>().backgroundColor;

        cible.color = color;
    }
     
Si quelqu'un avait une petite idée pour me mettre sur la voie...
Dernière édition par EmileF le 14 Mai 2020 09:45, édité 1 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Regroupe Component avec Color

Message par djulio74 » 13 Mai 2020 21:12

Salut Emile!
Je ne suis pas sur que tu puisse tout modifier comme ça en passant par un objet, par contre tu peux plutôt écrire, pour rester dans ton exemple:

Code : Tout sélectionner

 if (Objet.GetComponent<Light>())
            Objet.GetComponent<Light>().color = color
            
donc pas forcément besoin d'utiliser "cible".
pour ce qui est de la couleur du matérial il faut savoir que pour un renderer, tu as deux type de material : le material et le sharedMaterial.
- Modifier un des paramètre du premier créera automatiquement une nouvelle instance du material utilisé par le Renderer. L'avantage de de ne changer par exemple la couleur que d'un seul objet qui utilise un matérial donnée, vu qu'un nouvea sera créé pour prendre en compte le changement. Le probleme est que, comme je me doute que tu es toujours en mode editeur, unity va te rappeler à l'ordre car créer une nouvelle instance pour chaque changement risque d'engorger la mémoire.
- Modifier le second c'est modifier le material original utilisé par plusieurs renderer dnc plusieurs objet. si tu modifie le SharedMatérial ( comprendre material partagé), tout les objet qui utilisent ce matérial changeront d'apparence aussi. Le matérial restera unique le changement se verra sur tout les objet utilisant le materail.

Pour ce qui est de la mise en oeuvre, que ce soit pour material ou sharedMaterial, tu peut tout a fait utiliser

Code : Tout sélectionner

Objet.GetComponent<Renderer>().material.color = color;
ce qui changera bien la couleur principal du material. A la condition que le shader utilisé ai bien déclaré la variable "_Color". sinon rien ne se passera.

Voila pour un début de piste et de peut être mise en garde.
Je pense que ça peut s'appliquer aussi a d'autres paramètres que tu essaye de modifier.
en verifiant, pour les différent composant :
- TextMesh : tu peut utilisé le parametre color
- image : il n'y a pas de parametre color mais tinitColor (image.tintColor)
- light : tu peut utilisé le parametre color
- camera : comme tu l'as mis, utiliser Camera.backgroundColor.

Pour ton exemple de script, sans l'avoir essayé, ça donnerai ça :

Code : Tout sélectionner

    public void Colore(GameObject Objet, Color color)
    {
        if (Objet.GetComponent<Renderer>())
            Objet.GetComponent<Renderer>().material.color = color;
        if (Objet.GetComponent<TextMesh>())
            Objet.GetComponent<TextMesh>().color = color;;
        if (Objet.GetComponent<Image>())
            Objet.GetComponent<Image>().tintColor= color;
        if (Objet.GetComponent<Light>())
            Objet.GetComponent<Light>().color = color;
        if (Objet.GetComponent<Camera>())
            Objet.GetComponent<Camera>().backgroundColor = color;
    }
Je ne pense pas que tu puisse arriver a stocker les composant dans un seul objetc cible comme tu le tente. si ce n'est pour material et image qui utilisent des parametre différent (color, tintColor)

Voila pour un petit bout de réponse. ;)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

EmileF
Messages : 674
Inscription : 18 Mars 2017 19:39

Re: Regroupe Component avec Color

Message par EmileF » 14 Mai 2020 09:44

Merci Djulio,
Ca confirme ce que je pensais.
Peut-être la possibilité d'un array, mais je n'ai pas trouvé de point commun pour regrouper tout dans un Array.
En tout cas merci
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: [RESOLU]Regroupe Component avec Color

Message par jmhoubre » 15 Mai 2020 12:07

Voici un bout de code qui fonctionne, il est à compléter.
La scéne contient un empty portant le script Testing, qui affiche 3 slots pour des objets à colorer, à renseigner dans l'inspecteur.

Code : Tout sélectionner

using UnityEngine;

public class Testing : MonoBehaviour {

	[SerializeField] private GameObject target1, target2, target3;
	
	void Start () {
		if (target1 != null) {
			Colorizer.Colorize (target1, Color.red);
		}
		if (target2 != null) {
			Colorizer.Colorize (target2, Color.blue);
		}
		if (target3 != null) {
			Colorizer.Colorize (target3, Color.yellow);
		}		
	}
}
La class Colorizer effectue les opérations de couleur sur les objets qu'elle connait, si l'objet n'est pas connu, un simple Debug l'indique dans la console. Elle est à compléter avec les autres types de trucs qu'on peut colorier.

Code : Tout sélectionner

using UnityEngine;

public static class Colorizer
{
    public static void Colorize(GameObject _gameObject, Color _color) {
        // Détermine le type de GameObject et applique la sous-méthode ad hoc.
        if (_gameObject.GetComponent<Renderer>() != null) {
            RendererColor (_gameObject, _color);
            return;
        }
        if (_gameObject.GetComponent<TextMesh> () != null) {
            TextMeshColor (_gameObject, _color);
            return;
        }
        if (_gameObject.GetComponent<CanvasRenderer> () != null) {
            CanvasRendererColor (_gameObject, _color);
            return;
        }

        // Objet pas colorizable.
        Debug.Log ("L'objet " + _gameObject + " ne peut pas être colorié.");
    }

    private static void RendererColor(GameObject _gameObject, Color _color) {
        _gameObject.GetComponent<Renderer> ().material.color = _color;
    }

    private static void TextMeshColor (GameObject _gameObject, Color _color) {
        _gameObject.GetComponent<TextMesh> ().color = _color;
    }

    private static void CanvasRendererColor (GameObject _gameObject, Color _color) {
        _gameObject.GetComponent<CanvasRenderer> ().SetColor(_color);
    }
    
    // Et caetera...
}


EmileF
Messages : 674
Inscription : 18 Mars 2017 19:39

Re: [RESOLU]Regroupe Component avec Color

Message par EmileF » 15 Mai 2020 12:37

Merci,
Mais ça je sais le faire,
c'était essayer de regrouper tout en un seul "objet"
et ça ce n'est pas possible j'ai donc fait:

Code : Tout sélectionner

    private Color GetColor(GameObject objet)
    {
        Color getcolor = new Color();
        if (objet.GetComponent<Renderer>())
            getcolor = objet.GetComponent<Renderer>().material.color;
        else if (objet.GetComponent<TextMesh>())
            getcolor = objet.GetComponent<TextMesh>().color;
        else if (objet.GetComponent<Text>())
            getcolor = objet.GetComponent<TextMesh>().color;
        else if (objet.GetComponent<Image>())
            getcolor = objet.GetComponent<Image>().color;
        else if (objet.GetComponent<Light>())
            getcolor = objet.GetComponent<Light>().color;
        else if (objet.GetComponent<Camera>())
            getcolor = objet.GetComponent<Camera>().backgroundColor;
        return getcolor;
    }
    private void SetColor(GameObject objet, Color color)
    {
        if (objet.GetComponent<Renderer>())
            objet.GetComponent<Renderer>().material.color = color;
        else if (objet.GetComponent<TextMesh>())
            objet.GetComponent<TextMesh>().color = color;
        else if (objet.GetComponent<Text>())
            objet.GetComponent<TextMesh>().color = color;
        else if (objet.GetComponent<Image>())
            objet.GetComponent<Image>().color = color;
        else if (objet.GetComponent<Light>())
            objet.GetComponent<Light>().color = color;
        else if (objet.GetComponent<Camera>())
            objet.GetComponent<Camera>().backgroundColor = color;
    }

La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « Scripting »