using System.Collections.Generic; using UnityEngine; using Watermelon.SquadShooter; namespace Watermelon.Enemy.Melee { [RequireComponent(typeof(MeleeEnemyBehaviour))] public class MeleeStateMachine : AbstractStateMachine { private MeleeEnemyBehaviour enemy; private void Awake() { enemy = GetComponent(); var patrollingStateCase = new StateCase(); patrollingStateCase.state = new PatrollingState(enemy); patrollingStateCase.transitions = new List> { new StateTransition(PatrollingStateTransition) }; var followingAttackingStateCase = new StateCase(); followingAttackingStateCase.state = new MeleeFollowAttackState(enemy); followingAttackingStateCase.transitions = new List> { new StateTransition((out State nextState) =>{ nextState = State.Attacking; return false; }) }; states.Add(State.Patrolling, patrollingStateCase); states.Add(State.Attacking, followingAttackingStateCase); } private bool PatrollingStateTransition(out State nextState) { bool isTargetSpotted = enemy.IsTargetInVisionRange || enemy.HasTakenDamage; if (!isTargetSpotted) { nextState = State.Patrolling; return false; } nextState = State.Attacking; return true; } } }