problème sur un script changeant la couleur d'un GameObject

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Iunatic
Messages : 2
Inscription : 17 Juin 2019 13:51

problème sur un script changeant la couleur d'un GameObject

Message par Iunatic » 19 Juin 2019 22:57

Et on y va pour la première de mon milliard de questions ^^

Du coup, j'ai mon GameObject (une sphère)qui est également mon Character.
Ce que je voudrais, c'est que mon GameObject alterne entre 3 couleurs (ici le rouge, le bleu et le jaune) avec donc la couleur "équipée", un Input pour passer à la couleur précédente et un autre pour passer à la couleur suivante.

J'ai donc pour l'instant ça comme script :

Code : Tout sélectionner

public Color Rouge = Color.red;
public Color Bleu = Color.blue;
public Color Jaune = Color.yellow;
public Color Sphere = Color.white;
public Renderer rend;




    // Start is called before the first frame update
    void Start()
    {
        rend = GetComponent<Renderer>();
        rend.material.color = Sphere;
    }

    // Update is called once per frame
    void Update()
    {
        {
            if (Input.GetKeyDown(KeyCode.Z))
            {
                Sphere = Rouge;
                rend.material.color = Sphere;
            }

            //gestion rouge à bleu 
            if (Sphere == Rouge && Input.GetKeyDown(KeyCode.E))
            {
                Sphere = Bleu;
                rend.material.color = Sphere;
            }

            //gestion rouge à jaune
            if (Sphere == Rouge && Input.GetKeyDown(KeyCode.A))
            {
                Sphere = Jaune;
                rend.material.color = Sphere;
jusque là joie ça fonctionne.

Du coup, je rajoute la suite pour la gestion du jaune et du bleu:

Code : Tout sélectionner

public class testcolor : MonoBehaviour
{
    public Color Rouge = Color.red;
    public Color Bleu = Color.blue;
    public Color Jaune = Color.yellow;
    public Color Sphere = Color.white;
    public Renderer rend;




    // Start is called before the first frame update
    void Start()
    {
        rend = GetComponent<Renderer>();
        rend.material.color = Sphere;
    }

    // Update is called once per frame
    void Update()
    {
        {
            if (Input.GetKeyDown(KeyCode.Z))
            {
                Sphere = Rouge;
                rend.material.color = Sphere;
            }

            //gestion rouge à bleu 
            if (Sphere == Rouge && Input.GetKeyDown(KeyCode.E))
            {
                Sphere = Bleu;
                rend.material.color = Sphere;
            }

            //gestion rouge à jaune
            if (Sphere == Rouge && Input.GetKeyDown(KeyCode.A))
            {
                Sphere = Jaune;
                rend.material.color = Sphere;
            }
        }

        {//gestion bleu à jaune
            if (Sphere == Bleu && Input.GetKeyDown(KeyCode.E))
            {
                Sphere = Jaune;
                rend.material.color = Sphere;
            }

            //gestion bleu à rouge
            if (Sphere == Bleu && Input.GetKeyDown(KeyCode.A))
            {
                Sphere = Rouge;
                rend.material.color = Sphere;
            }
        }

        { //gestion Jaune à rouge
            if (Sphere == Jaune && Input.GetKeyDown(KeyCode.E))
            {
                Sphere = Rouge;
                rend.material.color = Sphere;
            }

            //gestion Jaune à Bleu
            if (Sphere == Jaune && Input.GetKeyDown(KeyCode.A))
            {
                Sphere = Bleu;
                rend.material.color = Sphere;
            }
        }
    }
}
Et là, cauchemar, ça ne fonctionne plus.

Quand ma sphère est rouge, appuyez sur le bouton A me fait passer en bleu (alors que selon la partie du code gérant le rouge, cela devrait être jaune), et en Bleu le même bouton me fait de nouveau passer en rouge.

Quand au bouton E, il ne modifie même plus les couleurs quand ma sphère est rouge, mais transforme le bleu en rouge.
Any tips ?

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: problème sur un script changeant la couleur d'un GameObject

Message par Moi 1971 » 20 Juin 2019 08:06

Bonjour,
Bon tout ça c'est trop compliqué... Je ne sais pas si c'est un "exercice" sur les if mais si c'est pour faire un code fonctionnel ce n'est pas la bonne voie.
1 - Le fonctionne à l’intérieur du if() :
if (A) => Test si A est vrai
if(A || B) => Test si A est vrai puis SI_ET_SEULEMENT_SI A est faut ALORS test si B est vrai. => Si A est vrai pas de test de B
if(A && B) => Test si A est vrai puis SI_ET_SEULEMENT_SI A est vrai alors ALORS test si B est vrai => Si A est faut pas de test de B
Il faut comprendre de ça que dans une série de test dans un if, il faut mettre en premier "l’évènement" le plus rare pour ne pas à avoir à tester le deuxième élément.
Pour ton cas, qui est un exemple parfait, l'objet à toujours une couleur. Donc ce n'est pas un évènement rare. il faut mettre en deuxième position le test de la couleur. En revanche, l’appuie sur une touche est un évènement rare. Même si tu spam la touche, tu vas appuyer 3-4 fois par seconde dessus maxi, comparer au 30 passages dans la boucle Update par seconde => 10% des cas...
2 - Changer les couleurs :
Tu vois dans ton exemple que pour 3 couleurs c'est déjà le bordel... Imagine si tu rajoute une couleur par la suite... Ton code n'est pas évolutif. La solution connue (pourquoi réinventer la roue) c'est l'utilisation dun tableau contenant les couleurs...

En speudo_code:

Code : Tout sélectionner

tab_Couleur[Color.white,Color.red,Color.blue;Color.yellow]
Int la_Couleur = 0;

Start() 
=> rend.material.color = tab_Couleur[la_Couleur]; 

Update() 
=> SI touche A 
      ALORS 
                     SI la_Couleur < Taille de tab_Couleur 
                     ALORS 
                                  la_Couleur ++; 
                     SINON 
                                  la_Couleur  = 0;
                     rend.material.color = tab_Couleur[la_Couleur];            

     SINON SI touche E 
     ALORS 
                     SI la_Couleur > 0 
                     ALORS 
                                  la_Couleur -- ; 
                     SINON 
                                  la_Couleur  = Taille de tab_Couleur;
                     rend.material.color = tab_Couleur[la_Couleur];   
      
C'est plus évolutif comme façon de faire.
PS : par feignantise, j'ai pas vérifié si il y a des erreurs, mais le principe est exprimé correctement je pense.
PS2: attention au rang max d'un élément dans un tableau est égal à la taille du tableau - 1...

Répondre

Revenir vers « Scripting »