Quick answer: Unity coroutine using WaitForSeconds frozen while Time.timeScale = 0? Use WaitForSecondsRealtime to keep the coroutine ticking during a paused game.

Pause menu opens. A loading-toast coroutine using WaitForSeconds never completes because timescale is zero.

Use realtime variant

yield return new WaitForSecondsRealtime(2f);

Tracks unscaled time. Pause-tolerant by default.

Or yield until

yield return new WaitUntil(() => Time.realtimeSinceStartup > deadline). Slightly more flexible if you also want to interrupt on conditions.

Avoid mixing scaled and unscaled

A coroutine that uses both is order-dependent. Pick one mode per coroutine and stick to it.

“WaitForSeconds is scaled time. Realtime is what you usually want for UI.”

For shipped UI, prefer async/await with explicit cancellation tokens over coroutines. Pause semantics become a property of the token, not the yield.