Best way to pause the scene when opening the main menu?

Some solutions we’ve heard:

1- Set time scale to 0 and open a prefab of your menu. This solution is probably the most effective. It works. But seem like poor design, in my opinion. Things like the GUI may still receive clicks, so you must deactivate any clickable thing and you have to be careful not to render anything on top of the menu. Also, the audio source keep playing so you have to deactivate them too and remember to turn them on again when you’re back. I’ve use this method and is full of problems.

3- Disable your scene objects and enable a prefab of your menu. So your scene has 2 objects: one is all of your hierarchy, the second is the menu. In theory you’d deactivate the scene and turn on the menu. Is the method I’d love to use, as it would be the cleanest. Unforunately, coroutines will stop when you disable the scene, and you’d have to reactivate all of them. I don’t know any workaround for this.

2- Load a menu scene as additive and turn off the previous one. I dislike the idea of having an additive scene all the time loaded, but it seem like it would also loose all the coroutine info.

What solution do you use?

I always use “time scale 0” with Unity - Scripting API: Time.unscaledDeltaTime
Maybe not the best approach…
I’m waiting also for comments

I’m currently working with this approach and using a stack for the UI. So when clicking through my menus, I just deactivate the former active one and reactivate it when returning to it. Didn’t cause any problems so far.

public class UIManager : MonoBehaviour
{

    public GameObject InGameUI;

    private Stack<GameObject> stack;

    void Awake ()
    {
        stack = new Stack<GameObject> ();
        stack.Push (InGameUI);
        stack.Peek ().SetActive (true);
    }

    public void PushOntoStack (GameObject ui)
    {
        stack.Peek ().SetActive (false);
        stack.Push (ui);
        stack.Peek ().SetActive (true);
    }

    public void PopFromStack ()
    {
        stack.Pop ().SetActive (false);
        stack.Peek ().SetActive (true);
    }

}

Edit: wording & additional code