void Update()
    {
        bool menuIsActive  = false;
        bool menuIsClosing = false;

        foreach (GameObject menu in _menus)
        {
            MenuBehavior menuBehavior = menu.GetComponent(typeof(MenuBehavior)) as MenuBehavior;
            if (menuBehavior.currentState == MenuBehavior.MenuState.ACTIVE || menuBehavior.currentState == MenuBehavior.MenuState.ACTIVATING)
            {
                menuIsActive = true;
                _activeMenu  = menu;
            }
            else if (menuBehavior.currentState == MenuBehavior.MenuState.DEACTIVATION || menuBehavior.currentState == MenuBehavior.MenuState.SELECTION)
            {
                menuIsClosing = true;
            }
        }

        switch (_currentState)
        {
        case MoverState.FADING_IN:
            _fadePushPercent = Mathf.Clamp((Time.time - _fadeStartTime) / (_fadeInTime * _fadeStartPercent), 0.0f, 1.0f);

            foreach (GameObject menuRoot in _menuRoots)
            {
                GameObject   menu             = null;
                MenuBehavior menuRootBehavior = null;
                foreach (Transform child in menuRoot.transform)
                {
                    if (child.name == "Menu")
                    {
                        menu             = child.gameObject;
                        menuRootBehavior = menu.GetComponent(typeof(MenuBehavior)) as MenuBehavior;
                    }
                }

                if (menu != _activeMenu)
                {
                    Vector3 awayVector = new Vector3(menuRoot.transform.position.x - _activeMenu.transform.position.x,
                                                     menuRoot.transform.position.y - _activeMenu.transform.position.y,
                                                     0).normalized *_fadeCurve.Evaluate(1 - _fadePushPercent) * _fadeThrowDistance;

                    if (menuRootBehavior != null)
                    {
                        menuRoot.transform.position = menuRootBehavior.baseLocation + awayVector;
                        menuRootBehavior.setOpacity(_fadePushPercent);
                    }
                }
            }

            if (Time.time > _fadeStartTime + (_fadeInTime * _fadeStartPercent))
            {
                _currentState = MoverState.PASSIVE;

                foreach (GameObject menu in _menus)
                {
                    if (menu != _activeMenu)
                    {
                        MenuBehavior menuBehavior = menu.GetComponent(typeof(MenuBehavior)) as MenuBehavior;
                        menuBehavior.currentState = MenuBehavior.MenuState.INACTIVE;
                    }
                }
                return;
            }

            break;

        case MoverState.FADING_OUT:
            _fadePushPercent = Mathf.Clamp((Time.time - _fadeStartTime) / _fadeOutTime, 0.0f, 1.0f);

            if (!menuIsActive)
            {
                _fadeStartTime    = Time.time;
                _fadeStartPercent = _fadePushPercent;
                _currentState     = MoverState.FADING_IN;
                return;
            }

            foreach (GameObject menuRoot in _menuRoots)
            {
                GameObject   menu             = null;
                MenuBehavior menuRootBehavior = null;
                foreach (Transform child in menuRoot.transform)
                {
                    if (child.name == "Menu")
                    {
                        menu             = child.gameObject;
                        menuRootBehavior = menu.GetComponent(typeof(MenuBehavior)) as MenuBehavior;
                    }
                }

                if (menu != _activeMenu)
                {
                    Vector3 awayVector = new Vector3(menuRoot.transform.position.x - _activeMenu.transform.position.x,
                                                     menuRoot.transform.position.y - _activeMenu.transform.position.y,
                                                     0).normalized *_fadeCurve.Evaluate(_fadePushPercent) * _fadeThrowDistance;

                    if (menuRootBehavior != null)
                    {
                        menuRoot.transform.position = menuRootBehavior.baseLocation + awayVector;
                        menuRootBehavior.setOpacity(1.0f - _fadePushPercent);
                    }
                }
            }
            break;

        case MoverState.PASSIVE:
            if (menuIsActive && !menuIsClosing)
            {
                _fadeStartTime = Time.time;
                _currentState  = MoverState.FADING_OUT;

                foreach (GameObject menu in _menus)
                {
                    if (menu != _activeMenu)
                    {
                        MenuBehavior menuBehavior = menu.GetComponent(typeof(MenuBehavior)) as MenuBehavior;
                        menuBehavior.currentState = MenuBehavior.MenuState.DISABLED;
                    }
                }

                return;
            }

            if (_handSweepEnabled)
            {
                _throwLocation = Mathf.Clamp(_throwLocation + (ScaleManager._scaleRate * _throwSpeed * Time.deltaTime), 0, 1.0f);

                foreach (GameObject menuRoot in _menuRoots)
                {
                    MenuBehavior menuRootBehavior = null;
                    foreach (Transform child in menuRoot.transform)
                    {
                        if (child.name == "Menu")
                        {
                            menuRootBehavior = child.gameObject.GetComponent(typeof(MenuBehavior)) as MenuBehavior;
                        }
                    }

                    Vector3 awayVector = new Vector3(menuRoot.transform.position.x - gameObject.transform.position.x,
                                                     menuRoot.transform.position.y - gameObject.transform.position.y,
                                                     0).normalized *_throwFilter.Evaluate(_throwLocation) * _fullThrowDistance;


                    if (menuRootBehavior != null)
                    {
                        menuRoot.transform.position = menuRootBehavior.baseLocation + awayVector;
                    }
                }
            }
            break;
        }
    }