/** * Coroutine de consommation de ressources. **/ private IEnumerator Consume() { WorkPlace workPlace = GetComponent <WorkPlace>(); float lastWorkersRatio = workPlace.WorkersRatio(); while (true) { if (!_consuming) { if (RequirementsMet()) { RetrieveRequirements(); _consuming = true; } else { yield return(new WaitForSeconds(1.0f));//Il attend une seconde avant de revérifier } } else { if (Utils.FloatComparison(_consumptionCountDown, 0.0f, 0.0001f) || _consumptionCountDown < 0.0f) //Donc en somme si _consumptionCountDown est <=0, avec une petite marge d'erreur pour l'imprécision des floats { consumptionEvent.Invoke(); _consumptionCountDown = consumptionRate; _consuming = false; } else//Il n'est pas encore temps d'appliquer les effets de la consommation, on "digère" toujours ! { yield return(new WaitForSeconds(consumptionRate)); _consumptionCountDown -= lastWorkersRatio * consumptionRate;//On utilise chaque fois le ratio précédent pour éviter les changements trop soudains de rythme lastWorkersRatio = workPlace.WorkersRatio(); //Cette façon de faire permet de s'adapter relativement dynamiquement aux changements de ratio ;) } } } }
/** * Coroutine gérant l'expédition des commandes passées à l'entrepôt. **/ private IEnumerator OrdersManagementCoroutine() { WorkPlace workPlace = GetComponent <WorkPlace>(); while (true) { float workersRatio = workPlace.WorkersRatio(); if (!Utils.FloatComparison(workersRatio, 0.0f, 0.001f)) { yield return(new WaitForSeconds(0.5f / workersRatio)); orderManager.SendOrderIfPossible(); } else { yield return(new WaitForSeconds(1.0f));//On attend 1 seconde pour donner le temps aux travailleurs d'arriver et de former un ratio plus raisonnable } } }