[Résolu][DB-AL] C# Alterner l'état d'un gameobject

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
Dermenore
Messages : 7
Inscription : 10 Fév 2017 19:25

[Résolu][DB-AL] C# Alterner l'état d'un gameobject

Message par Dermenore » 10 Fév 2017 19:51

Bonjour

Alors, j'ai dans mon jeu des objets portail, qui au contact du joueur, le téléporte à une destination indiqué.

Mon but est que toute les trois secondes, ces portails deviennent des méchants portails (noter l'imagination de mes noms) qui téléportent le joueur à une autre position, la case départ souvent, et au passage change de forme, histoire de montrer qu'ils sont méchant.

Voici le script que j'ai rédigé (avec de l'aide) à cet effet (je l'explique juste après):

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Teleporteur_2 : MonoBehaviour {

    public Transform Other;
     public Transform A_Other;
     bool transformation = false;
    public Sprite mimic;
    public Sprite normale;
    SpriteRenderer spriterenderer_mimic;
    SpriteRenderer spriterenderer_normale;
    float timer_mimic = 0;
    float timer_normale = 0;


    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Player")
             if (transformation == false)
        {
            collision.transform.position = Other.position;
        }
        if (collision.gameObject.tag == "Player")
         if (transformation == true)
        {
            collision.transform.position = A_Other.position;
        }
    }

    // Use this for initialization
    void Start () {
        spriterenderer_mimic = GetComponent<SpriteRenderer>();
        spriterenderer_normale = GetComponent<SpriteRenderer>();
    }
	
	// Update is called once per frame
	void Update () {

        if (transformation == true)
        { spriterenderer_mimic.sprite = mimic; }


        if (transformation == false)
        { timer_mimic += Time.deltaTime; }
            

        if (transformation == true)
        { timer_normale += Time.deltaTime; }
            


        if (timer_mimic == 3)
         {
            transformation = true;
            timer_mimic = 0;
        }

        if (timer_normale == 3)
        {
            transformation = false;
            timer_normale = 0;
            spriterenderer_normale.sprite = normale;
            
        }

    }
  
}
Comme vous le voyez, tout se basse sur une fonction bool "transformation". Lorsque elle est fausse le portail est normale et envoi à la position "Other" et quand elle est vrai, le portail change de sprite et envoi à la position "A_Other" (imagination!). Tout cela marche.

Là où ça coince c'est que j'ai voulut mettre un timer pour réguler le changement d'état (avant il était aléatoire). Donc nous avons une fonction float "timer_mimic" qui, une fois arrivé à 3, est sensé faire passer "transformation" à true. Au passage "timer_mimic" repasse à 0.

Une fois "transformatino" en true, s'active un second timer "timer_normale" qui au bout de trois seconde est sensé refaire passer "transformation" en false. Et là "timer_normale" repasse à 0, tandis que le compte de "timer_mimic" reprend, assurant en théorie un changement infinie toute les trois secondes. En théorie.

Sauf qu'en pratique, ça ne marche pas. Quand je lance le jeu rien ne change, les portails restent à leur état de base. "transformation" reste en false.

Visual studio n'affiche aucun ligne rouge, pour moi le code devrait fonctionner mais...non. J'ai dû me planter quelque part.

Est-ce que quelqu'un pourrait donc me dire où j'ai fais une erreur s'il vous plait? Ce serait vraiment très sympa.

Merci d'avoir lu ce message jusque au bout, et bonne journée à vous.
Dernière édition par Dermenore le 12 Fév 2017 13:56, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: C# Alterner l'état d'un gameobject

Message par Max » 11 Fév 2017 12:07

Bonjour Dermenore (re),

J'avoue que la lecture de ton code est un peu confuse à mes yeux (et pour mon esprit embrumé d'un samedi matin).
Si cela peut t'aider, si tu veux un changement d'état à intervalle régulier, il existe en effet plusieurs solutions.
Par exemple, tu pourrait écrire un truc du genre;

Code : Tout sélectionner

	bool myState = false;
	float interval = 2.0f;

	void Start() {
		InvokeRepeating("RepeatingFunction", interval , interval );
	}

	void RepeatingFunction() {
		myState = !myState;
		Debug.Log(myState);
	}

Autre alternative éventuellement,

Code : Tout sélectionner

	bool myState = false;
	float interval = 2.0f;

	void Start() {
		StartCoroutine( RepeatingFunction() );
	}

	IEnumerator RepeatingFunction () {
		while(true) {
			myState = !myState;
			Debug.Log(myState);
			yield return new WaitForSeconds(interval);
		}
	}
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Dermenore
Messages : 7
Inscription : 10 Fév 2017 19:25

Re: [DB] C# Alterner l'état d'un gameobject

Message par Dermenore » 12 Fév 2017 13:58

Salut Max

J'ai utilisé la première méthode et ça a marché sans problème. Merci beaucoup!

Comment ça se fait d'ailleurs que le changement d'état se fasse toute les trois secondes avec un float interval égale à 2? Cela ne devrait pas changer toute les 2 frames?

Et désoler pour le titre. J'ai vu le message seulement maintenant et d'ailleurs je ne sais pas la différence entre du réseau et de l'algorithmie...

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB] C# Alterner l'état d'un gameobject

Message par Max » 12 Fév 2017 14:32

Bonjour Dermenore,
Dermenore a écrit :Comment ça se fait d'ailleurs que le changement d'état se fasse toute les trois secondes avec un float interval égale à 2? Cela ne devrait pas changer toute les 2 frames?
heu non, si 'interval' est bien à 2.0f, tu devrais bien avoir un changement toute les 2 secondes. Tu dois avoir un loup quelque part je pense .
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Dermenore
Messages : 7
Inscription : 10 Fév 2017 19:25

Re: [DB] C# Alterner l'état d'un gameobject

Message par Dermenore » 12 Fév 2017 20:33

Oui justement cela se fait en secondes (moi j'en ai compté 3 mais je ne suis pas une horloge) et c'est ce qui m'étonne. Je croyais que toute les valeurs d'un script étaient de base en frame. :)

Dermenore
Messages : 7
Inscription : 10 Fév 2017 19:25

Re: [DB] C# Alterner l'état d'un gameobject

Message par Dermenore » 16 Fév 2017 00:01

Pour le coup ce fils aussi peut être marqué en résolut. La solution donné par Max a parfaitement marché. :-D

Répondre

Revenir vers « (C#) CSharp »