예제 #1
0
    void Shoot(GameObject target)
    {
        if (target != null)
        {
            //Accuracy calculations
            Vector3    deviation3D = Random.insideUnitCircle * leader.accuracy;
            Quaternion rot         = Quaternion.LookRotation(Vector3.forward + deviation3D);
            Vector3    fwd         = leader.transform.rotation * rot * Vector3.forward;

            //Shooting ray
            RaycastHit hit;
            Debug.DrawRay(leader.transform.position, fwd * 100, Color.red, 0.5f);
            if (Physics.Raycast(leader.transform.position, fwd, out hit, 100))
            {
                if (hit.transform.tag == leader.enemyTag)
                {
                    if (hit.transform.GetComponent <StatePatternLeader>())  //if target is a leader
                    {
                        StatePatternLeader enemyLeader = hit.transform.GetComponent <StatePatternLeader>();
                        enemyLeader.health -= 25;
                        if (enemyLeader.health < 1)
                        {
                            leader.RemoveEnemyLeader(enemyLeader);
                        }
                    }
                    else if (hit.transform.GetComponent <GruntController>())    //if target is a grunt
                    {
                        GruntController enemyGrunt = hit.transform.GetComponent <GruntController>();
                        enemyGrunt.health -= 25;
                        if (enemyGrunt.health < 1)
                        {
                            leader.RemoveEnemyGrunt(enemyGrunt);
                        }
                    }
                }
            }
        }
        leader.AnimTimer(1, "ShootAnim");
    }
예제 #2
0
    void FindSlot()
    {
        Collider[]      colls             = Physics.OverlapSphere(transform.position, leaderScanRadius);
        List <Collider> friendlySlotLists = new List <Collider>();

        foreach (Collider col in colls)
        {
            if (col.CompareTag("SlotList") && col.transform.parent.CompareTag(tag))
            {
                friendlySlotLists.Add(col);
            }
        }
        if (friendlySlotLists.Count > 0)
        {
            foreach (Collider slotList in friendlySlotLists)
            {
                GameObject newSlot = slotList.GetComponent <GruntSlotList>().GetEmptyGruntSlot();
                if (newSlot != null)
                {
                    currentSlot = newSlot;
                    newSlot.GetComponent <GruntSlot>().myGrunt = gameObject;
                    currentLeader = slotList.transform.parent.GetComponent <StatePatternLeader>();
                    if (currentLeader.currentState == currentLeader.shootState)
                    {
                        currentLeader.searchState.Attack(); //if the new leader is shooting at something, tell its new grunts to shoot as well
                    }
                    break;
                }
            }
            if (currentSlot == null)
            {
                isSentry = true;
            }
        }
        else
        {
            isSentry = true;
        }
    }
예제 #3
0
 public ShootState(StatePatternLeader statePatternLeader)
 {
     leader = statePatternLeader;
 }
예제 #4
0
 private void Start()
 {
     parentLeader = transform.parent.GetComponent <StatePatternLeader>();
 }
예제 #5
0
 public void RemoveEnemyLeader(StatePatternLeader removee)
 {
     enemies.Remove(removee.GetComponent <Collider>());
     UpdateGruntEnemyLists(removee.GetComponent <Collider>());
     removee.Die();
 }
예제 #6
0
 public SearchState(StatePatternLeader statePatternLeader)
 {
     leader = statePatternLeader;
 }
예제 #7
0
    void Shoot()
    {
        if (shootTarget != null)
        {
            //Accuracy calculations
            Vector3    deviation3D = Random.insideUnitCircle * accuracy;
            Quaternion rot         = Quaternion.LookRotation(Vector3.forward + deviation3D);
            Vector3    fwd         = transform.rotation * rot * Vector3.forward;

            //Shooting ray
            RaycastHit hit;
            Debug.DrawRay(transform.position, fwd * 100, Color.red, 0.5f);
            if (Physics.Raycast(transform.position, fwd, out hit, 100))
            {
                if (hit.transform.tag == enemyTag)
                {
                    if (hit.transform.GetComponent <StatePatternLeader>())  //if target is a leader
                    {
                        StatePatternLeader enemyLeader = hit.transform.GetComponent <StatePatternLeader>();
                        enemyLeader.health -= 10;
                        if (enemyLeader.health < 1)
                        {
                            if (currentLeader != null)
                            {
                                currentLeader.RemoveEnemyLeader(enemyLeader);
                            }
                            else
                            {
                                if (enemyLeader != null)
                                {
                                    enemyList.Remove(enemyLeader.GetComponent <Collider>());
                                    enemyLeader.Die();
                                }
                            }
                        }
                    }
                    else if (hit.transform.GetComponent <GruntController>())    //if target is a grunt
                    {
                        GruntController enemyGrunt = hit.transform.GetComponent <GruntController>();
                        enemyGrunt.health -= 10;
                        if (enemyGrunt.health < 1)
                        {
                            if (currentLeader != null && enemyList.Contains(enemyGrunt.GetComponent <Collider>()))
                            {
                                currentLeader.RemoveEnemyGrunt(enemyGrunt);
                            }
                            else
                            {
                                if (enemyGrunt != null)
                                {
                                    enemyList.Remove(enemyGrunt.GetComponent <Collider>());
                                    enemyGrunt.Die();
                                }
                            }
                        }
                    }
                }
            }
        }
        nextShootTime = Time.time + 1;
    }