예제 #1
0
 // 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());
         }
     }
 }
예제 #2
0
    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);
    }
예제 #3
0
 IEnumerator FSearchState()
 {
     fleeState = FleeState.FFlee;
     yield return 0;
 }
예제 #4
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);
    }
예제 #5
0
 //constructor
 private FleeState()
 {
     instance = this;
 }