Задать вопрос
@RandomProgrammer

Реализация машины состояний?

Я делаю машину состояний для UI.
Вот код:
namespace UI
{
    public class StateMachine
    {
        public enum States
        {
            Menu,
            Pause,
            Settings,
            GraphicsSettings,
            MusicSettings,
            GameWindow,
            NewGame,
        }

        public delegate void StateHandler(States state);
        static public event StateHandler ChangeState;

        static public States currentState
        {
            get
            {
                return currentState;
            }
            set
            {
                currentState = value;  // Здесь Unity зависает.
                ChangeState?.Invoke(value);
            }
        }
    }

    [System.Serializable]

    public class StateElement
    {
        public StateMachine.States state;
        public bool isEnabled;
    }
}

Вот этот скрипт вешаю на UI элементы:
namespace UI
{
    public class UIState : MonoBehaviour
    {
        public StateElement[] states = new StateElement[System.Enum.GetValues(typeof(StateMachine.States)).Length];

        private void Awake()
        {
            StateMachine.ChangeState += (state) => ChangeState(state);
        }

        private void ChangeState(StateMachine.States state)
        {
            gameObject.SetActive(states[(int)state].isEnabled);
        }
    }
}

И в инспекторе для каждого UI элемента указываю для каждого состояния должен ли он быть включён или выключен. Но почему то при установке состояния unity зависает (без "не отвечает"). В итоге приходится просто через диспетчер задач отключать. Мб где-то зацикливание события? Но вроде как нету. В VS ошибок нет.
P.S. Сделал класс StateMachine static и теперь unity выдаёт ошибку, что операция переполняет стек.
  • Вопрос задан
  • 44 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@RandomProgrammer Автор вопроса
Оказывается установка значения в set снова вызывает set, и так рекурсивно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы