IEnumerator ProcessingTask(Product product, int amountOfProcesses) { switch (product.processingState) { case Product.ProcessingState.CUPPING: processTimeLeft = product.productData.cuppingTime * amountOfProcesses; break; case Product.ProcessingState.WRAPPING: processTimeLeft = product.productData.wrappingTime * amountOfProcesses; break; case Product.ProcessingState.PRICING: processTimeLeft = product.productData.pricingTime * amountOfProcesses; break; default: processTimeLeft = 3f; break; } processingTime = processTimeLeft; taskTimer.gameObject.SetActive(true); taskTimer.ChangePosition(product); while (processTimeLeft > 0f) { yield return(new WaitForSeconds(1f)); processTimeLeft--; taskTimer.timerSprite.fillAmount = processTimeLeft / processingTime; taskTimer.timerText.SetText(processTimeLeft.ToString()); } if (product.processingState == Product.ProcessingState.PRICING) { StopCoroutine(ProcessingTask(product, amountOfProcesses)); currentlyProcessing = false; taskTimer.gameObject.SetActive(false); Debug.Log("Finished processing product."); CalculatePrice(product); } else { product.NextState(); taskTimer.ChangePosition(product); StartCoroutine(ProcessingTask(product, amountOfProcesses)); } yield return(null); }