Я делаю машину состояний для 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 выдаёт ошибку, что операция переполняет стек.