public virtual void ChangeState(S newState, C newController, bool checkIfSameState = true)
    {
        if (ActiveState != null)
        {
            if (ActiveState.GetType() == newState.GetType() && checkIfSameState)
            {
                return;
            }
        }

        if (newState.Controller == null)
        {
            newState.Controller = newController;
        }

        if (ActiveState != null)
        {
            ActiveState.OnStateExit();
        }

        ActiveState = newState;

        ActiveState.OnStateEnter();
    }