/// <summary> /// Changes the state of the AI State Machine. /// Intended to be PROTECTED - only the AI States should be able to call this from their encapsulated transition methods. /// Changes the internal state of the AI State Machine based on the given state type Enum. /// </summary> /// <param name="stateType">The new state type to be changed to.</param> /// <param name="optionalData">Optional data to be passed to the transitioning state.</param> public void ChangeState(StateEnum stateType, object optionalData = null) { if (currentState != null) { // Only time when the current state will be null is when state machine spawns. currentState.Exit(); currentState.enabled = false; } try { switch (stateType) { case StateEnum.Intermission: currentState = GetComponent <AIIntermissionState>(); break; case StateEnum.Race: currentState = GetComponent <AIRaceState>(); break; case StateEnum.ClientSpectate: currentState = GetComponent <AISpectateState>(); break; default: throw new InvalidOperationException("Invalid AI ChangeState attempt: " + stateType.ToString()); } SentrySdk.AddBreadcrumb($"AI State Machine change state from { StateType } to { stateType }."); StateType = stateType; } catch (InvalidOperationException e) { Debug.LogError(e); } currentState.enabled = true; currentState.Enter(optionalData); }