Mystic_Quest
Mystic_Quest

Reputation: 170

Delay within an if in C#

How can I create a delay after the fade in, so that the text stays on screen for a few seconds? I used an IEnumerator and a coroutine, but it does nothing. I also tried placing it right after the first else.

What happens at the moment is the text fades out before having the chance to fade in. The text appears momentarily in semi-clear and disappears. It's for a Unity project.

Also, Thread.Sleep won't do.

Here's the piece of code in question:

IEnumerator Pause ()
{
    yield return new WaitForSecondsRealtime(5);
}

void OnTriggerStay2D(Collider2D interCollider)
{
    if (Input.GetKeyDown(KeyCode.E))
    {
        displayInfo = true;
    }
    else
    {
        displayInfo = false;
    }
}

void FadeText()
{
    if (displayInfo == true)
    {
        text1.text = string1;
        text1.color = Color.Lerp(text1.color, Color.white, fadeTime * Time.deltaTime);
    }
    else
    {
        StartCoroutine(Pause());
        text1.color = Color.Lerp(text1.color, Color.clear, fadeTime * Time.deltaTime);
    }
}

Upvotes: 0

Views: 1062

Answers (3)

Andrew_STOP_RU_WAR_IN_UA
Andrew_STOP_RU_WAR_IN_UA

Reputation: 11416

Most easy way is to use LeanTween asset. It's free and have a lot of other usefull features that I use in EVERY project.

It's really awesome lib.

LeanTween.DelayedCall(1f,()=>{ /*any code that will be called after 1 second will pass*/ });

or

LeanTween.DelayedCall(1f, SomeMethodWithoutParams());

Upvotes: 0

Anthony Michelizzi
Anthony Michelizzi

Reputation: 135

You just need to add the text fade to the coroutine.

IEnumerator Pause()
{
    yield return new WaitForSecondsRealtime(5);
    text1.color = Color.Lerp(text1.color, Color.clear, fadeTime * Time.deltaTime);
}

And just start the coroutine in your else statement. This way it will execute the wait for seconds, and then the fade whenever you call it.

Upvotes: 0

Danny Buonocore
Danny Buonocore

Reputation: 3777

Your code should read:

void Update()
{
    if (fadingOut)
    {
        // fade out with lerp here
    }
}

IEnumerator Pause()
{
    yield return new WaitForSecondsRealtime(5);
    fadingOut = true;
}

void FadeText()
{
    if (displayInfo == true)
    {
        text1.text = string1;
        text1.color = Color.Lerp(text1.color, Color.white, fadeTime * Time.deltaTime);
    }
    else
    {
        StartCoroutine(Pause());
    }
}

You have the right idea of using a coroutine, but didn't quite get the execution right. When you invoke a method on coroutine, it will be executed in parallel with the main thread. In your code, the Pause() method is running alongside the Color.Lerp. If you want the fading to wait until after the pause is complete, they must be on the same coroutine.

Edit: As pointed out, this won't work if you're calling FadeText() on each frame. But this shows you how you can easily set a flag and wait until the pause time is complete before fading.

Upvotes: 2

Related Questions