Exemple #1
0
    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);
    }
Exemple #3
0
    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);
    }
Exemple #5
0
    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);
    }
Exemple #6
0
    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);
    }
Exemple #7
0
    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);
    }
Exemple #9
0
    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);
    }
Exemple #10
0
 //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();
 }
Exemple #11
0
    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);
    }
Exemple #12
0
 //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();
 }