Changer une variable dans une coroutine

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Valva
Messages : 23
Inscription : 30 Mai 2020 17:10

Changer une variable dans une coroutine

Message par Valva » 03 Juin 2020 04:27

Bonjours, voici mon code:

Code : Tout sélectionner

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

public class Spawner : MonoBehaviour
{
    public GameObject enemies;
    public Vector3 spawnValues;
    private float spawnWait;
    public float startWait;
    public bool stop;
    public bool sop;

    private void Start()
    {
        StartCoroutine(waitSpawner());
        spawnWait = 1.5f;
    }

    private void Update()
    {
    }

    IEnumerator waitSpawner()
    {
        yield return new WaitForSeconds(startWait);

        while (!stop)
        {

            Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), Random.Range(-spawnValues.y, spawnValues.y), 0);

            Instantiate(enemies, spawnPosition + transform.TransformPoint(0, 0, 0), gameObject.transform.rotation);

            yield return new WaitForSeconds(spawnWait);




        }

        yield return new WaitForSeconds(15f);

            spawnWait = 0.5f;
             
            
    }

en gros j'instancie des objets selon la variable spawn wait, et je voudrais accelerer le spawn des objet au fil du temps. Ma variable spawnwait ne devrait pas changer au bout de 15 seconde ?

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

Re: Changer une variable dans une coroutine

Message par boubouk50 » 03 Juin 2020 07:58

Salut,

Tu restes dans ta boucle while car stop n'est pas modifié. Tu ne vas donc pas plus loin dans la coroutine.
Que cherches-tu à faire exactement?
Instancier un ennemi aléatoirement dans une zone toutes les spawnWait secondes mais changer de cadence au bout de 15 secondes?
"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

Valva
Messages : 23
Inscription : 30 Mai 2020 17:10

Re: Changer une variable dans une coroutine

Message par Valva » 03 Juin 2020 12:56

Ah oui je reste dans la boucle, mais j'ai besoin de la boucle pour instancié mes objets >< Oui je les instancie a un endroit aléatoire et j'aimerais augmenter la cadence.

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

Re: Changer une variable dans une coroutine

Message par boubouk50 » 03 Juin 2020 13:58

Dans ce cas, tu pourrais définir un timer dans la boucle (compter le temps) et gérer la cadence en fonction de ce timer. C'est très simple.
"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

Valva
Messages : 23
Inscription : 30 Mai 2020 17:10

Re: Changer une variable dans une coroutine

Message par Valva » 03 Juin 2020 14:09

Je n'y avais pas pensé merci

Valva
Messages : 23
Inscription : 30 Mai 2020 17:10

Re: Changer une variable dans une coroutine

Message par Valva » 03 Juin 2020 14:27

Je dois dire que je ne trouves pas ça simple :p

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Changer une variable dans une coroutine

Message par djulio74 » 03 Juin 2020 18:22

une solution alternative serait de lancer une deuxième coroutine qui elle s'oocupe de modifier Spawnwait.
donc la premiere comme celle que tu as qui instancie les ennemis, et lautre qui au bout de tant de temps reduit le temps a attendre avant l'appartition du nouvel ennemi.
ça donnerait quelque chose comme :

Code : Tout sélectionner

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

public class Spawner : MonoBehaviour
{
	public GameObject enemies;
	public Vector3 spawnValues;
	private float spawnWait;
	public float startWait;
	public bool stop;
	public bool sop;

	private void Start()
	{
		// déclare le SpawnWait avant de lancer les coroutine, c'est toujours mieux ;)
		spawnWait = 1.5f;
		StartCoroutine(waitSpawner());
		//coroutine qui va s'occuper de diminuer le SpawnWait
		StartCoroutine(WaitDown());       
	}

	IEnumerator waitSpawner()
	{
		yield return new WaitForSeconds(startWait);
		while (!stop)
		{
			Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x),
			Random.Range(-spawnValues.y, spawnValues.y), 0);
			Instantiate(enemies, spawnPosition + transform.TransformPoint(0, 0, 0), gameObject.transform.rotation);
			yield return new WaitForSeconds(spawnWait);
        	}
	}
	// coroutine pour diminuer le temps d'attente 
	IEnumerator WaitDown()
	{
		yield return new WaitForSeconds(15f);
		spawnWait = 0.5f;
	}          
}
Apres tu as aussi la possibilité de diminuer progressivement SpawnWait, par exemple en le divisant par deux toute les 15 secondes (passera de 1.5à 0.75 à 0.375.. etc)

Code : Tout sélectionner

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

public class Spawner : MonoBehaviour
{
	public GameObject enemies;
	public Vector3 spawnValues;
	private float spawnWait;
	public float startWait;
	public bool stop;
	public bool sop;

	private void Start()
	{
		// déclare le SpawnWait avant de lancer les coroutine, c'est toujours mieux ;)
		spawnWait = 1.5f;
		StartCoroutine(waitSpawner());
		//coroutine qui va s'occuper de diminuer le SpawnWait
		StartCoroutine(WaitDown());       
	}

	IEnumerator waitSpawner()
	{
		yield return new WaitForSeconds(startWait);
		while (!stop)
		{
			Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x),
			Random.Range(-spawnValues.y, spawnValues.y), 0);
			Instantiate(enemies, spawnPosition + transform.TransformPoint(0, 0, 0), gameObject.transform.rotation);
			yield return new WaitForSeconds(spawnWait);
        	}
	}
	// coroutine pour diminuer le temps d'attente 
	IEnumerator WaitDown()
	{
		yield return new WaitForSeconds(15f);
		// tant que stop == false on diminue toute les 15 secondes en divisant par deux
		if(!stop)
		{		
			spawnWait *= 0.5f;
			yield return new WaitForSeconds(15f);
			
		}
	}          
}

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Valva
Messages : 23
Inscription : 30 Mai 2020 17:10

Re: Changer une variable dans une coroutine

Message par Valva » 03 Juin 2020 20:32

Merci bien!

Répondre

Revenir vers « Scripting »