[C#]Unity2D : Interrupteur pour changer le Sprite d'un autre objet.

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
bisonfoutu
Messages : 27
Inscription : 22 Juil 2015 15:44

[C#]Unity2D : Interrupteur pour changer le Sprite d'un autre objet.

Message par bisonfoutu » 12 Mai 2016 12:41

Bonjour,

Je suis actuellement en train de développer un petit jeu ou un personnage glisse sur la glace et ne peut donc s’arrêter ou changer de direction que s'il rentre en contacte avec une pierre.

Je suis en train d'ajouter un système de flèche qui font changer la direction du joueur sans l’arrêter. Ces flèches sont liés à des interrupteurs qui permettent de les faire changer de sens en changeant le Sprite. C'est sur ce code que je rencontre un problème que je ne comprend pas :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class ArrowInterrupteur : MonoBehaviour {

    public GameObject arrow;

    
    public Sprite sprite1;
    public Sprite sprite2;

    public SpriteRenderer spriteRdr;

    


    // Use this for initialization
    void Start()
    {
        spriteRdr = arrow.GetComponent<SpriteRenderer>();
        spriteRdr.sprite = sprite1;
        
    }
	
	// Update is called once per frame
	void Update () {
       
	}

    void OnTriggerEnter2D(Collider2D col)
    {
       if(col.CompareTag("Player"))
        {
            if (spriteRdr.sprite == sprite1) 
            {
                spriteRdr.sprite = sprite2;
                
            }

            if (spriteRdr.sprite == sprite2)
            {
                spriteRdr.sprite = sprite1;
            }
        }
    } 
}
La partie du code OnTriggerEnter2D() ne fonctionne pas, le Sprite ne change pas tandis que la collision est bien prise en compte. Ce que je ne comprend vraiment pas, c'est que la partie dans le Start() où j'initialise mon Sprite fonctionne bien elle, alors que le code est exactement le même.

Mes variables sont quant à elles bien assignés dans l'éditeur.

J'espère que vous aurez une piste à me donner.
Merci d'avance pour votre aide.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [C#]Unity2D : Interrupteur pour changer le Sprite d'un autre objet.

Message par boubouk50 » 12 Mai 2016 13:08

Si tu rentres bien dans le OnTriggerEnter () alors ce sont tes conditions qui coincent.
Soit Player n'est pas le bon tag, soit la comparaison de sprite n'est pas valable (je pencherai pour cette option).
Teste plutôt le GetInstanceId () unique par objet dans la scène. (DOC sprite)
"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

bisonfoutu
Messages : 27
Inscription : 22 Juil 2015 15:44

Re: [C#]Unity2D : Interrupteur pour changer le Sprite d'un autre objet.

Message par bisonfoutu » 12 Mai 2016 13:43

Je ne croit pas que le problème vienne de la condition.

lorsque je met un Debug.Log à l'interieur de la condition comme cela :

Code : Tout sélectionner

 void OnTriggerEnter2D(Collider2D col)
    {
       if(col.CompareTag("Player"))
        {
            if (spriteRdr.sprite == sprite1) 
            {
            	Debug.Log("test");
                spriteRdr.sprite = sprite2;
                
            }
La console retourne bien le "test", donc je suppose que cela signifie que la condition est bien remplit.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [C#]Unity2D : Interrupteur pour changer le Sprite d'un autre objet.

Message par boubouk50 » 12 Mai 2016 13:57

Effectivement.
Ton erreur se situe dans la 2e condition qui est forcément remplie par la première.
Lorsque tu rentres dans la 1e condition, ton sprite est le sprite2, donc il t'ouvre la porte à la seconde condition. Tu auras donc toujours le sprite1 en visu. Mets un else à la place, ou ta 2e condition dans ce else
"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

Molgy
Messages : 26
Inscription : 12 Mai 2016 04:01

Re: [C#]Unity2D : Interrupteur pour changer le Sprite d'un autre objet.

Message par Molgy » 12 Mai 2016 14:00

Il te suffit juste de remplacer ton deuxième if par un else if.

Là actuellement tu dis

Si X = 1 alors X = 2 et juste après tu dis si X = 2 alors X = 1 mais tu viens juste de dire que X = 2 donc forcément au final X = toujours 1.

:)
T'entraîner tu devras, :!:
Tester tu feras, :?:
Réussite tu auras. 8-)
-- Dayo ! :merci:

bisonfoutu
Messages : 27
Inscription : 22 Juil 2015 15:44

Re: [C#]Unity2D : Interrupteur pour changer le Sprite d'un autre objet.

Message par bisonfoutu » 12 Mai 2016 14:46

Merci beaucoup pour votre réponse, ça fonctionne!

Je pensais que la Fonction OnTriggerEnter2D() ne se déclanchais qu'une fois et que par conséquent il ne pouvait y avoir qu'un seul des deux "if()" qui s'activais. En tout cas je saurais pour la prochaine fois.
Encore merci à vous!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [C#]Unity2D : Interrupteur pour changer le Sprite d'un autre objet.

Message par boubouk50 » 12 Mai 2016 15:00

(je déverrouille pour ajuster)
Ça n'a rien a voir! La fonction est bien appelée une seule fois, mais l'exécution du code se fait linéairement. Donc, dans ton code de départ, tu entres dans la 1e condition, change le sprite, puis (parce que c'est linéaire, sinon il faut un switch) tu testes la seconde condition, et comme ton sprite a changé avant, alors elle est remplie donc tu entre dedans et tu rechanges le sprite.
Les ifs, s'ils ne sont pas imbriqués (else) s'exécutent à la suite et donc les changements fait dans un peuvent affecter les suivants.
"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

Verrouillé

Revenir vers « (C#) CSharp »