public override Vector2 CalculateMove(FlockAgent agent, List <Transform> context, Flock flock) { // If no neighbors, then no adjustment if (context.Count == 0) { return(Vector2.zero); } // Otherwise average out position of neighbors Vector2 move = Vector2.zero; int nAvoid = 0; List <Transform> filteredContext = (ContextFilter != null) ? ContextFilter.Filter(agent, context) : context; foreach (Transform item in filteredContext) { bool inAvoidanceRadius = Vector2.SqrMagnitude(item.position - agent.transform.position) < flock.SquareAvoidanceRadius; if (!inAvoidanceRadius) { continue; } ++nAvoid; move += (Vector2)(agent.transform.position - item.position); } return((nAvoid > 0) ? move / nAvoid : move); }
public override Vector2 CalculateMove(FlockAgent agent, List <Transform> context, Flock flock) { // If no neighbors, then no adjustment if (context.Count == 0) { return(Vector2.zero); } // Otherwise average out position of neighbors Vector2 move = Vector2.zero; List <Transform> filteredContext = (ContextFilter != null) ? ContextFilter.Filter(agent, context) : context; foreach (Transform item in filteredContext) { move += (Vector2)item.position; } if (filteredContext.Count != 0) { move /= filteredContext.Count; } // Create offset from agent position move -= (Vector2)agent.transform.position; move = Vector2.SmoothDamp(agent.transform.up, move, ref currentVelocity, agentSmoothTime); return(move); }
public override Vector2 CalculateMove(FlockAgent agent, List <Transform> context, List <Transform> areaContext, Flock flock) { //hide from List <Transform> filteredContext = (filter == null) ? areaContext : filter.Filter(agent, areaContext); //hide behind List <Transform> obstacleContext = (filter == null) ? areaContext : obstaclesFilter.Filter(agent, areaContext); if (filteredContext.Count == 0) { return(Vector2.zero); } //find nearest obstacle float nearestDistance = float.MaxValue; Transform nearestObstacle = null; foreach (Transform item in obstacleContext) { float Distance = Vector2.Distance(item.position, agent.transform.position); if (Distance < nearestDistance) { nearestObstacle = item; nearestDistance = Distance; } } //return if no obstacle if (nearestObstacle == null) { return(Vector2.zero); } //find best hiding spot Vector2 move = Vector2.zero; foreach (Transform item in filteredContext) { //direction from item to nearestObstacle Vector2 obstacleDirection = nearestObstacle.position - item.position; //add to that direction to get the point we need to hide behind obstacleDirection += obstacleDirection.normalized * hideBehindObstacleDistance; //get the position Vector2 hidePosition = ((Vector2)item.position) + obstacleDirection; move += hidePosition; } move /= filteredContext.Count; //FOR DEBUG ONLY Debug.DrawRay(move, Vector2.up * 3f); //find direction the ai wants to move in //ie the offset move -= (Vector2)agent.transform.position; return(move); }
public override Vector2 CalculateMove(LifeAgent agent, List <Transform> context, Life life) { if (context.Count == 0) { return(Vector2.zero); } List <Transform> filteredContext = (filter == null) ? context : filter.Filter(agent, context); List <Transform> obstacleContext = (filter == null) ? context : obstaclesFilter.Filter(agent, context); if (filteredContext.Count == 0) { return(Vector2.zero); } //find nearest obstacle to hide behind float nearestDistance = float.MaxValue; Transform nearestObstacle = null; foreach (Transform item in obstacleContext) { float distance = Vector2.Distance(item.position, agent.transform.position); if (distance < nearestDistance) { nearestDistance = distance; nearestObstacle = item; } } //if no obstacle if (nearestObstacle == null) { return(Vector2.zero); } //find best hiding spot Vector2 hidePosition = Vector2.zero; foreach (Transform item in filteredContext) { Vector2 obstacleDirection = nearestObstacle.position - item.position; obstacleDirection = obstacleDirection.normalized * hideBehindObstacleDistance; hidePosition += ((Vector2)nearestObstacle.position) + obstacleDirection; } hidePosition /= filteredContext.Count; //for debug only Debug.DrawRay(hidePosition, Vector2.up * 1f); return(hidePosition - (Vector2)agent.transform.position); }
public override Vector2 CalculateMove(FlockAgent agent, List <Transform> context, Flock flock) { if (context.Count == 0) { return(Vector2.zero); } //Filter obstacles and enemy AI is hiding from - filter from parent class List <Transform> filteredContext = (filter == null) ? context: filter.Filter(agent, context); //Hide behind List <Transform> obstacleContext = (filter == null) ? context: obstacleFilter.Filter(agent, context); if (filteredContext.Count == 0) { return(Vector2.zero); } //find nearest obstacle to hide behind float nearestDistance = float.MaxValue; Transform nearestObstacle = null; foreach (Transform item in obstacleContext) { float distance = Vector2.Distance(item.position, agent.transform.position); if (distance < nearestDistance) { nearestDistance = distance; nearestObstacle = item; } } //if no obstacle if (nearestObstacle == null) { return(Vector2.zero); } //find best hiding spot Vector2 hidePosition = Vector2.zero; //Looking through every enemy and finding opposite direction from the enemy to obstacle foreach (Transform item in filteredContext) { Vector2 obstacleDirection = nearestObstacle.position - item.position; obstacleDirection = obstacleDirection.normalized * hideBehindObstacleDist; //Give direction magnitude of 1 hidePosition += ((Vector2)nearestObstacle.position) + obstacleDirection; } hidePosition /= filteredContext.Count; //FOR DEBUG ONLY Debug.DrawRay(hidePosition, Vector2.up * 1f); return(hidePosition - (Vector2)agent.transform.position); }
public override Vector2 CalculateMove(FlockAgent agent, List <Transform> context, List <Transform> areaContext, Flock flock) { List <Transform> filteredContext = (filter == null) ? areaContext : filter.Filter(agent, areaContext); List <Transform> obstacleContext = (filter == null) ? areaContext : obstaclesFilter.Filter(agent, areaContext); if (filteredContext.Count == 0) { return(Vector2.zero); } float nearestDistance = float.MaxValue; Transform nearestObstacle = null; foreach (Transform item in obstacleContext) { float Distance = Vector2.Distance(item.position, agent.transform.position); //Get when enemies are in range and start animating if (Distance < nearestDistance) { nearestObstacle = item; nearestDistance = Distance; agent.Animator.SetBool("flee", true); } else { agent.Animator.SetBool("flee", false); } } if (nearestObstacle == null) { return(Vector2.zero); } Vector2 move = Vector2.zero; foreach (Transform item in filteredContext) { //DIRECTION FROM ITEM TO NEARESTOBSTACLE Vector2 obstacleDirection = nearestObstacle.position - item.position; //ADD TO THAT DIRECTION TO GET THE POINT (BEHIND THE OBSTACLE) THAT WE NEED TO HIDE obstacleDirection += obstacleDirection.normalized * hideBehindObstacleDistance; Vector2 hidePosition = ((Vector2)item.position) + obstacleDirection; move += hidePosition; } move /= filteredContext.Count; Debug.DrawRay(move, Vector2.up * 3f); move -= (Vector2)agent.transform.position; enemies = areaContext; return(move); }
public override Vector2 CalculateMove(FlockAgent agent, List <Transform> context, List <Transform> areaContext, Flock flock) { //hide from List <Transform> filteredContext = (filter == null) ? areaContext : filter.Filter(agent, areaContext); //hide behind List <Transform> obsticleContext = (filter == null) ? areaContext : obsticleFilter.Filter(agent, areaContext); if (filteredContext.Count == 0) { return(Vector2.zero); } //find nearest obsticle float nearestDistance = float.MaxValue; Transform nearestObsticle = null; foreach (Transform item in obsticleContext) { float Distance = Vector2.Distance(item.position, agent.transform.position); if (Distance < nearestDistance) { nearestObsticle = item; nearestDistance = Distance; } } if (nearestObsticle == null) { return(Vector2.zero); } Vector2 move = Vector2.zero; foreach (Transform item in filteredContext) { Vector2 obsticleDirection = nearestObsticle.position - item.position; obsticleDirection += obsticleDirection.normalized * hideBehindObsticleDistance; //get position Vector2 hidePosition = ((Vector2)item.position) + obsticleDirection; move += hidePosition; } move /= filteredContext.Count; //debug only Debug.DrawRay(move, Vector2.up * 3f); //find direction AI want to move move -= (Vector2)agent.transform.position; return(move); }
public override Vector2 CalculateMove(FlockAgent agent, List <Transform> context, List <Transform> nearbyContext, Flock flock) { if (context.Count == 0) { return(Vector2.zero); } Vector2 cohesionMove = Vector2.zero; List <Transform> filteredContext = (filter == null) ? context : filter.Filter(agent, context); foreach (Transform item in filteredContext) { cohesionMove += (Vector2)item.position; } cohesionMove /= context.Count; cohesionMove -= (Vector2)agent.transform.position; //Smoothen movement in flock cohesionMove = Vector2.SmoothDamp(agent.transform.up, cohesionMove, ref currentVelocity, agentSmoothTime); return(cohesionMove); }
public override Vector2 CalculateMove(FlockAgent agent, List <Transform> context, Flock flock) { // If no neighbors, maintain current alignment if (context.Count == 0) { return(agent.transform.up); } // Otherwise average out alignment of neighbors Vector2 move = Vector2.zero; List <Transform> filteredContext = (ContextFilter != null) ? ContextFilter.Filter(agent, context) : context; foreach (Transform item in filteredContext) { move += (Vector2)item.up; } if (filteredContext.Count != 0) { move /= filteredContext.Count; } return(move); }
//Moves freely as a flock IEnumerator WanderState() { Debug.Log("Wander Enter"); if (flock.behavior != wanderBehavior) { flock.behavior = wanderBehavior; } while (state == State.Wander) { foreach (FlockAgent agent in flock.agents) { List <Transform> filteredContext = (filter == null) ? flock.areaContext : filter.Filter(agent, flock.areaContext); if (filteredContext.Count > 0) { state = State.Hide; } } yield return(0); } Debug.Log("Wander Exit"); NextState(); }
private IEnumerator EvadeState() { while (lifeStates == LifeStates.Evade) { print("Prey are evading predator"); preyStateText.text = "Prey State: " + LifeStates.Evade.ToString(); foreach (FlockAgent agent in flock.agents) { List <Transform> filteredContext = (otherFlock == null) ? flock.context : otherFlock.Filter(agent, flock.context); if (filteredContext.Count <= 0) //if count of other flock (predators) is less than 0 then go to wander behavior { lifeStates = LifeStates.Wander; } Vector2 velocity = evadeBehavior.CalculateMove(agent, GetNearbyObjects(agent), flock); agent.Move(velocity); } yield return(null); } NextState(); yield return(null); }
//Moves between waypoints IEnumerator PatrolState() { Debug.Log("Patrol Enter"); if (flock.behavior != patrolBehavior) { flock.behavior = patrolBehavior; } while (state == State.Patrol) { timer += Time.deltaTime; foreach (FlockAgent agent in flock.agents) { List <Transform> filteredContext = (filter == null) ? flock.areaContext : filter.Filter(agent, flock.areaContext); if (filteredContext.Count > 0 && timer >= 15) { state = State.Chase; timer = 0; } } yield return(0); } Debug.Log("Patrol Exit"); NextState(); }