void Start() { formation = GetComponent <EnemyFormationManager>(); //States FSMState idle = new FSMState(); idle.enterActions.Add(GoToCamp); idle.stayActions.Add(Watch); idle.exitActions.Add(ExitIdleState); FSMState chase = new FSMState(); chase.enterActions.Add(StartChase); chase.stayActions.Add(Chase); chase.exitActions.Add(StopChase); FSMState attack = new FSMState(); attack.enterActions.Add(StartAttack); attack.stayActions.Add(Fight); attack.exitActions.Add(StopAttack); FSMState dead = new FSMState(); dead.enterActions.Add(Dead); FSMState returnInPosition = new FSMState(); returnInPosition.enterActions.Add(ReturnToPosition); returnInPosition.stayActions.Add(Returning); returnInPosition.exitActions.Add(StopReturning); //Transitions FSMTransition t1 = new FSMTransition(ScanField); FSMTransition t2 = new FSMTransition(ScanFieldMoreNear); FSMTransition t3 = new FSMTransition(OutOfAttackRange); FSMTransition t4 = new FSMTransition(OutOfMaximumDistance); FSMTransition t5 = new FSMTransition(NoEnemiesInRange); FSMTransition t6 = new FSMTransition(NearEnemy); FSMTransition t7 = new FSMTransition(IsDead); FSMTransition t8 = new FSMTransition(InitialPosition); // Link states with transitions idle.AddTransition(t1, chase); chase.AddTransition(t2, attack); attack.AddTransition(t3, chase); chase.AddTransition(t4, returnInPosition); attack.AddTransition(t5, returnInPosition); returnInPosition.AddTransition(t6, attack); attack.AddTransition(t7, dead); returnInPosition.AddTransition(t8, idle); // Setup a FSA at initial state fsm = new FSM(idle); // Start monitoring StartCoroutine(Patrol()); }
void Start() { formation = GetComponent <EnemyFormationManager>(); //States FSMState patrol = new FSMState(); patrol.enterActions.Add(SetGoal); patrol.stayActions.Add(Walk); patrol.exitActions.Add(StopPatrol); FSMState chase = new FSMState(); chase.enterActions.Add(StartChase); chase.stayActions.Add(Chase); chase.exitActions.Add(StopChase); FSMState attack = new FSMState(); attack.enterActions.Add(StartAttack); attack.stayActions.Add(Fight); attack.exitActions.Add(StopAttack); FSMState dead = new FSMState(); dead.enterActions.Add(Dead); FSMState flee = new FSMState(); flee.enterActions.Add(StartFleeing); flee.stayActions.Add(Flee); FSMState recoverHP = new FSMState(); recoverHP.enterActions.Add(StartRecovery); recoverHP.stayActions.Add(RechargeHP); recoverHP.exitActions.Add(StopRecovery); //Transitions FSMTransition t1 = new FSMTransition(ScanField); FSMTransition t2 = new FSMTransition(ScanFieldMoreNear); FSMTransition t3 = new FSMTransition(OutOfLargeRange); FSMTransition t4 = new FSMTransition(OutOfRange); FSMTransition t5 = new FSMTransition(CompletedBattle); FSMTransition t6 = new FSMTransition(LowHp); FSMTransition t7 = new FSMTransition(IsDead); FSMTransition t8 = new FSMTransition(DeadDuringEscape); FSMTransition t9 = new FSMTransition(DistanceFromRecovery); FSMTransition t10 = new FSMTransition(CompletedRecharge); FSMTransition t11 = new FSMTransition(ChaseDuringRecharge); // Link states with transitions patrol.AddTransition(t1, chase); chase.AddTransition(t2, attack); chase.AddTransition(t3, patrol); attack.AddTransition(t4, chase); attack.AddTransition(t5, patrol); attack.AddTransition(t6, flee); attack.AddTransition(t7, dead); flee.AddTransition(t8, dead); flee.AddTransition(t9, recoverHP); recoverHP.AddTransition(t10, patrol); recoverHP.AddTransition(t11, chase); // Setup a FSA at initial state fsm = new FSM(patrol); // Start monitoring StartCoroutine(Patrol()); }