public void SetState(GameStateType type) { var previousState = _activeState; _nextState = _gameStates[type]; if (_nextState == previousState || _nextState == null) { return; } if (previousState != null && previousState.Status != GameStateStatus.Inactive) { previousState.Deactivate(_nextState); var previousWebView = previousState as IHasWebGameState; previousWebView?.RawGameWebView.Unregister(); } var nextWebGameState = _nextState as IHasWebGameState; _nextWebView = nextWebGameState?.RawGameWebView; // If they are not (de)activating, tell states to (de)activate if (_nextState.Status != GameStateStatus.Active) { _nextState.Activate(previousState); _nextWebView?.Register(); _pendingStateChange = true; } if (_nextState.Status == GameStateStatus.Active && (previousState == null || previousState.Status == GameStateStatus.Inactive)) { _activeState = _nextState; _cameraService.SetActiveState(_activeState); _nextState = null; _pendingStateChange = false; // Propagate state change to UI _globalGameWebLayer?.SetUIStateManagerContainer(_activeState.GetStateManagerContainer()); } }