IEnumerator WaitToDestoryAllObjects()
        {
            while (BibaSceneStack.Count > 0)
            {
                var lastMenuStateGO = BibaSceneStack.GetTopGameObjectForTopMenuState();
                var lastMenuState   = BibaSceneStack.Pop();

                if (lastMenuState is SceneMenuState)
                {
                    GameObject.Destroy(lastMenuStateGO);
                    while (lastMenuStateGO != null)
                    {
                        yield return(null);
                    }
                    SceneManager.UnloadScene(lastMenuState.SceneName);
                }
                else
                {
                    ToggleObjectMenuStateSignal.Dispatch(lastMenuState as ObjectMenuState, false);
                }
            }

            Resources.UnloadUnusedAssets();
            Release();
        }
        void RemoveLastGameView()
        {
            var lastMenuStateGO = BibaSceneStack.GetTopGameObjectForTopMenuState();
            var lastMenuState   = BibaSceneStack.Pop();

            if (lastMenuState is SceneMenuState)
            {
                Retain();
                new Task(WaitTilObjectDestroy(lastMenuState, lastMenuStateGO), true);
            }
            else
            {
                ToggleObjectMenuStateSignal.Dispatch(lastMenuState as ObjectMenuState, false);
            }
        }