コード例 #1
0
        /// <summary>
        /// Devuelve el valor de dirección calculado por prioridad
        /// </summary>
        /// <returns></returns>
        private Direccion GetPrioridadDireccion()
        {
            Direccion  direccion = new Direccion();
            List <int> gIdList   = new List <int>(grupos.Keys);

            gIdList.Sort();
            foreach (int gid in gIdList)
            {
                direccion = new Direccion();
                foreach (Direccion direccionIndividual in grupos[gid])
                {
                    direccion.lineal  += direccionIndividual.lineal;
                    direccion.angular += direccionIndividual.angular;
                }
                if (direccion.lineal.magnitude > umbralPrioridad ||
                    Mathf.Abs(direccion.angular) > umbralPrioridad)
                {
                    return(direccion);
                }
            }
            return(direccion);
        }
コード例 #2
0
        /// <summary>
        /// En cada parte tardía del tick, hace tareas de corrección numérica (ajustar a los máximos, la combinación etc.
        /// </summary>
        public virtual void LateUpdate()
        {
            if (mezclarPorPrioridad)
            {
                direccion = GetPrioridadDireccion();
                grupos.Clear();
            }
            velocidad += direccion.lineal * Time.deltaTime;
            rotacion  += direccion.angular * Time.deltaTime;

            if (velocidad.magnitude > velocidadMax)
            {
                velocidad.Normalize();
                velocidad = velocidad * velocidadMax;
            }

            if (rotacion > rotacionMax)
            {
                rotacion = rotacionMax;
            }

            if (direccion.angular == 0.0f)
            {
                rotacion = 0.0f;
            }

            if (direccion.lineal.sqrMagnitude == 0.0f)
            {
                velocidad = Vector3.zero;
            }

            // En realidad si se quiere cambiar la orientación lo suyo es hacerlo con un comportamiento, no así:
            transform.LookAt(transform.position + velocidad);

            // Se limpia el steering de cara al próximo tick
            direccion = new Direccion();
        }
コード例 #3
0
        public override Direccion GetDireccion()
        {
            Direccion result = new Direccion();

            if (f.getOnTarget())
            {
                return(result);
            }

            UnityEngine.Vector3 ray = agente.velocidad;
            ray.Normalize();
            ray *= lookAhead;


            UnityEngine.RaycastHit hit;

            //COLLISION
            if (UnityEngine.Physics.Raycast(transform.position, ray, out hit))
            {
                result.lineal = hit.collider.gameObject.transform.position + hit.normal * avoidDistance;
            }
            //result.lineal.y = 0;
            return(result);
        }
コード例 #4
0
 /// <summary>
 /// Establece la dirección por peso
 /// </summary>
 /// <param name="direccion"></param>
 /// <param name="peso"></param>
 public void SetDireccion(Direccion direccion, float peso)
 {
     this.direccion.lineal  += (peso * direccion.lineal);
     this.direccion.angular += (peso * direccion.angular);
 }
コード例 #5
0
 /// <summary>
 /// Establece la dirección tal cual
 /// </summary>
 public void SetDireccion(Direccion direccion)
 {
     this.direccion = direccion;
 }
コード例 #6
0
        public override Direccion GetDireccion()
        {
            Direccion result = new Direccion();

            if (f.getOnTarget())
            {
                return(result);
            }

            Flocking firstTarget = null;

            float shortestTime       = float.MaxValue;
            float firstMinSeparation = 0;
            float firstDistance      = 0;
            float relativeSpeed;
            float timeToCollision;
            float distance;

            UnityEngine.Vector3 relativePos      = UnityEngine.Vector3.zero;
            UnityEngine.Vector3 relativeVel      = UnityEngine.Vector3.zero;
            UnityEngine.Vector3 firstRelativePos = UnityEngine.Vector3.zero;
            UnityEngine.Vector3 firstRelativeVel = UnityEngine.Vector3.zero;

            foreach (Flocking target in FindObjectsOfType <Flocking>())
            {
                if (target != this)
                {
                    // TIME TO COLLISION
                    relativePos     = (target.transform.position - transform.position);
                    relativeVel     = target.GetAgente().velocidad - agente.velocidad;
                    relativeSpeed   = relativeVel.magnitude;
                    timeToCollision = UnityEngine.Vector3.Dot(relativePos, relativeVel) / (relativeSpeed * relativeSpeed);

                    //CHECK IF COLLISION
                    distance = relativePos.magnitude;
                    float minSeparation = distance - relativeSpeed * timeToCollision;
                    if (minSeparation < 2 * radius)
                    {
                        return(result);                            // If not collision, return previous result from class Separation
                    }
                    //CHECK IF SHORTEST
                    if (timeToCollision > 0 && timeToCollision < shortestTime)
                    {
                        shortestTime       = timeToCollision;
                        firstTarget        = target;
                        firstMinSeparation = minSeparation;
                        firstDistance      = distance;
                        firstRelativePos   = relativePos;
                        firstRelativeVel   = relativeVel;
                    }
                }
            }

            //IF NO TARGET, EXIT
            if (!firstTarget)
            {
                return(result);
            }

            //IF CURRENT OR FUTURE COLLISION, STEERING
            if (firstMinSeparation <= 0 || firstDistance < 2 * radius)
            {
                relativePos = firstTarget.transform.position - transform.position;
            }
            else
            {
                relativePos = firstRelativePos + (firstRelativeVel * shortestTime);
            }

            relativePos.Normalize();

            result.lineal  = relativePos * maxAcceleration;
            result.angular = 0;


            return(result);
        }