protected bool TryFinishChangeState(State target, params object[] args) { switch (target) { case State.Menu: _state = target; return(true); case State.CharacterSelection: OnCharacterSelectHandler?.Invoke(true); _state = target; return(true); case State.Begin: _podium.Clear(); foreach (var c in _controllers) { if (c == null) { continue; } _podium.Add(c, c._characterResource); } _podium.gameObject.SetActive(false); OnLevelSelectHandler.Invoke(false); foreach (World.Level level in _levels) { if (level == null) { continue; } if (level == _selectedLevel) { continue; } level.gameObject.SetActive(false); } _selectedLevel.gameObject.SetActive(false); _state = target; return(TryChangeState(State.Round, _roundTime)); case State.Transition: _transition = (State)args[0]; _transitionTimer.Start(); _transitionEffect.Perform(); _state = target; return(true); case State.Podium: _podium.gameObject.SetActive(true); OnPodiumHandler?.Invoke(); _state = target; return(true); case State.FinalPodium: _podium.gameObject.SetActive(true); OnFinalPodiumHandler?.Invoke(); _state = target; return(true); case State.LevelSelection: _state = target; foreach (World.Level lv in _levels) { lv.gameObject.SetActive(true); lv.OnLevelSelect(); } OnLevelSelect(); OnLevelSelected(0); return(true); case State.Round: // TODO enable _selectedLevel.TargetPosition = Vector3.zero; _selectedLevel.transform.position = Vector3.zero; _selectedLevel.gameObject.SetActive(true); _currentLevel = Instantiate( _selectedLevel.gameObject, Vector3.zero, Quaternion.identity, gameObject.transform).GetComponent <World.Level>(); _selectedLevel.gameObject.SetActive(false); _currentLevel.OnScoreValueAddedHandler += OnScoreValueAdded; _currentLevel.OnLevelCompletedHandler += OnLevelCompleted; List <Placeholder> placeholders = new List <Placeholder>(); placeholders.AddRange(_currentLevel._characterPlaceholders); int i = 0; while (!placeholders.IsEmpty()) { Placeholder placeholder = placeholders.RemoveRandom(); _controllers[i]._character = _controllers[i] ._characterResource.Create( _currentLevel.GridToWorld(placeholder._gridPosition), _currentLevel.transform); _controllers[i]._character.Number = _controllers[i].Number; _controllers[i]._character.Color = _controllers[i].Color; _controllers[i]._character._level = _currentLevel; _controllers[i]._character.TryChangeState(Character.State.Disabled); _controllers[i].Score = 0; _controllers[i]._assignedNumber = placeholder.Number; i++; Destroy(placeholder.gameObject); } _round = new Round( _countDown, _roundTime, _countDownTime, _intermissionTime, _roundIndex); StartCoroutine(NewRoundCoroutine()); _state = target; return(true); case State.Score: _state = target; return(true); case State.WaitingNextRound: //Lobby.Characters.Clear(); //Lobby.Characters.AddRange(_selectedLevel.Characters); foreach (Controller ctrl in Lobby.Controllers) { if (ctrl == null) { continue; } //ctrl.Character = null; } _state = target; OnWaiting(); return(true); default: return(false); } }