/// <summary> /// Updates the target situation to approach an enemy that's in cover. /// </summary> public static void ApproachACovered(AIController controller, ref AISituation situation) { var path = new NavMeshPath(); var corners = new Vector3[16]; var resultPosition = situation.ThreatGroundPosition; var resultDistance = 9999f; var coverAngle = Util.AngleOfVector(situation.ThreatCoverForward); for (int a = 0; a < 18; a++) { var angle = coverAngle - 180f + a * 10; var position = situation.ThreatGroundPosition + new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad), 0, Mathf.Sin(angle * Mathf.Deg2Rad)) * controller.Distances.MinEnemy; NavMeshHit hit; if (NavMesh.SamplePosition(position, out hit, 1.0f, NavMesh.AllAreas) && AIUtil.IsInSight(controller, hit.position, situation.ThreatStandingTopPosition)) { NavMesh.CalculatePath(controller.transform.position, hit.position, NavMesh.AllAreas, path); if (path.status == NavMeshPathStatus.PathComplete && !AIUtil.IsPositionTooCloseToFriends(controller, hit.position)) { var dist = 0f; for (int i = 1; i < path.GetCornersNonAlloc(corners); i++) { dist += Vector3.Distance(corners[i - 1], corners[i]); } if (dist < resultDistance) { resultDistance = dist; resultPosition = position; } } } } situation.TargetPosition = resultPosition; situation.TargetCover = null; }