IEnumerator GoToScreenCallback(MenuScreen newScr, IEnumerator callback)
    {
        IsChangingScreens = true;

        //Ready the next screen
        Debug.Log( "Ending current screen" );

        OnPreScreenChange.Invoke( );
        yield return StartCoroutine( callback );

        //Then fade out the current screen
        if ( CurrentScreenObject != null )
        {
            CurrentScreenObject.gameObject.SetActive( false );
        }

        Debug.Log( "Lerping" );

        //Lerp to new position
        if ( CameraPositions.ContainsKey(newScr.ToString( ) ) )
        {
            while ( Vector3.Distance( Camera.main.transform.position, CameraPositions[ newScr.ToString( ) ] ) > 0.1f )
            {
                Camera.main.transform.position =
                    Vector3.Slerp( Camera.main.transform.position, CameraPositions[ newScr.ToString( ) ], CameraTweenSpeed );

                yield return null;
            }
        }

        Debug.Log( "Opening new screen" );

        if ( newScr != MenuScreen.NONE )
        {
            //Open new screen and record it as the current object
            foreach ( Transform scrObj in ScreenObjects )
            {
                var bSetActive = scrObj.name.Contains( newScr.ToString( ) );

                //print( scrObj.name + ": " + newScr.ToString( ) );

                if ( bSetActive )
                {
                    scrObj.gameObject.SetActive( true );
                    CurrentScreenObject = scrObj;
                    OnScreenChanged.Invoke( );
                }
                else
                    scrObj.gameObject.SetActive( false );
            }
        }

        //Assign the current screen
        CurrentScreen = newScr;

        IsChangingScreens = false;

        yield return null;
    }