private void DefineStateMachine() { stateMachine = new StateMachine(); //Define states startGame = new StartGameState(startScreen, startFartButton); var fart = new FartState(fartParticleSystem, farterAnimator, poopChance); var lidOn = new LidOnState(jar, lid); var lidClosed = new LidClosedState(); var poop = new PoopState(poopScreen); //Define transitions At(fart, startGame, FartStarted()); At(lidOn, fart, LidIsOn()); At(lidClosed, lidOn, LidClosed()); At(poop, fart, Pooped()); void At(IState to, IState from, Func <bool> condition) => stateMachine.AddTransition(@from, to, condition); //Define predicates as Func<bool> Func <bool> FartStarted() => () => startFartButton.fartPressed && Time.timeScale != 0; Func <bool> LidIsOn() => () => jar.GetComponentInChildren <LidTrigger>().lidOn; Func <bool> LidClosed() => () => lid.GetComponent <LidTwist>().jarClosed; Func <bool> Pooped() => () => pooped; }
IEnumerator Poop() { poopState = PoopState.Cooldown; GameObject poop = Instantiate(poopPrefab, TournamentManager.Instance.playersParent.transform); poop.transform.position = new Vector3(transform.position.x, 0f, transform.position.z); yield return(new WaitForSeconds(poopCooldown)); poopState = PoopState.CanPoop; }