예제 #1
0
    /**
     * 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 ;)
                }
            }
        }
    }
예제 #2
0
    /**
     * 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
            }
        }
    }