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
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.