Quick answer: The “Hold on” dialog names the step Unity is blocked on: entering Play mode, reloading script assemblies, compiling or importing. A timer that keeps climbing usually means an infinite loop in your code (in Awake, OnEnable, OnValidate or an editor script). Slow but finite waits are domain reload and import cost: use Enter Play Mode settings, assembly definitions and antivirus exclusions.
Every Unity developer has stared at the “Hold on” progress bar. Sometimes it is the editor doing honest work, sometimes it is your code stuck in a loop that will never end. The text in the dialog and the editor log tell you which.
Step 1: read what it is busy with
The dialog title or detail line names the operation, for example Application.EnterPlayMode, Reload Script Assemblies, Compiling Scripts, Importing Assets or Domain Unloading. Then open the editor log and look at the last lines written:
- Windows:
%LOCALAPPDATA%\Unity\Editor\Editor.log - macOS:
~/Library/Logs/Unity/Editor.log - Linux:
~/.config/unity3d/Editor.log
Busy forever: your code is in a loop
If the timer passes a few minutes during EnterPlayMode or after a script change, assume an infinite loop or a deadlock in code that runs at that moment:
Awake,OnEnableandStartof objects in the opening scene.whileloops waiting on something that only changes in a later frame (Unity is single-threaded; the frame never ends).OnValidateand[InitializeOnLoad]editor code, which run on reload.- A
Task.Resultor.Wait()on the main thread waiting for work that needs the main thread.
To find it, attach your IDE debugger (Rider or Visual Studio) to the Unity editor process and press Pause. The main thread's call stack shows the exact line. Killing the editor loses unsaved scene changes, so attaching is worth the minute it takes.
Busy for a while: domain reload is slow
Entering Play mode reloads the scripting domain by default, which reinitializes every static and reruns every [InitializeOnLoad]. In large projects that takes many seconds every time.
- Project Settings > Editor > Enter Play Mode Settings: choose to not reload the domain (and optionally the scene). Play mode starts almost instantly, but static fields keep their values between runs, so reset them in a
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]method. - Assembly definitions: split your code into asmdefs so a change recompiles one assembly, not everything.
- Audit
[InitializeOnLoad]classes from assets you imported; some do heavy work on every reload.
Busy importing assets
- Antivirus scanning the project's
Libraryfolder slows imports dramatically. Exclude the project folder (and the Unity editor folder) from real-time scanning. - Turn on Parallel Import in Project Settings > Editor > Asset Pipeline where available.
- Huge textures and models re-import when import settings or platforms change. Switching build platform with many assets triggers a long re-import; a cache server or Unity Accelerator helps teams.
- If one asset hangs the import, the log's last line usually names it. Move it out of
Assetsand reimport to confirm.
Busy compiling Burst or shaders
With Jobs > Burst > Synchronous Compilation enabled, entering Play mode waits for Burst to compile every job. Leave it off during iteration. Large shader graphs compile variants on first use; the log shows shader compilation lines while that happens.
Hangs players hit
The same code that hangs the editor in Awake hangs a player's build on a loading screen, where nobody can attach a debugger. Bugnet's Unity SDK tracks sessions per build and files exceptions with the last log lines, so a loading screen that never finishes for some players shows up as sessions that start and never progress, with the errors leading up to it.
Related problems
- How to Fix Unity Stuck on “Compiling Scripts” When Opening the Project
- How to Fix Slow Enter Play Mode / Domain Reload in Unity
- How to Fix the Unity Editor Freezing from an Infinite Loop
Frequently asked questions
Why is Unity stuck on “Hold on” when I press Play?
Usually an infinite loop in Awake, OnEnable, Start or OnValidate of something in the scene, or a slow domain reload. If the timer keeps climbing past a few minutes, attach a debugger and pause to find the loop.
How do I make entering Play mode faster in Unity?
In Project Settings, Editor, Enter Play Mode Settings, disable domain reload, then reset static fields yourself with RuntimeInitializeOnLoadMethod. Assembly definitions also reduce recompile time.
Where is the Unity Editor log?
On Windows in %LOCALAPPDATA%\Unity\Editor\Editor.log, on macOS in ~/Library/Logs/Unity/Editor.log, and on Linux in ~/.config/unity3d/Editor.log.
A timer that keeps climbing is your code, not Unity. Attach a debugger and press pause.