Fade GUI from Coroutine?

Hi Everyone,

I’m having an issue with my Fade In and Fade Out coroutines:

private IEnumerator DoFadeIn(FadeState e)
    {
        float elapsedTime = 0.0f;
        while (elapsedTime < fadeTime)
        {
            yield return new WaitForEndOfFrame();
            elapsedTime += Time.deltaTime;
            Color newColor = GUI.color;
            newColor.a = 1.0f - Mathf.Clamp01(elapsedTime / fadeTime);
            GUI.color = newColor;

            GUI.depth = drawDepth;

            GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), fadeTexture);
        }
        FadeManager.OnFadesDone(e);
    }

    private IEnumerator DoFadeOut(FadeState e)
    {
        float elapsedTime = 0.0f;
        while (elapsedTime < fadeTime)
        {
            yield return new WaitForEndOfFrame();
            elapsedTime += Time.deltaTime;
            Color newColor = GUI.color;
            newColor.a = Mathf.Clamp01(elapsedTime / fadeTime);
            GUI.color = newColor;

            GUI.depth = drawDepth;

            GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), fadeTexture);
        }
        FadeManager.OnFadesDone(e);
    }

Before, the issue I was having was that for some reason this script required an empty OnGUI function at the end to function properly. It took a long time to figure out that this was the problem, but after realizing I only needed the empty OnGUI function everything worked fine.

Today I built my project, and some things began to make sense. Nothing was working because the integrated Fades were halting any process with the error “You can only call GUI functions from inside OnGUI”. So, what was happening was the empty OnGUI function was sufficient to trick the editor that the GUI functions were happening properly, but this trick won’t work for my build.

So, this begs the question… How can I get these coroutines to do what they need to do without calling GUI? Or, alternatively, if I do have to incorporate OnGUI into my coroutines, how would I go about doing it? (Note: These coroutines are triggered by events, and also trigger events when complete.)

I’ve decided to simply use an inverted sphere FadeObject to surround the camera. My fade routines now look like this:

private IEnumerator DoFadeIn(FadeState e)
    {
        float elapsedTime = 0.0f;
        while (elapsedTime < fadeTime)
        {
            yield return new WaitForEndOfFrame();
            elapsedTime += Time.deltaTime;
            FadeMaterial.color = new Color(1.0f, 1.0f, 1.0f, 1.0f - Mathf.Clamp01(elapsedTime / fadeTime));
        }
        FadeObject.SetActive(false);
        FadeManager.OnFadesDone(e);
    }

    private IEnumerator DoFadeOut(FadeState e)
    {
        FadeObject.SetActive(true);
        float elapsedTime = 0.0f;
        while (elapsedTime < fadeTime)
        {
            yield return new WaitForEndOfFrame();
            elapsedTime += Time.deltaTime;
            FadeMaterial.color = new Color(1.0f, 1.0f, 1.0f, Mathf.Clamp01(elapsedTime / fadeTime));
        }
        FadeManager.OnFadesDone(e);
    }