Пример #1
0
    private IEnumerator AttackState() //Doesnt work
    {
        while (lifeStates == LifeStates.Attack)
        {
            stateText.text = "Predator State: " + LifeStates.Attack.ToString();

            foreach (FlockAgent predatorAgent in flock.agents)
            {
                Vector2 velocity = attackBehavior.CalculateMove(predatorAgent, GetNearbyObjects(predatorAgent), flock);
                predatorAgent.Move(velocity);

                foreach (FlockAgent preyAgent in prey.GetFlock().agents) //go through list of agents in prey
                {
                    // check if prey is in range of attack range (1f)
                    if (Vector3.Distance(preyAgent.transform.position, predatorAgent.transform.position) < attackRadius)
                    {
                        Destroy(prey.gameObject);
                        print("Prey are being eaten");

                        if (prey.GetFlock().agents.Count <= 0) //if predators have eaten all prey
                        {
                            print("Prey are gone");
                            lifeStates = LifeStates.Wander; //go back to wander state
                        }
                    }
                }
            }
            print("Predator are eating prey");
        }
        NextState();
        yield return(null);
    }
Пример #2
0
    private IEnumerator WanderState()
    {
        while (lifeStates == LifeStates.Wander)
        {
            preyStateText.text = "Prey State: " + LifeStates.Wander.ToString();
            foreach (FlockAgent agent in flock.agents)
            {
                Vector2 velocity = wanderBehavior.CalculateMove(agent, GetNearbyObjects(agent), flock);
                agent.Move(velocity);
            }
            #region Waypoints not being used

            /* //Getting distance between the prey and the waypoints
             * float distance = Vector2.Distance(transform.position, preyWanderPoint[i].transform.position);
             *
             * //if distance between predator and waypoints is less than 0.5 then increase index of waypoints and go to next waypoint
             * if (distance < minDistance)
             * {
             *   i++;
             * }
             * if (i >= preyWanderPoint.Length)
             * {
             *   i = 0;
             * }
             * flock.agentPrefab.Move(preyWanderPoint[i].position);*/
            #endregion
            yield return(null);
        }
        yield return(null);

        NextState();
    }
Пример #3
0
    void Update()
    {
        foreach (Fish f in fish)
        {
            if (f != null)
            {
                List <Transform> cont = GetNearbyObjects(f);
                Vector2          move = behavior.CalculateMove(f, cont, this);
                move *= driveFactor;
                if (move.sqrMagnitude > squareMaxSpeed)
                {
                    move = move.normalized * maxSpeed;
                }
                f.Move(move);
            }
        }

        int fishIndex = 0;

        while (fishIndex < fish.Count)
        {
            if (fish[fishIndex] == null)
            {
                fish.RemoveAt(fishIndex);
            }
            fishIndex++;
        }
    }
Пример #4
0
    void Update()
    {
        population     = agents.Count;
        m_targetNumber = m_species.NumberOfAI;

        updatePopulation();

        foreach (FlockAgent agent in agents)
        {
            List <Transform> context = GetNearbyObjects(agent);

            /*
             * Renderer rend = agent.GetComponentInChildren<Renderer>();
             * rend.material.color = Color.Lerp(Color.white, Color.red, context.Count/7f);
             */

            Vector3 move = behavior.CalculateMove(agent, context, this);
            move *= driveFactor;

            if (move.sqrMagnitude > squareMaxSpeed)
            {
                move = move.normalized * maxSpeed;
            }
            agent.Move(move);
        }
    }
Пример #5
0
    /*private void Wander()
     * {
     *  foreach (FlockAgent agent in flock.agents)
     *  {
     *      Vector2 velocity = wanderBehavior.CalculateMove(agent, GetNearbyObjects(agent), flock);
     *      agent.Move(velocity);
     *      //yield return null;
     *  }
     *  //Getting distance between the predator and the waypoints
     *  float distance = Vector2.Distance(transform.position, wanderPoints[index].transform.position);
     *
     *  //if distance between predator and waypoints is less than 0.5 then increase index of waypoints
     *  if (distance < minDistance)
     *  {
     *      index++;
     *  }
     *  if (index >= wanderPoints.Length)
     *  {
     *      index = 0;
     *  }
     *  //flock.agentPrefab.Move(wanderPoints[index].position);
     * }*/
    #endregion

    #region Pursuit
    private IEnumerator PursuitState() //doesnt work
    {
        while (lifeStates == LifeStates.Pursuit)
        {
            stateText.text = "Predator State: " + LifeStates.Pursuit.ToString();
            foreach (FlockAgent predatorAgent in flock.agents)
            {
                Vector2 velocity = pursuitBehavior.CalculateMove(predatorAgent, GetNearbyObjects(predatorAgent), flock);
                predatorAgent.Move(velocity);

                foreach (FlockAgent preyAgent in prey.GetFlock().agents) //go through list of agents in FlockAgent
                {
                    // check if prey is too far away
                    if (Vector3.Distance(preyAgent.transform.position, predatorAgent.transform.position) > chaseRadius)
                    {
                        lifeStates = LifeStates.Wander;
                        continue;
                    }
                    else
                    {
                        lifeStates = LifeStates.Attack;
                    }
                }
            }
            print("Predator are pursuing prey");
            yield return(null);
        }
        NextState();
        yield return(null);
    }
Пример #6
0
    private IEnumerator WanderState()           //does work
    {
        while (lifeStates == LifeStates.Wander) //while in wander state
        {
            print("Predators are wandering");
            stateText.text = "Predator State: " + LifeStates.Wander.ToString();

            foreach (FlockAgent predatorAgent in flock.agents)
            {
                Vector2 velocity = wanderBehavior.CalculateMove(predatorAgent, GetNearbyObjects(predatorAgent), flock);
                predatorAgent.Move(velocity);

                foreach (FlockAgent preyAgent in prey.GetFlock().agents) //go through list of agents in FlockAgent
                {
                    if (Vector2.Distance(preyAgent.transform.position, predatorAgent.transform.position) < chaseRadius)
                    {
                        //Change state to attack state and eat prey
                        lifeStates = LifeStates.Pursuit;
                        break;
                    }
                }

                if (lifeStates != LifeStates.Wander)
                {
                    break;
                }
            }
            yield return(null);
        }
        NextState();
        yield return(null);
    }
Пример #7
0
    // Update is called once per frame
    void Update()
    {
        foreach (FlockAgent agent in agents)
        {
            List <Transform> context = GetNearbyObjects(agent);
            Vector3          move    = behavior.CalculateMove(agent, context, this);
            move *= driveFactor;


            if (agent.transform.position.y != 0.6f)
            {
                agent.transform.position = new Vector3(agent.transform.position.x, 0.6f, agent.transform.position.z);
            }

            //if the agent moves too fast
            if (move.sqrMagnitude > squareMaxSpeed)
            {
                //Vector3 temp_1 = new Vector3(move.normalized.x, 0.0f, move.normalized.z) *maxSpeed;
                move = move.normalized * maxSpeed;
            }

            //move the agent
            // Vector3 temp_2 = new Vector3(move.x, 0.0f, move.z);
            agent.Move(move);
        }
    }
Пример #8
0
    // Update is called once per frame
    void Update()
    {
        foreach (FlockAgent agent in agents)
        {
            List <Transform> context = GetNearbyObjects(agent);
            Vector3          move    = behavior.CalculateMove(agent, context, this);

            if (move == null)
            {
                return;
            }

            if (!threeDimMovement)
            {
                move.y = 0;
            }

            move *= driveFactor;

            if (move.sqrMagnitude > squareMaxSpeed)
            {
                move = move.normalized * maxSpeed;
            }

            agent.Move(move);
        }
    }
Пример #9
0
    public void Run()
    {
        elapsed += Time.deltaTime;

        foreach (FlockAgent agent in agents)
        {
            List <Transform> context = GetNearbyObjects(agent);
            Vector3          move    = behavior.CalculateMove(agent, context, this);
            move *= speed;
            if (move.sqrMagnitude > squareMaxSpeed)   //reset ot max speed when exceeding
            {
                move = move.normalized * maxSpeed;
            }
            agent.Move(move);
        }

        //seperation
        if (elapsed > timePerSeperation)
        {
            FlockAgent agent = agents.Random();
            agent.Separate();
            agents.Remove(agent);
            elapsed = 0f;
        }
    }
Пример #10
0
    // Update is called once per frame
    void Update()
    {
        if (agents.Count == 0)
        {
            Destroy(gameObject);
        }

        foreach (FlockAgent agent in agents)
        {
            if (agent.imDead)
            {
                agents.Remove(agent);

                Destroy(agent.gameObject);
            }

            else
            {
                List <Transform> context = GetNearbyObjects(agent);

                Vector3 move = behavior.CalculateMove(agent, context, this);
                move *= driveFactor;
                if (move.sqrMagnitude > squareMaxSpeed)
                {
                    move = move.normalized * maxSpeed;
                }

                agent.Move(move);
            }
        }
    }
Пример #11
0
    void Update( )
    {
        textoQuantidade.text = nome + ": " + startingCount;

        if (Input.GetKey(teclaAumentar))
        {
            startingCount++;
        }
        else if (Input.GetKey(teclaDiminuir))
        {
            startingCount--;
        }
        if (Input.GetKeyUp(teclaAumentar) || Input.GetKeyUp(teclaDiminuir))
        {
            ReloadAgents( );
        }

        foreach (FlockAgent agent in agents)
        {
            List <Transform> context = GetNearbyObjects(agent);
            Vector2          move    = behavior.CalculateMove(agent, context, this);
            move *= driveFactor;
            if (move.sqrMagnitude > squareMaxSpeed)
            {
                move = move.normalized * maxSpeed;
            }
            agent.Move(move);
        }
    }
Пример #12
0
    void Update()
    {
        foreach (FlockAgent agent in agents)
        {
            // Make a list of everything in the context of the agent's radius.
            List <Transform> context = GetNearbyObjects(agent);

            if (changeColorDebug == true)
            {
                // DEBUG, FOR DEMO ONLY: Change agent color based on how many agents are near it (0 = white, max 6 = red).
                agent.GetComponentInChildren <Renderer>().material.color = Color.Lerp(Color.white, Color.red, context.Count / 6f);
            }

            // Calculate how the agent should move based on nearby objects.
            // The calculation is done in FlockBehavior.CalculateMove.
            Vector3 move = behavior.CalculateMove(agent, context, this);
            move *= driveFactor;

            // Cap the speed (bring it back to maxSpeed if greater).
            if (move.sqrMagnitude > squareMaxSpeed)
            {
                move = move.normalized * maxSpeed;
            }
            agent.Move(move);
        }
    }
Пример #13
0
    protected virtual void Update()
    {
        //Be careful with loop within loops (Loopception)
        foreach (FlockAgent agent in agents)
        {
            //List of Transforms called context is the area around the AI
            //One agent where the AI flocks around it
            context = GetNearbyObjects(agent);

            //Changing color of Flock Agents FOR TESTING
            //agent.GetComponent<SpriteRenderer>().color = Color.Lerp(Color.white, Color.red, context.Count /6f);
            //Lerp - Linear Interpolate

            //Referencing move behaviour in Unity and FlockBehaviour script
            Vector2 move = behavior.CalculateMove(agent, context, this);
            //move will return some value (to increase speed) and depending on how many generate,
            //multiplied by driveFactor
            move *= driveFactor;
            //Magnitude is speed inside a Vector - 2 uses, one is storing direction, other is magnitude
            if (move.sqrMagnitude > squareMaxSpeed)
            {
                //normalized returns Vector with mag of 1, normalize changes Vector
                move = move.normalized * maxSpeed;
            }
            //F12 shows definition of where the method came from
            agent.Move(move);
        }
    }
Пример #14
0
 private IEnumerator CollisionAvoidState() //does work
 {
     while (lifeStates == LifeStates.CollisionAvoidance)
     {
         foreach (FlockAgent agent in flock.agents)
         {
             Vector2 velocity = obstacleAvoid.CalculateMove(agent, GetNearbyObjects(agent), flock);
             agent.Move(velocity);
             yield return(null);
         }
         print("Predator are avoiding obstacles");
     }
     yield return(null);
 }
Пример #15
0
    // Update is called once per frame
    void Update()
    {
        if (PSO == true)
        {
            partic.UpdateParticleProgram();
        }


        foreach (FlockAgent agent in agents)    // update ke seluruh agent
        {
            List <Transform> context = GetNearByObjects(agent);

            Vector2 move;
            if (PSO == true)
            {
                move = behaviorMono.CalculateMove(agent, context, this, partic.targetBestGlobalPos);
            }
            else
            {
                move = behaviors.CalculateMove(agent, context, this);
            }

            move *= driveFactor;

            if (move.sqrMagnitude > squareMaxSpeed)
            {
                move = move.normalized * maxSpeed;
            }
            agent.Move(move);


            //Debug.Log(Vector2.SqrMagnitude(this.transform.position - agent.transform.position));
            //Debug.Log(this.ToString() + "  " + agent.ToString());

            //AddRecord(this.ToString(), agent.ToString(), Vector2.SqrMagnitude(this.transform.position - agent.transform.position), "floflo.csv");
            //for (int i = 0; i < moveArray.Length; i++)
            //{
            //    if (moveArray[i].sqrMagnitude > squareMaxSpeed)
            //    {
            //        moveArray[i] = moveArray[i].normalized * maxSpeed;
            //    }
            //    agent.Move(moveArray[i]);
            //}
        }
        epoch++;
        //using (System.IO.StreamWriter file = new System.IO.StreamWriter("AlingmentNew2.csv", true))


        //    Debug.Log((int)Time.fixedTime);
    }
Пример #16
0
 private void Update()
 {
     foreach (var agent in agents)
     {
         List <Transform> context = getNearbyObject(agent);
         Vector3          move    = behavior.CalculateMove(agent, context, this);
         move *= SpeedFactor;
         if (move.sqrMagnitude > squareMaxSpeed)
         {
             move = move.normalized * SpeedCap;
         }
         agent.Move(move);
     }
 }
Пример #17
0
 private void FixedUpdate()
 {
     _flockAgents.ForEach(agent =>
     {
         var context  = GetNearbyObjects(agent);
         var movement = behavior.CalculateMove(this, agent, context);
         movement    *= speedMultiplier;
         if (movement.sqrMagnitude > _sqMaxSpeed)
         {
             movement = movement.normalized * maxSpeed;
         }
         agent.Move(movement);
     });
 }
Пример #18
0
 // Update is called once per frame
 void Update()
 {
     foreach (FlockAgent agent in agents)
     {
         List <Transform> context = getNearbyObjects(agent);
         Vector2          move    = behavior.CalculateMove(agent, context, this);
         move *= driveFactor;
         if (move.sqrMagnitude > sqrMaxSpeed)
         {
             move = move.normalized * maxSpeed;
         }
         agent.Move(move);
     }
 }
Пример #19
0
 public void Update()
 {
     // calculate move offset of all the agent in this flock
     foreach (FlockAgent agent in agentList)
     {
         List <Transform> subFlock = GetSubFlock(agent);
         Vector3          move     = behavior.CalculateMove(agent, subFlock, this);
         move *= DriveFactor;
         if (move.sqrMagnitude > squareFlockSpeed)   // restrict the speed less than flock speed
         {
             move = move.normalized * FlockSpeed;
         }
         agent.Move(move);
     }
 }
Пример #20
0
 void Update()
 {
     foreach (FlockAgent agent in agents)
     {
         List <Transform> context = GetNearbyObjects(agent);
         Vector3          move    = behavior.CalculateMove(agent, context, this);
         move *= speedMultiplier;
         float length = move.magnitude;
         move.y = 0;
         if (move.magnitude != length)
         {
             move = move.normalized * length;
         }
         agent.Move(move);
     }
 }
Пример #21
0
    private void Update()
    {
        foreach (FlockAgent agent in agents)
        {
            context     = GetNearbyObjects(agent, neighborRadius);
            areaContext = GetNearbyObjects(agent, areaRadius);
            Vector2 move = behavior.CalculateMove(agent, context, areaContext, this);
            move *= driveFactor;

            if (move.sqrMagnitude > squareMaxSpeed)
            {
                move = move.normalized * maxSpeed;
            }
            agent.Move(move);
        }
    }
Пример #22
0
 private IEnumerator HideState() //Hide = go out of chase range
 {
     while (lifeStates == LifeStates.Hide)
     {
         print("Prey are hiding");
         preyStateText.text = "Prey State: " + LifeStates.Hide.ToString();
         foreach (FlockAgent agent in flock.agents)
         {
             Vector2 velocity = hideBehavior.CalculateMove(agent, GetNearbyObjects(agent), flock);
             agent.Move(velocity);
         }
         yield return(null);
     }
     NextState();
     yield return(null);
 }
Пример #23
0
    // Update is called once per frame
    void Update()
    {
        foreach (FlockAgent agent in agents)
        {
            List <Transform> context = GetNearbyObjects(agent);
            //agent.GetComponentInChildren<SpriteRenderer>().color = Color.Lerp(Color.white, Color.red, context.Count / 6f);

            Vector2 move = behavior.CalculateMove(agent, context, this);
            move *= driveFactor;
            if (move.sqrMagnitude > squareMaxSpeed)
            {
                move = move.normalized * maxSpeed;
            }
            agent.Move(move);
        }
    }
Пример #24
0
    private IEnumerator FlockState()
    {
        while (lifeStates == LifeStates.Flock)
        {
            print("Prey are flocking");
            preyStateText.text = "Prey State: " + LifeStates.Flock.ToString();
            foreach (FlockAgent agent in flock.agents)
            {
                Vector2 velocity = flockBehavior.CalculateMove(agent, GetNearbyObjects(agent), flock);
                agent.Move(velocity);
            }

            yield return(null);
        }
        NextState();
        yield return(null);
    }
Пример #25
0
    void Update()
    {
        if (agentMaster != null)
        {
            foreach (FlockAgent agent in agents)
            {
                agent.D = Vector3.Distance(agentMaster.transform.position, agent.transform.position);


                if (agent.D < reach && agent != agentMaster)
                {
                    List <Transform> context = GetNearbyObjects(agent);
                    agent.move  = behavior.CalculateMove(agent, agentMaster, context, this);
                    agent.move *= driveFactor;
                    if (agent.move.sqrMagnitude > squareMaxSpeed)
                    {
                        agent.move = agent.move.normalized * maxSpeed;
                    }

                    if (!agentMaster.inHandAgents.Contains(agent))
                    {
                        agentMaster.inHandAgents.Add(agent);
                    }
                }
                else
                {
                    agent.rb.useGravity = true; agentMaster.inHandAgents.Remove(agent);
                }

                if (agent == agentMaster && agentMaster.inHandAgents.Count > 0)
                {
                    agentMaster.inHandAgents = agentMaster.inHandAgents.OrderBy(x => x.D).ToList();
                    for (int i = 0; i < grabCap; i++)
                    {
                        if (i < agentMaster.inHandAgents.Count)
                        {
                            agentMaster.inHandAgents[i].Move(agentMaster.inHandAgents[i].move);
                            agentMaster.inHandAgents[i].rb.useGravity = false;
                            //agentMaster.inHandAgents.Add(agent);
                        }
                    }
                }
            }
        }
    }
Пример #26
0
 // Update is called once per frame
 void Update()
 {
     foreach (FlockAgent agent in agents)
     {
         List <Transform> context = GetNearbyObjects(agent);
         Vector3          move    = behavior.CalculateMove(agent, context, this);
         move *= driveFactor;
         if (move.sqrMagnitude > squareMaxSpeed)
         {
             move = move.normalized * maxSpeed;
         }
         if (Vector3.SqrMagnitude(transform.position - agent.transform.position) > centralRad)
         {
             move = (transform.position - agent.transform.position).normalized;
         }
         agent.Move(move);
     }
 }
Пример #27
0
    void Update()
    {
        for (int i = 0; i < agents.Count; i++)
        {
            if (agents[i])
            {
                List <Transform> context = GetNearByObjects(agents[i]);

                Vector3 move = behavior.CalculateMove(agents[i], context, this, points);
                move *= driveFactor;
                if (move.sqrMagnitude > squareMaxSpeed)
                {
                    move = move.normalized * maxSpeed;
                }
                agents[i].Move(move);
            }
        }
    }
Пример #28
0
    // Update is called once per frame
    void Update()
    {
        foreach (FlockAgent agent in flockAgents)                                                                                                 //para cada agente na lista de agentes
        {
            List <Transform> nearObjects = FindNearbyObjects(agent);                                                                              //encontrar lista de objetos proximos ao agente
            agent.agenteSpriteRenderer.color = Color.Lerp(noNeighborColor, fullNeighborColor, nearObjects.Count / (float)fullNeighborColorCount); //alterar cor do agente baseado no numero de objetos em volta //para testes

            Vector2 movement = flockBehavior.CalculateMove(agent, nearObjects, this);                                                             //calcular movimento do agente
            movement *= driveFactor;                                                                                                              //ajustar velocidade/movimento do agente

            if (movement.sqrMagnitude > squareMaxSpeed)                                                                                           //se passar da velocidade maxima
            {
                movement = movement.normalized * maxSpeed;                                                                                        //colocar agente na velocidade maxima
            }

            agent.Move(movement); //movimentar o agente
        }
    }
Пример #29
0
    protected virtual void Update()
    {
        foreach (FlockAgent agent in agents) //go through every agent in the flock
        {
            List <Transform> context = GetNearbyObjects(agent);

            //FOR TESTING
            //agent.GetComponent<SpriteRenderer>().color = Color.Lerp(Color.white, Color.red, context.Count / 6f);

            Vector2 move = behavior.CalculateMove(agent, context, this);
            move *= driveFactor;
            if (move.sqrMagnitude > squareMaxSpeed) //we square them now so we save resources later.
            {
                move = move.normalized * maxSpeed;
            }
            agent.Move(move);
        }
    }
Пример #30
0
    void Update()
    {
        foreach (FlockAgent agent in agents)
        {
            List <Transform> context = GetNearbyObjects(agent);

            // FOR DEMO ONLY: Changing color based on neighbor count. NOTE: Component note cached, not efficient
            //agent.GetComponentInChildren<SpriteRenderer>().color = Color.Lerp(Color.white, Color.red, context.Count / 6f);

            Vector2 move = behavior.CalculateMove(agent, context, this);
            move *= driveFactor;
            if (move.sqrMagnitude > squareMaxSpeed) // Max speed exceeded
            {
                move = move.normalized * maxSpeed;
            }

            agent.Move(move);
        }
    }