Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu Unity 3D Problème timer

Sujet résolu
    27 mai 2017 à 19:11:04

    Bonjour à tous, voici qq jours que je crée un jeu en 2D sur Unity (Une petite tête verte qui se déplace et qui va chercher des fruits et des bonus qui apparaissent à des endroits aléatoires), pour les fruits qui donnent des points j'ai pas eu bcp de soucis, mais pour les bonus c'est autre chose, tout d'abord il y a 2 bonus, un qui donne immédiatement un certain nombre de points mais qui accélère le personnage pendant un certain temps assez vite, ajoutant un peu de difficulté. Et puis le 2e il augmente la fréquence d'apparition des fruits pendant un certain temps aussi.

    Et vous l'aurez deviné c'est au niveau du temps des bonus que j'ai un problème, 

    Donc le code commence comme ça :

    	void OnTriggerEnter2D(Collider2D coll) {
    
    
    		if (OnBonusInstantiated.wichBonus == 1) {
    
    			StartCoroutine ("Wait5SecondsAndDestroy");
    
    		}
    
    		if (OnBonusInstantiated.wichBonus == 2) {
    
    			StartCoroutine ("Wait8SecondsAndDestroy");
    
    		}



    Et puis les 2 fonctions se présentent comme ça :

    	IEnumerator Wait5SecondsAndDestroy(){
    
    		Global.isBurgerEaten = true;
    		gameObject.GetComponent<Renderer> ().enabled = false;
    		gameObject.GetComponent<BoxCollider2D> ().enabled = false;
    		Global.score += Random.Range (500, 1000);
    		Global.totalBonusEaten++;
    		yield return new WaitForSeconds (5f);
    		print ("waited5");
    		Global.isBurgerEaten = false;
    		Destroy (gameObject);
    	
    
    	}
    
    	IEnumerator Wait8SecondsAndDestroy(){
    
    		Global.isCakeEaten = true;
    		gameObject.GetComponent<Renderer> ().enabled = false;
    		gameObject.GetComponent<BoxCollider2D> ().enabled = false;
    		Global.totalBonusEaten++;
    		yield return new WaitForSeconds (8f);
    		print ("waited8");
    		Global.isCakeEaten = false;
    		Destroy (gameObject);
    
    
    	}



    Et on a des problèmes dans tous les sens, les timers fonctionnent une fois mais pas la 2e fois, ou bien le bonus ne s'arrête jamais et se détruit avant.

    Je suis un peu perdu et je trouve que la fonction "WaitForSeconds", c'est un peu le bazar, ou bien je ne comprends pas bien son fonctionnement.

    Si qqn a une piste je dis pas non ;)

    Merci d'avance

    Hip

    PS : une petite image du jeu :

    -
    Edité par Hip01 27 mai 2017 à 19:13:55

    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2017 à 20:26:50

      Salut,

      Je pense que pour l'instant, tu ramasses un bonus, exemple un burger, tu dis qu'il mange un burger isBurgerEaten = true.

      Pendant ce temps tu en ramasses un autre donc isBurgerEaten = true mais 1 secondes après la première coroutine arrête son timer et dit stop isBurgerEaten = false et donc vu qu'apparemment c'est le même objet la deuxième coroutine est aussi passé à isBurgerEaten = false. Enfin pas la coroutine, je veux dire l'objet global, enfin j'espère que tu m'as compris.

      Voilà ce que j'en dit après je ne sais pas si c'est ça, mais apparemment ça doit être ça.

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        9 juin 2017 à 9:28:21

        Salut,

        Où est-ce que tu testes ta variable de contrôle isBurgerEaten

        Sinon, si tu penses que ça vient de ton WaitForSeconds, tu dois pouvoir passer par une boucle while et un timer fais à la main (genre tu récupères le temps à la frame où ta coroutine démarre et dans ton while, tu vérifies si (temps_actuel - temps_départ) est supérieur ou égale au temps que tu souhaites attendre). Personnellement, je pense qu'il s'agit d'une erreur logique quelque part plutôt que d'une erreur de la part de la fonction mais je ne pense pas que ça vienne des blocs que tu nous montres.

        • Partager sur Facebook
        • Partager sur Twitter
          16 juin 2017 à 11:35:07

          Si je peut te donner quelques uns de mes conseils :

          Tu utilise Destroy(), mais tu peut lui donner en deuxième argument le temps (en seconde) avant qu'il ne se déclenche
          Donc dans ta fonction Start(), tu peut donc écrire Destroy(gameObject, 5)

          Mais je suis pas sure que ça soit la  réponse à ta question...

          Sinon vue que tu utilise des variable global, je me dis que tu pourrais mettre un timer directement dedans, exemple :

          float timerCake = 0;
          
          void Update()
          {
              if(timerCake>0)
              {
                   timerCake -= Time.deltaTime;
                   CakeEaten = true;
              }else{
                   CakeEaten = false;
              }
          }

           Et du coup plutôt que de t’embêter avec un grosse fonction, dans ta détection du déclencheur (trigger) tu aurais juste à inserer :

          Global.TimerCake += 5;

          Es ce que j'ai répondu à ta question ?
          Si non hésite pas à me réexpliquer, je suis un peu bouché x)

          • Partager sur Facebook
          • Partager sur Twitter
          L'humanité n'a pas lieu d'être quant on éprouve une honte a faire pare de cette espèce...Open mind lead to open doors
            5 août 2017 à 15:46:00

            Désolé de répondre si tard, j'ai eu des examens et je suis parti en vacances, en tout cas je suis revenu ici pour vérifier si j'avais eu qq réponses et j'ai été ravi de voir vos réponses, donc tout d'abord grand merci à vous 3 ! :)

            Et même si les réponses de born2gamingFr et de Kaihyo étaient aussi très bien pensées, la réponse de :wilo: , tout particulièrement son idée de mettre les timers dans le Global, est celle pour laquelle j'ai opté, encore merci à toi et à vous de m'avoir aidé ;)

            A bientôt

            Hip

            PS : pour ta réponse born2gamingFr je comprends ton idée mais étant donné que les bonus durent maximum 5 à 10 secondes et qu'ils apparaissent toutes les 30 secondes ils n'auraient pas pu se croiser ;), 

            quant à toi Kaihyo tu rejoins un peu l'idée de :wilo: , malheureusement je ne suis pas un expert je n'ai pas tout compris dans ce que tu as proposé ;)

            • Partager sur Facebook
            • Partager sur Twitter
              14 août 2017 à 11:54:55

              Je suis heureux d'avoir put t'aider ^^

              Si jamais t'as besoin d'autre chose hésite pas, je suis pas expert sur unity mais je pense pouvoir que je touche un minimum ma bille ;)

              Bonne journée l'ami 😀

              • Partager sur Facebook
              • Partager sur Twitter
              L'humanité n'a pas lieu d'être quant on éprouve une honte a faire pare de cette espèce...Open mind lead to open doors

              Jeu Unity 3D Problème timer

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown