// Update is called once per frame void Update() { //transform.LookAt(enemy); enemy = FindClosestEnemy(); if ( Vector3.Distance(transform.position, enemy.transform.position) >= attackDistance ) { Debug.Log("GO TOWARD ENEMY"); //Approach(enemy); if (stateMachine.currentState != AttackState.getInstance()) { stateMachine.ChangeState(ChaseState.getInstance()); } } if ( Vector3.Distance(transform.position, enemy.transform.position) <= attackDistance && Vector3.Distance(transform.position, enemy.transform.position) > runDistance ) { Debug.Log("ATTACK ENEMY"); if (stateMachine.currentState != AttackState.getInstance()) { stateMachine.ChangeState(AttackState.getInstance()); } } if (Vector3.Distance(transform.position, enemy.transform.position) <= runDistance) { Debug.Log("FLEE FROM ENEMY"); //Flee(enemy); if (stateMachine.currentState != FleeState.getInstance()) { stateMachine.ChangeState(FleeState.getInstance()); } } }
private void ConstructFSM() { pointList = GameObject.FindGameObjectsWithTag("WayPoint"); // //Creating a wapoint transform array for each state // Transform[] waypoints = new Transform[pointList.Length]; int i = 0; foreach (GameObject obj in pointList) { waypoints[i] = obj.transform; i++; } // //Create States // HideState hide = new HideState(waypoints); AttackState attack = new AttackState(waypoints); //Create the Dead state DeadState dead = new DeadState(waypoints); //there are no transitions out of the dead state PatrolState patrol = new PatrolState(waypoints); FleeState flee = new FleeState(waypoints); //add transitions OUT of the attack state attack.AddTransition(Transition.NoHealth, FSMStateID.Dead); if (AI1) { attack.AddTransition(Transition.LostPlayer, FSMStateID.Patrolling); attack.AddTransition(Transition.LowHealth, FSMStateID.Fleeing); } if (AI2) { attack.AddTransition(Transition.LostPlayer, FSMStateID.Hiding); } attack.AddTransition(Transition.LowHealth, FSMStateID.Fleeing); //add transitions OUT of the hide state hide.AddTransition(Transition.SawPlayer, FSMStateID.Attacking); hide.AddTransition(Transition.NoHealth, FSMStateID.Dead); //add transitions OUT of the patrol state patrol.AddTransition(Transition.SawPlayer, FSMStateID.Attacking); patrol.AddTransition(Transition.NoHealth, FSMStateID.Dead); //add transitions OUT of the flee state if (AI1) { flee.AddTransition(Transition.LostPlayer, FSMStateID.Patrolling); } if (AI2) { flee.AddTransition(Transition.LostPlayer, FSMStateID.Hiding); } flee.AddTransition(Transition.NoHealth, FSMStateID.Dead); //Add state to the state list if (AI1) { AddFSMState(patrol); } if (AI2) { AddFSMState(hide); } AddFSMState(attack); AddFSMState(dead); }
IEnumerator FSearchState() { fleeState = FleeState.FFlee; yield return 0; }
private void ConstructFSM() { //Get the list of points pointList = GameObject.FindGameObjectsWithTag("WandarPoint"); Transform[] waypoints = new Transform[pointList.Length]; int i = 0; foreach (GameObject obj in pointList) { waypoints[i] = obj.transform; i++; } PatrolState patrol = new PatrolState(waypoints); patrol.AddTransition(Transition.SawPlayer, FSMStateID.Chasing); patrol.AddTransition(Transition.NoHealth, FSMStateID.Dead); patrol.AddTransition(Transition.AboutToCollide, FSMStateID.Evading); patrol.AddTransition(Transition.LowHealth, FSMStateID.Fleeing); ChaseState chase = new ChaseState(waypoints); chase.AddTransition(Transition.LostPlayer, FSMStateID.Patrolling); chase.AddTransition(Transition.ReachPlayer, FSMStateID.Attacking); chase.AddTransition(Transition.NoHealth, FSMStateID.Dead); chase.AddTransition(Transition.LowHealth, FSMStateID.Fleeing); chase.AddTransition(Transition.AboutToCollide, FSMStateID.Evading); AttackState attack = new AttackState(waypoints); attack.AddTransition(Transition.LostPlayer, FSMStateID.Patrolling); attack.AddTransition(Transition.SawPlayer, FSMStateID.Chasing); attack.AddTransition(Transition.NoHealth, FSMStateID.Dead); attack.AddTransition(Transition.LowHealth, FSMStateID.Fleeing); attack.AddTransition(Transition.AboutToCollide, FSMStateID.Evading); DeadState dead = new DeadState(); dead.AddTransition(Transition.NoHealth, FSMStateID.Dead); FleeState flee = new FleeState(); flee.AddTransition(Transition.LostPlayer, FSMStateID.Patrolling); flee.AddTransition(Transition.ReachPlayer, FSMStateID.Attacking); flee.AddTransition(Transition.AboutToCollide, FSMStateID.Evading); flee.AddTransition(Transition.NoHealth, FSMStateID.Dead); EvadeState evade = new EvadeState(); evade.AddTransition(Transition.LostPlayer, FSMStateID.Patrolling); evade.AddTransition(Transition.SawPlayer, FSMStateID.Chasing); evade.AddTransition(Transition.ReachPlayer, FSMStateID.Attacking); evade.AddTransition(Transition.NoHealth, FSMStateID.Dead); evade.AddTransition(Transition.AboutToCollide, FSMStateID.Evading); evade.AddTransition(Transition.LowHealth, FSMStateID.Fleeing); AddFSMState(patrol); AddFSMState(chase); AddFSMState(attack); AddFSMState(dead); AddFSMState(flee); AddFSMState(evade); }
//constructor private FleeState() { instance = this; }