void MoveAwayFromThings() { Collider[] hits; if (AfraidOfPlayers) { hits = Physics.OverlapSphere(transform.position, SightDistance, (1 << LayerMask.NameToLayer("Field")) | (1 << LayerMask.NameToLayer("Player"))); } else { hits = Physics.OverlapSphere(transform.position, SightDistance, 1 << LayerMask.NameToLayer("Field")); } Vector3 away = SmallestAwayVector(hits); transform.forward = Vector3.Lerp(transform.forward, away.AddNoise(1f).normalized, Time.deltaTime * 10f); rigidbody.AddForce(transform.forward * ((hits.Length > 0) ? Speed : Speed * 0.5f), ForceMode.Acceleration); }
public void Look() { List <Collider> seen = Physics.OverlapSphere(transform.position, SightDistance, hunterLayerMask).ToList(); List <Collider> foodSeen = Physics.OverlapSphere(transform.position, SightDistance, foodLayerMask).ToList(); bool inCombat = false; Hunter closest = this; Vector3 newHeading = CurrentHeading; int allies = 0; int enemies = 0; foreach (Collider other in seen) { Hunter otherHunter = other.GetComponent <Hunter>(); if (closest == this) { closest = otherHunter; } else if (!inCombat) { if ((otherHunter.transform.position - transform.position).magnitude < (closest.transform.position - transform.position).magnitude) { closest = otherHunter; } } if (otherHunter.HunterType != HunterType) { closest = otherHunter; inCombat = true; enemies += 1; } else { allies += 1; } } if (closest != this) { Vector3 toClosest = (closest.transform.position - transform.position).Flatten().normalized; if (inCombat) { InCombat = true; newHeading = toClosest; if (Health < LowHealthThreshold || (allies < 4 && HunterType == HunterType.Group)) { newHeading *= -1f; } else if (isGrounded() && HunterType == HunterType.Group) { rb.AddForce((closest.transform.position - transform.position).normalized * 1000f, ForceMode.Impulse); } speedMultiplier = 1f; } else if (HunterType == HunterType.Group && Health >= LowHealthThreshold) { speedMultiplier = 0.5f; newHeading = closest.CurrentHeading.normalized; InCombat = false; } else { speedMultiplier = 0.5f; newHeading = CurrentHeading.AddNoise(25f); InCombat = false; } } else { speedMultiplier = 0.5f; newHeading = CurrentHeading.AddNoise(25f); } if (foodSeen.Count > 0 && Health < maxHealth * 0.6f) { speedMultiplier = 0.3f; timeMultiplier = 5f; newHeading = (foodSeen[0].transform.position - transform.position).Flatten().normalized; } else { timeMultiplier = 1f; } CurrentHeading = Vector3.Lerp(CurrentHeading, newHeading, Time.deltaTime * UnityEngine.Random.Range(3f, 10f)); }