/// <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); }
/// <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(); }
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); }
/// <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); }
/// <summary> /// Establece la dirección tal cual /// </summary> public void SetDireccion(Direccion direccion) { this.direccion = direccion; }
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); }