// Displays the screen corresponding to the screen with the provided index.
    public void DisplayScreen(ScreenAreas screenArea)
    {
        // Ensure we're not switching to the same area if we're selecting a level, then the enums associated
        //	with the button are from GameStateManager not ScreenManager.
        if(!screenArea.Equals(currentScreenArea) && !screenArea.Equals(ScreenAreas.None)){
            switch(screenArea){
                case ScreenAreas.RestartLevel:
                    gameStateManagerRef.EnterGameState(Application.loadedLevel);
                    break;

                // Switch to the main menu.
                case ScreenAreas.MainMenu:
                    gameStateManagerRef.EnsureScriptAdded("MainMenu");
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent<MainMenu>();
                    currentScreenArea = ScreenAreas.MainMenu;

                    if(gameStateManagerRef.isPaused){
                        gameStateManagerRef.EnterMainMenu();
                    }

                    break;

                // Switch to the options screen.
                case ScreenAreas.Options:
                    gameStateManagerRef.EnsureScriptAdded("Options");
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent<Options>();
                    currentScreenArea = ScreenAreas.Options;
                    break;
                case ScreenAreas.OptionsInGame:
                    gameStateManagerRef.EnsureScriptAdded("OptionsInGame");
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent<OptionsInGame>();
                    currentScreenArea = ScreenAreas.OptionsInGame;
                    break;

                // Switch to the level select screen.
                case ScreenAreas.LevelSelect:
                    gameStateManagerRef.EnsureScriptAdded("LevelSelect");
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent<LevelSelect>();
                    currentScreenArea = ScreenAreas.LevelSelect;
                    break;
                // Switch to the second page of the level select screen.
                case ScreenAreas.LevelSelectB:
                    gameStateManagerRef.EnsureScriptAdded("LevelSelectB");
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent<LevelSelectB>();
                    currentScreenArea = ScreenAreas.LevelSelectB;
                    break;
                // Switch to the third page of the level select screen.
                case ScreenAreas.LevelSelectC:
                    gameStateManagerRef.EnsureScriptAdded("LevelSelectC");
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent<LevelSelectC>();
                    currentScreenArea = ScreenAreas.LevelSelectC;
                    break;

                // Switch to the pause screen.
                case ScreenAreas.Pause:
                    gameStateManagerRef.EnsureScriptAdded("Pause");
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent<Pause>();
                    currentScreenArea = ScreenAreas.Pause;
                    break;

                // Switch back to the previous in-game screen.
                case ScreenAreas.ContinueGame:
                    activeScreen.enabled = false;
                    currentScreenArea = ScreenAreas.InGame;
                    gameStateManagerRef.ContinueGame();
                    break;

                // Switch to the main menu.
                case ScreenAreas.LevelComplete:
                    Time.timeScale = 0;
                    activeScreen.enabled = false;
                    gameStateManagerRef.EnsureScriptAdded("LevelComplete");
                    activeScreen = gameObject.GetComponent <LevelComplete>();
                    currentScreenArea = ScreenAreas.LevelComplete;
                    break;

                // Exit this game. That's terrible.
                case ScreenAreas.Quit:
                    Application.Quit();
                    break;

                // We shouldn't get to this one. EVER.
                default:
                    break;
            }

            // Ensure active screen script is enabled since we re-use scripts and make sure this we're not
            //	just continuing after a pause.
            if(!activeScreen.enabled &&
                    !screenArea.Equals(ScreenAreas.ContinueGame) &&
                    !screenArea.Equals(ScreenAreas.RestartLevel) &&
                    !screenArea.Equals(ScreenAreas.LevelComplete)){
                activeScreen.enabled = true;
                activeScreen.Start();
            }
        }
    }
    // Use this for initialization.
    public void Start()
    {
        // Ensures all necessary scripts are added for the MainObject
        gameStateManagerRef = gameObject.GetComponent<GameStateManager>();
        gameStateManagerRef.EnsureCoreScriptsAdded();
        gameStateManagerRef.EnsureScriptAdded("MainMenu");

        if(gameStateManagerRef.gameStartedFromUI){
            activeScreen = gameObject.GetComponent("MainMenu") as MainMenu;
            currentScreenArea = ScreenAreas.MainMenu;
        }
        else{
            // This will not be the active screen, but active screen needs to be initialized.
            activeScreen = gameObject.GetComponent("MainMenu") as MainMenu;
            activeScreen.enabled = false;
            currentScreenArea = ScreenAreas.InGame;
        }

        screenOrientation = ScreenOrientation.Landscape;
        deviceOrientation = DeviceOrientation.LandscapeLeft;

        if(Application.platform.Equals(RuntimePlatform.Android)){
            #if UNITY_ANDROID
            using(AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"),
                    metricsClass = new AndroidJavaClass("android.util.DisplayMetrics")){
                using(AndroidJavaObject metricsInstance = new AndroidJavaObject("android.util.DisplayMetrics"),
                        activityInstance = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity"),
                        windowManagerInstance = activityInstance.Call<AndroidJavaObject>("getWindowManager"),
                        displayInstance = windowManagerInstance.Call<AndroidJavaObject>("getDefaultDisplay")){
                    displayInstance.Call("getMetrics", metricsInstance);
                    screenResolution.y = metricsInstance.Get<int>("heightPixels");
                    screenResolution.x = metricsInstance.Get<int>("widthPixels");
                    screenSize.x = Screen.width;
                    screenSize.y = Screen.height;
                    Screen.SetResolution((int)screenResolution.x, (int)screenResolution.y, true);
                    deviceOrientation = Input.deviceOrientation;
                }
            }
            #endif
        }
        else{
            // Overall screen resolution must be set initially to screen size for UI, then set to screen resolution while in game.
            screenSize = new Vector2(Screen.width, Screen.height);
            screenResolution = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);

            if(gameStateManagerRef.inUI){
                Screen.SetResolution((int)screenSize.x, (int)screenSize.y, gameStateManagerRef.fullScreen);
            }

            // Developer started in a level.
            else{
                Screen.SetResolution((int)screenResolution.x, (int)screenResolution.y, gameStateManagerRef.fullScreen);
            }
        }
    }
    /// <summary>
    /// Displays the screen corresponding to the screen with the provided
    /// index
    /// </summary>
    /// <param name='screen'>
    /// Screen represents the number index corresponding to which screen out
    /// of all game screens needs to be currently displayed.
    /// JOE, Any new screens to be made in the future should be added to the switch
    /// statement below
    /// </param>
    public void DisplayScreen(ScreenAreas screenArea)
    {
        // ensure we're not switching to the same area
        // if we're selecting a level, then the enums associated
        // with the button are from GameStateManager not ScreenManager
        if (!screenArea.Equals(currentScreenArea) && !screenArea.Equals(ScreenAreas.None))
        {
            switch(screenArea)
            {
                case ScreenAreas.MainMenu:
                    if (gameObject.GetComponent("MainMenu") == null)
                        gameObject.AddComponent<MainMenu>();
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent("MainMenu") as MainMenu;
                    currentScreenArea = ScreenAreas.MainMenu;

                    if (GameStateManager.gameStateManagerRef.isPaused)
                    {
                        GameStateManager.gameStateManagerRef.EnterMainMenu();
                    }

                    break;

                case ScreenAreas.Options:
                    if (gameObject.GetComponent("Options") == null)
                        gameObject.AddComponent<Options>();
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent("Options") as Options;
                    currentScreenArea = ScreenAreas.Options;
                    break;

                case ScreenAreas.LevelSelect:
                    gameObject.AddComponent<LevelSelect>();
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent("LevelSelect") as LevelSelect;
                    currentScreenArea = ScreenAreas.LevelSelect;
                    break;

                case ScreenAreas.Pause:
                    if (gameObject.GetComponent("Pause") == null)
                        gameObject.AddComponent<Pause>();
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent("Pause") as Pause;
                    currentScreenArea = ScreenAreas.Pause;
                    break;

                case ScreenAreas.ContinueGame:
                    activeScreen.enabled = false;
                    currentScreenArea = ScreenAreas.InGame;
                    GameStateManager.gameStateManagerRef.ContinueGame();
                    break;

                case ScreenAreas.Quit:
                    Application.Quit();
                    break;

                default:
                    break;

            }

            // ensure active screen script
            // is enabled since we re-use
            // scripts and make sure this
            // we're not just continuing after
            // a pause
            if (!activeScreen.enabled && !screenArea.Equals(ScreenAreas.ContinueGame))
            {
                activeScreen.enabled = true;
            }
        }
    }
 /// <summary>
 /// Use this for initialization
 /// </summary>
 public void Start()
 {
     // start screen is always the first screen to
     // be displayed so might as well load it here without any
     // fancy footwork
     if (currentScreenArea.Equals(ScreenAreas.None))
     {
         gameObject.AddComponent<MainMenu>();
         activeScreen = gameObject.GetComponent("MainMenu") as MainMenu;
         currentScreenArea = ScreenAreas.MainMenu;
     }
 }
    /// <summary>
    /// Displays the screen corresponding to the screen with the provided index
    /// </summary>
    /// <param name='screen'>
    /// Screen represents the number index corresponding to which screen out f all game screens needs to be currently displayed.
    /// JOE, Any new screens to be made in the future should be added to the switch statement below
    /// </param>
    public void DisplayScreen(ScreenAreas screenArea)
    {
        // Ensure we're not switching to the same area if we're selecting a level, then the enums associated
        //	with the button are from GameStateManager not ScreenManager.
        if(!screenArea.Equals(currentScreenArea) && !screenArea.Equals(ScreenAreas.None)){
            switch(screenArea){
                // Test?
                case ScreenAreas.Test:
                    GameStateManager.statManagerRef.SaveGame(1, 343);
                    break;

                // Switch to the main menu.
                case ScreenAreas.MainMenu:
                    if(gameObject.GetComponent("MainMenu") == null){
                        gameObject.AddComponent<MainMenu>();
                    }
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent("MainMenu") as MainMenu;
                    currentScreenArea = ScreenAreas.MainMenu;

                    if(gameStateManagerRef.isPaused){
                        gameStateManagerRef.EnterMainMenu();
                    }

                    break;

                // Switch to the options screen.
                case ScreenAreas.Options:
                    if(gameObject.GetComponent("Options") == null){
                        gameObject.AddComponent<Options>();
                    }
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent("Options") as Options;
                    currentScreenArea = ScreenAreas.Options;
                    break;

                // Switch to the level select screen.
                case ScreenAreas.LevelSelect:
                    if(gameObject.GetComponent("LevelSelect") == null){
                        gameObject.AddComponent<LevelSelect>();
                    }
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent("LevelSelect") as LevelSelect;
                    currentScreenArea = ScreenAreas.LevelSelect;
                    break;

                // Switch to the pause screen.
                case ScreenAreas.Pause:
                    if(gameObject.GetComponent("Pause") == null){
                        gameObject.AddComponent<Pause>();
                    }
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent("Pause") as Pause;
                    currentScreenArea = ScreenAreas.Pause;
                    break;

                // Switch back to the previous in-game screen.
                case ScreenAreas.ContinueGame:
                    activeScreen.enabled = false;
                    currentScreenArea = ScreenAreas.InGame;
                    gameStateManagerRef.ContinueGame();
                    break;

                // Switch to the main menu.
                case ScreenAreas.BeatLevel:
                    if(gameObject.GetComponent("LevelComplete") == null){
                        gameObject.AddComponent<LevelComplete>();
                    }
                    activeScreen.enabled = false;
                    activeScreen = gameObject.GetComponent("LevelComplete") as LevelComplete;
                    currentScreenArea = ScreenAreas.BeatLevel;
                    break;

                // Exit this game. That's terrible.
                case ScreenAreas.Quit:
                    Application.Quit();
                    break;

                // We shouldn't get to this one. EVER.
                default:
                    break;
            }

            // Ensure active screen script is enabled since we re-use scripts and make sure this we're not
            //	just continuing after a pause.
            if(!activeScreen.enabled && !screenArea.Equals(ScreenAreas.ContinueGame)){
                activeScreen.enabled = true;
            }
        }
    }
    /// <summary>
    /// Use this for initialization
    /// </summary>
    public void Start()
    {
        // Initialize the reference to the GameStateManager so that is actually points to it.
        gameStateManagerRef = gameObject.GetComponent<GameStateManager>();
        // start screen is always the first screen to be displayed so might as well load it here without any fancy footwork
        if (currentScreenArea.Equals(ScreenAreas.None))
        {
            gameObject.AddComponent<MainMenu>();
            activeScreen = gameObject.GetComponent("MainMenu") as MainMenu;
            currentScreenArea = ScreenAreas.MainMenu;
            screenOrientation = ScreenOrientation.Landscape;
            deviceOrientation = DeviceOrientation.LandscapeLeft;

            if (Application.platform.Equals(RuntimePlatform.Android))
            {
                using (AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"),
                      metricsClass = new AndroidJavaClass("android.util.DisplayMetrics"))
                {
                    using (AndroidJavaObject metricsInstance = new AndroidJavaObject("android.util.DisplayMetrics"),
                            activityInstance = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity"),
                            windowManagerInstance = activityInstance.Call<AndroidJavaObject>("getWindowManager"),
                            displayInstance = windowManagerInstance.Call<AndroidJavaObject>("getDefaultDisplay"))
                    {
                        displayInstance.Call("getMetrics", metricsInstance);
                        screenResolution.y = metricsInstance.Get<int>("heightPixels");
                        screenResolution.x = metricsInstance.Get<int>("widthPixels");
                        screenSize.x = Screen.width;
                        screenSize.y = Screen.height;
                        Screen.SetResolution((int)screenResolution.x, (int)screenResolution.y, true);
                        deviceOrientation = Input.deviceOrientation;
                    }
                }
            }

            else
            {
                // Overall screen resolution must be set initially to screen size for UI,
                // then set to screen resolution while in game
                screenSize = new Vector2(Screen.width, Screen.height);
                screenResolution = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);
                Screen.SetResolution((int)screenSize.x, (int)screenSize.y, gameStateManagerRef.fullScreen);
            }
        }
    }