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.