//add a entity to a faction. If a faction doesn't exist for the entity, the function creates one and returns true to indicate that a faction was created public static bool addEntity(SoldierEntity entity) { for (int i = 0; i < Factions.Count; i++) { if (Factions [i].FactionName == entity.faction) { Factions [i].Soldiers.Add(entity); //for (int j = 0; j<FactionName[i].Soldiers.Count; j++){ // FactionName[i].Soldiers[j].knownPositionsOfOtherSoldiers.Add(new SoldierIntel(entity,Vector3.zero)); //} for (int j = 0; j < Factions.Count; j++) { if (Factions [j].FactionName != entity.faction) { Factions [j].SoldierIntelData.Add(new SoldierIntel(entity)); } } return(true); } // else { //} } return(false); }
/// <summary> /// Makes agent fire at the current target if possible /// </summary> public virtual void AttackTarget() { SoldierEntity temp = null; if (currentTarget != null && currentTarget.mainLOSCollider != null /*&& amountOfTimeCurrentTargetHasBeenInLOS >= fireDelayTime*/) { temp = currentTarget; } else if (currentlyVisibleEnemies.Count > 0) { temp = currentlyVisibleEnemies [0]; } if (temp != null) { //code for aiming towards player goes here //code for firing //if (enableDebugVisualizations) if (enableDebugVisualizations) Debug.DrawRay(barrelStart.position,barrelEnd.position - barrelStart.position,Color.red,0.1f); if (enableDebugVisualizations) { if (enableDebugVisualizations) { Debug.DrawRay(weapon.barrelStart.position, temp.centreOfMass.position - weapon.barrelStart.position, Color.blue, 0.1f); } } if (enableDebugPrint) { Debug.Log("Vector3.Angle(weaponList[currentWeapon].barrelEnd.position - weaponList[currentWeapon].barrelStart.position,temp.centreOfMass.position - weaponList[currentWeapon].barrelStart.position) " + Vector3.Angle(weapon.barrelEnd.position - weapon.barrelStart.position, temp.centreOfMass.position - weapon.barrelStart.position)); } if (weapon.stateOfWeapon == WeaponState.Ready && !friendlySoldierInLineOfFire && Vector3.Distance(temp.centreOfMass.position, transformToDoLOSChecksFrom.position) < maxRangeForEngagement && maxAngleOffsetForFiringShotsNotLinedUpWithBarrel > Mathf.Abs(Vector3.Angle(weapon.barrelEnd.position - weapon.barrelStart.position, temp.centreOfMass.position - weapon.barrelStart.position)) && (currentTargetIsVisible == LOSResult.Visible || amountOfTimeCurrentTargetHasBeenInLOS < amountOfTimePlayerMustBeVisibleBeforeShooting)) { if (weapon.fire(weapon.barrelEnd, weapon.barrelStart, thisEntity.faction, false)) { //animationObject.CrossFade(avatarAlias+"|"+weaponName.ToString()+" Reload"); //weapon.stateOfWeapon = WeaponState.Reloading; } // else { //} } else { if (enableDebugPrint) { Debug.Log("Target not in path of weapon!"); } } } else { if (enableDebugPrint) { Debug.Log("No target"); } } }
public void OnEnemySoldierDead(SoldierEntity soldierEntity) { Vector3 spawnPos = GetCenterPos(); enemySoldiersKilled++; if (enemySoldiersKilled % newSoldierPerEnemyKilled == 0) { CreateNewSoldier(spawnPos); } }
void CreateNewSoldier(Vector3 spawnPos) { Transform newSoldier = Instantiate(soldierPrefab, spawnPos, Quaternion.identity) as Transform; newSoldier.parent = legion; SoldierEntity soldierEntity = newSoldier.GetComponent <SoldierEntity>(); soldierEntity.SetColor(legionColor); soldierEntity.SetLayer("Player"); soldierEntity.SetRivalLayer("Enemy"); }
/// <summary> /// Resets state of soldier /// of the script /// </summary> public void ResetSoldier() { previousPos = gameObject.transform.position; healthController.health = healthController.maxhealth; this.CurrentTarget = null; this.weapon.magazines = new List <int> { weapon.magSize, weapon.magSize, weapon.magSize }; exploring = false; agent.ResetPath(); numActionsBusyWith = 0; currentActionSet.Clear(); }
public void InitializeSoldiers(string side, Vector3 pos) { string rivalSide = side.StartsWith("Player") ? "Enemy" : "Player"; for (int i = 0; i < soldierCount; i++) { Transform soldierTransform = Instantiate(soldierPrefab, pos, Quaternion.identity) as Transform; soldierTransform.parent = legion; SoldierEntity soldierEntity = soldierTransform.GetComponent <SoldierEntity>(); soldierEntity.SetLayer(side); soldierEntity.SetRivalLayer(rivalSide); soldierEntity.SetColor(legionColor); } }
public static void RemoveSoldier(SoldierEntity entity) { getFaction(entity.faction).Soldiers.Remove(entity); for (int i = 0; i < Factions.Count; ++i) { for (int k = 0; k < Factions[i].SoldierIntelData.Count; k++) { if (Factions[i].SoldierIntelData[k].soldierEntityToTrack == entity) { Factions[i].SoldierIntelData.RemoveAt(k); --k; } } } }
void Start() { legionColor = Color.Lerp(legionColor, legionColorVariance, Random.Range(0f, 1f)); mapGenerator = FindObjectOfType <MapGenerator>(); InitializeSoldiers("Enemy", transform.position); InvokeRepeating("SetRandomDestination", 1f, newDestTime); GameObject playerLegionControlObj = GameObject.FindGameObjectWithTag("Player"); PlayerLegionControl playerLegionControl = playerLegionControlObj.GetComponent <PlayerLegionControl>(); for (int i = 0; i < legion.childCount; i++) { Transform soldierTransform = legion.GetChild(i); SoldierEntity soldierEntity = soldierTransform.GetComponent <SoldierEntity>(); soldierEntity.OnSoldierDead += playerLegionControl.OnEnemySoldierDead; } }
/// <summary> /// Checks whether agent can shoot without hitting a friendly soldier /// </summary> protected virtual void UpdateFriendlyFireFlag() { friendlySoldierInLineOfFire = false; SoldierEntity temp = null; if (currentTarget != null && currentTarget.mainLOSCollider != null /*&& amountOfTimeCurrentTargetHasBeenInLOS > weapon.fireDelayTime*/) { temp = currentTarget; } else if (currentlyVisibleEnemies.Count > 0) { temp = currentlyVisibleEnemies [0]; } // if (fireTeamController != null) { // for (int i= 0; i<fireTeamController.fireTeamMembers.Count; i++) { // LOSRay.direction = weapon.barrelEnd.position - weapon.barrelStart.position; // LOSRay.origin = weapon.barrelStart.position; // if (fireTeamController.fireTeamMembers [i] != this && fireTeamController.fireTeamMembers [i].thisEntity.mainLOSCollider.Raycast (LOSRay, out hit, float.PositiveInfinity) && Vector3.Distance (hit.point, weapon.barrelStart.position) < Vector3.Distance (temp.centreOfMass.position, weapon.barrelStart.position)) { // if (enableDebugPrint) Debug.Log ("Friendly soldier in the way!"); // friendlySoldierInLineOfFire = true; // break; // } // } // } if (temp != null && temp.centreOfMass != null) { for (int i = 0; i < GameData.getFaction(thisEntity.faction).Soldiers.Count; ++i) { LOSRay.direction = weapon.barrelEnd.position - weapon.barrelStart.position; LOSRay.origin = weapon.barrelStart.position; if (GameData.getFaction(thisEntity.faction).Soldiers [i] != thisEntity && GameData.getFaction(thisEntity.faction).Soldiers [i].mainLOSCollider.Raycast(LOSRay, out hit, float.PositiveInfinity) && Vector3.Distance(hit.point, weapon.barrelStart.position) < Vector3.Distance(temp.centreOfMass.position, weapon.barrelStart.position)) { if (enableDebugPrint) { Debug.Log("Friendly soldier in the way!"); } friendlySoldierInLineOfFire = true; break; } } } }
protected override IEnumerator Attack() { Collider[] colliders = Physics.OverlapSphere(transform.position, attackRadius, LayerMask.GetMask(LayerMask.LayerToName(rivalLayer))); if (colliders.Length > 0) { currentStatus = Status.Attack; nav.enabled = false; SoldierEntity soldierEntity = colliders[0].transform.GetComponent <SoldierEntity>(); Vector3 originalPos = transform.position; Vector3 targetPos = colliders[0].transform.position + (transform.position - colliders[0].transform.position).normalized * attackRadius / 2f; float animationSpeed = 2f; // attack animation float percent = 0; bool hasAttacked = false; while (percent <= 1) { if (percent > 0.5f && !hasAttacked) { hasAttacked = true; if (soldierEntity != null) { soldierEntity.TakeDamage(damage, transform); } else { break; } } transform.position = Vector3.Lerp(originalPos, targetPos, (-(percent * percent) + percent) * 4); percent += animationSpeed * Time.deltaTime; yield return(null); } nav.enabled = true; currentStatus = Status.Idle; } }
/// <summary> /// Checks whether the given agent is in line of sight. /// Again, the code is compact and messy for efficiency purposes /// </summary> /// <returns>The in line of sight.</returns> /// <param name="entity">Entity.</param> public virtual LOSResult isInLineOfSight(SoldierEntity entity) { Color randCol = new Color(UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value); if (Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) > horizontalLOSDistance || Mathf.Abs(Vector3.Angle(weapon.barrelEnd.position - weapon.barrelStart.position, entity.centreOfMass.position - transformToDoLOSChecksFrom.position)) > horizontalFOVAngle) { if (enableDebugPrint) { Debug.Log("Not withing FOV angle!"); } if (Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) < peripheralVisionDistance) { return(LOSResult.PeripheralVisionTriggered); } else { return(LOSResult.Invisible); } } else { LOSRay.origin = transformToDoLOSChecksFrom.position; LOSRay.direction = entity.centreOfMass.position - transformToDoLOSChecksFrom.position; if (enableDebugVisualizations) { Debug.DrawRay(LOSRay.origin, LOSRay.direction, randCol, 0.1f); } if ((Physics.Raycast(LOSRay, out hit, Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) + 10, LOSCheckLayers))) { if (hit.collider == entity.mainLOSCollider) { //if (enableDebugVisualizations) if (enableDebugVisualizations) Debug.DrawRay(transformToDoLOSChecksFrom.position,entity.centreOfMass.position - transformToDoLOSChecksFrom.position,Color.red,0.1f); if (Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) < maxDistanceForUsingHighAccuracyLOSChecks && entity.LOSCheckColliders.Length > 0 && entity.LOSCheckTransforms.Length > 0) { for (int i = 0; i < entity.LOSCheckColliders.Length; i++) { LOSRay.direction = entity.LOSCheckTransforms [i].position - transformToDoLOSChecksFrom.position; //if (enableDebugVisualizations) if (enableDebugVisualizations) Debug.DrawRay(transformToDoLOSChecksFrom.position, entity.LOSCheckTransforms[i].position - transformToDoLOSChecksFrom.position,Color.red,0.1f); if ((Physics.Raycast(LOSRay, out hit, Vector3.Distance(entity.centreOfMass.position, transformToDoLOSChecksFrom.position) + 10, LOSCheckLayers))) { if (hit.collider.Equals(entity.LOSCheckColliders [i])) { //currentlyVisibleEnemies.Add(entity); return(LOSResult.Visible); } } } } else { //currentlyVisibleEnemies.Add(entity); if (enableDebugPrint) { Debug.Log("High accuracy visibility checks skipped!"); } return(LOSResult.Visible); } } else { for (int i = 0; i < entity.LOSCheckColliders.Length; i++) { if (hit.collider.gameObject.Equals(entity.LOSCheckColliders [i].gameObject)) { return(LOSResult.Visible); } } if (enableDebugPrint) { Debug.Log("MainLOSColliderNotVisible! " + entity.mainLOSCollider.gameObject.transform.root.gameObject.name + ". It hit " + hit.collider.gameObject.transform.root.gameObject.name + " " + entity.LOSCheckColliders.Length); } //if (enableDebugVisualizations) if (enableDebugVisualizations) Debug.DrawRay(transformToDoLOSChecksFrom.position,hit.point - transformToDoLOSChecksFrom.position,Color.green,0.1f); return(LOSResult.Invisible); } } if (enableDebugPrint) { Debug.Log("Rays didn't hit anything!"); } return(LOSResult.Invisible); //} } }
public void Start() { thisEntity = GetComponent <CreateSoldierEntity> ().entity; healthController.AddOnDamageEvent(this.OnDamage); previousPos = gameObject.transform.position; }