using System.Collections.Generic; using UnityEngine; using Watermelon.SquadShooter; namespace Watermelon.Enemy.Boss { [RequireComponent(typeof(BossBomberBehaviour))] public class BossStateMachine : AbstractStateMachine { private BossBomberBehaviour enemy; private StateBehavior hidingState; private EnteringState enteringState; private IdleState idleState; private ChasingState chasingState; private KikkingState hittingState; private ShootingState shootingState; private void Awake() { enemy = GetComponent(); var distanceBasedTransitionOnFinish = new List>() { new StateTransition(TransitionToIdle, StateTransitionType.OnFinish), new StateTransition(TransitionToKicking, StateTransitionType.OnFinish), new StateTransition(TransitionToShooting, StateTransitionType.OnFinish), new StateTransition(InstantTransitionToChasing, StateTransitionType.OnFinish) }; var distanceBasedTransitionIndependent = new List>() { new StateTransition(TransitionToIdle, StateTransitionType.Independent), new StateTransition(TransitionToKicking, StateTransitionType.Independent), new StateTransition(TransitionToShooting, StateTransitionType.Independent), new StateTransition(InstantTransitionToChasing, StateTransitionType.Independent) }; var hidingCase = new StateCase(); hidingState = new StateBehavior(enemy); hidingCase.state = hidingState; hidingCase.transitions = new List>() { new StateTransition(HidingTransition, StateTransitionType.Independent) }; var enteringCase = new StateCase(); enteringState = new EnteringState(enemy); enteringCase.state = enteringState; enteringCase.transitions = distanceBasedTransitionOnFinish; var idleCase = new StateCase(); idleState = new IdleState(enemy); idleCase.state = idleState; idleCase.transitions = distanceBasedTransitionIndependent; var chasingCase = new StateCase(); chasingState = new ChasingState(enemy); chasingCase.state = chasingState; chasingCase.transitions = distanceBasedTransitionIndependent; var hittingCase = new StateCase(); hittingState = new KikkingState(enemy); hittingCase.state = hittingState; hittingCase.transitions = distanceBasedTransitionOnFinish; var shootingCase = new StateCase(); shootingState = new ShootingState(enemy); shootingCase.state = shootingState; shootingCase.transitions = distanceBasedTransitionOnFinish; states.Add(State.Hidden, hidingCase); states.Add(State.Entering, enteringCase); states.Add(State.Idle, idleCase); states.Add(State.Chasing, chasingCase); states.Add(State.Hitting, hittingCase); states.Add(State.Shooting, shootingCase); } private bool HidingTransition(out State nextState) { nextState = State.Entering; var isInRange = Vector3.Distance(transform.position, CharacterBehaviour.GetBehaviour().transform.position) < 8f; if (isInRange) { enemy.Enter(); } return isInRange; } private bool TransitionToIdle(out State state) { state = State.Idle; var distance = Vector3.Distance(transform.position, CharacterBehaviour.GetBehaviour().transform.position); return distance > enemy.VisionRange; } private bool TransitionToKicking(out State state) { state = State.Hitting; var distance = Vector3.Distance(transform.position, CharacterBehaviour.GetBehaviour().transform.position); return distance < enemy.KickDistance; } private bool TransitionToShooting(out State state) { state = State.Shooting; var distance = Vector3.Distance(transform.position, CharacterBehaviour.GetBehaviour().transform.position); return distance > enemy.AttackDistanceMin && distance <= enemy.AttackDistanceMax; } private bool InstantTransitionToChasing(out State state) { state = State.Chasing; return true; } } }