示例#1
0
    public override void UpdateState(SmartMan EnimeAI)
    {
        Vector3 direction = EnimeAI.playerTransform.position - EnimeAI.transform.position;


        //if i am not close enough to player, then i will chase. else attack



        if (Vector3.Distance(EnimeAI.playerTransform.position, EnimeAI.transform.position) < reachedPlayerDistance)
        {
            EnimeAI.CurrentState = new AttackBeh(EnimeAI.playerTransform.GetComponent <PlayerController>(), EnimeAI);
        }
        else if (EnimeAI.Alerted || (Vector3.Distance(EnimeAI.playerTransform.position, EnimeAI.transform.position) < 3f &&
                                     Vector3.Distance(EnimeAI.playerTransform.position, EnimeAI.transform.position) > reachedPlayerDistance))
        {
            EnimeAI.anim.SetBool("isRun", true);
            EnimeAI.anim.SetBool("isWalk", false);

            Seeking(EnimeAI);
            direction.y = 0;
            EnimeAI.transform.rotation = Quaternion.Slerp(EnimeAI.transform.rotation, Quaternion.LookRotation(direction), 0.1f);
        }
        else if (!EnimeAI.Alerted)
        {
            EnimeAI.CurrentState = new Patrol(EnimeAI);
        }
    }
示例#2
0
    void Move(SmartMan EnimeAI)  // Enemy Movement
    {
        //VectorMoveTowards  (Vector Current , Vector Target , Float MaxDelta
        EnimeAI.transform.position = Vector3.MoveTowards(EnimeAI.transform.position, EnimeAI.Waypoints[current].transform.position, Time.deltaTime * EnimeAI.speed);
        Vector3 reachPosition = EnimeAI.Waypoints[current].transform.position;                                                                                //Vector Positon Current Waypoint

        reachPosition.y            = EnimeAI.transform.position.y;                                                                                            //ReachPosition Uses Y position Only.
        EnimeAI.transform.rotation = Quaternion.Slerp(EnimeAI.transform.rotation, Quaternion.LookRotation(reachPosition - EnimeAI.transform.position), 0.1f); //Enemy Rotation To look at WayPoint.
    }
示例#3
0
    public void Seeking(SmartMan EnimeAI)
    {
        Vector3 DesiredVel = EnimeAI.playerTransform.transform.position - EnimeAI.transform.position;

        DesiredVel  = Vector3.Normalize(DesiredVel);
        DesiredVel *= EnimeAI.MaxSpeed;
        Vector3 seekForce = DesiredVel - EnimeAI.rb.velocity;

        EnimeAI.move(seekForce);
    }
示例#4
0
    public override void UpdateState(SmartMan EnimeAI)
    {
        base.UpdateState(EnimeAI);

        if (EnimeAI.health <= 20)
        {
            FleeB(EnimeAI);
            Debug.Log("flee");
        }
    }
示例#5
0
    public void FleeB(SmartMan EnimeAI)
    {
        Vector3 DesiredVel = EnimeAI.transform.position - EnimeAI.playerTransform.transform.position;

        DesiredVel  = Vector3.Normalize(DesiredVel);
        DesiredVel *= 20f;
        Vector3 FleeForce = DesiredVel - EnimeAI.rb.velocity;

        EnimeAI.move(FleeForce);
    }
示例#6
0
    IEnumerator Attack(PlayerController player, SmartMan EnimeAI)
    {
        while (IsAttacking)

        {
            EnimeAI.anim.SetTrigger("Attack");
            player.GetComponent <PlayerController>().ApplyDamage((int)Damage);
            yield return(new WaitForSeconds(4f));
        }
    }
示例#7
0
    public override void UpdateState(SmartMan EnimeAI) //OverRidded From BaseAI
    {
        Debug.Log("Move");
        if (Vector3.Distance(EnimeAI.transform.position, EnimeAI.Waypoints[current].transform.position) < EnimeAI.WPRadius) // Condition Between Enemy and Waypoints is greater than WayPoint Raduius.
        {
            Debug.Log("Move");
            if (endReached == false)  //Move next Wp
            {
                current++;
            }

            EnimeAI.StartCoroutine(IdleWhenWayPointReached(EnimeAI)); //IEnumrator Starts For IDLE at waypoint

            if (current >= EnimeAI.Waypoints.Length)                  // if CurrentWp is  larger equal to Waypoints go back to //EndReached to last WP
            {
                current--;
                endReached = true;
            }

            else if (endReached == true) //Condition EndReached is false so the cuurent is firstway Point else go back to Current 0
            {
                if (current == 0)
                {
                    endReached = false;
                }
                else
                {
                    current--;
                }
            }

            Debug.Log(current);
        }



        if (!isIdle)
        {
            Debug.Log("IM AI AND IM MOVING");
            Move(EnimeAI);                        // IF not Is Idle Move

            EnimeAI.anim.SetBool("isWalk", true); //Play Animation
        }



        if (Vector3.Distance(EnimeAI.playerTransform.position, EnimeAI.transform.position) < 2f || EnimeAI.Alerted == true)  //Condition To Seek Class  Position Between Player and Enemy
        {
            EnimeAI.CurrentState = new SeekChase();
        }
    }
示例#8
0
    public void Closest(SmartMan EnimeAI) // Go To Closest WayPoint After Chase
    {
        int   index   = -1;
        float TempDis = Mathf.Infinity;                                                                        //Infinity Number

        for (int i = 0; i < EnimeAI.Waypoints.Length; i++)                                                     //Forloop How ManyWaypoints Available.
        {
            float Dis = Vector3.Distance(EnimeAI.transform.position, EnimeAI.Waypoints[i].transform.position); //Vector Distance Between Enemy and Waypoint CurrentOne

            if (Dis < TempDis)                                                                                 // Distane < Temporary Dis , So find the closest Current Waypoint
            {
                TempDis = Dis;
                index   = i;
            }
        }

        current = index; //Current Waypoint is equal To Closest Index.
    }
示例#9
0
    private IEnumerator IdleWhenWayPointReached(SmartMan EnimeAI) //IEnumerator on For Idle Make the Enemy Idle on reach eachWaypoint with random Range Time.
    {
        // Random Amount of time


        float randomTime = Random.Range(3, 5); //Random Range

        Debug.Log(" STOP MOVING");



        isIdle = true;
        EnimeAI.anim.SetBool("isWalk", false);        //Idle Animation
        yield return(new WaitForSeconds(randomTime)); //Stops for Seconds

        isIdle = false;                               // Resume Move
        Debug.Log(" Resume MOVING");
    }
示例#10
0
    public override void UpdateState(SmartMan EnimeAI)
    {
        Vector3 direction = EnimeAI.playerTransform.position - EnimeAI.transform.position;

        direction.y = 0;
        EnimeAI.transform.rotation = Quaternion.Slerp(EnimeAI.transform.rotation, Quaternion.LookRotation(direction), 0.1f);

        //if the enemy is too far for attack (0.4 meter) BUT not more than 4 meter, chase the player
        if (Vector3.Distance(EnimeAI.playerTransform.position, EnimeAI.transform.position) < 2f &&
            Vector3.Distance(EnimeAI.playerTransform.position, EnimeAI.transform.position) > 0.4f)
        {
            EnimeAI.CurrentState = new SeekChase();

            IsAttacking = false;
        }

        //if the enemy is far away more than 2 meter, go back to patrol
        else if (Vector3.Distance(EnimeAI.playerTransform.position, EnimeAI.transform.position) > 2f)
        {
            EnimeAI.CurrentState = new Patrol(EnimeAI);
        }
    }
示例#11
0
 public Patrol(SmartMan EnimeAI)    //Constructor that starts at beginning of Class
 {
     EnimeAI.anim.SetBool("isRun", false);
     Closest(EnimeAI);
 }
示例#12
0
 public virtual void UpdateState(SmartMan EnimeAI)
 {
     Debug.Log("BaseState");
 }
示例#13
0
 public AttackBeh(PlayerController player, SmartMan EnimeAI)
 {
     IsAttacking = true;
     EnimeAI.StartCoroutine(Attack(player, EnimeAI));
     EnimeAI.anim.SetBool("isRun", false);
 }