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"); }
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; } }
public ShootState(StatePatternLeader statePatternLeader) { leader = statePatternLeader; }
private void Start() { parentLeader = transform.parent.GetComponent <StatePatternLeader>(); }
public void RemoveEnemyLeader(StatePatternLeader removee) { enemies.Remove(removee.GetComponent <Collider>()); UpdateGruntEnemyLists(removee.GetComponent <Collider>()); removee.Die(); }
public SearchState(StatePatternLeader statePatternLeader) { leader = statePatternLeader; }
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; }