public bool SwitchState(GameState newState)
    {
        Debug.Log("SWITCH STATE " + currentState.State.ToString() + " to " + newState.ToString());
        bool switchSuccess = false;

        if (states != null && states.ContainsKey(newState))
        {
            if (currentState == null)
            {
                currentState = states [newState];
                currentState.Start();
                switchSuccess = true;
            }
            else if (currentState.AllowTransition(newState))
            {
                currentState.End();
                currentState = states [newState];
                currentState.Start();
                switchSuccess = true;
            }
            else
            {
                Debug.Log(string.Format("{0} does not allow transition to {1}", currentState.State, newState));
            }
        }

        if (switchSuccess)
        {
            // Updating state history
                        #if UNITY_EDITOR
            if (prevGameState != null)
            {
                prevGameState.Add(newState);
                if (prevGameState.Count > 20)
                {
                    prevGameState.RemoveAt(0);
                }
            }
                        #endif

            if (this.OnStatePreSwitchEvent != null)
            {
                this.OnStatePreSwitchEvent(newState);
            }
        }
        else
        {
            Debug.Log("States dictionary not ready for switching to " + newState);
        }

        return(switchSuccess);
    }
    public GameStateMachine(GameManager manager)
    {
        states = new Dictionary <GameState, GameState_Base <GameState> > ();

        GameState_Loading loading = new GameState_Loading(manager);
        GameState_InGame  inGame  = new GameState_InGame(manager);
        GameState_Exit    exit    = new GameState_Exit(manager);

        states.Add(loading.State, (GameState_Base <GameState>)loading);
        states.Add(inGame.State, (GameState_Base <GameState>)inGame);
        states.Add(exit.State, (GameState_Base <GameState>)exit);

        currentState = loading;
        currentState.Start();

        prevGameState = new List <GameState> ();
        prevGameState.Add(currentState.State);

        manager.BeginStateUpdate();
    }