Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

alguien sabe de pathfinder que varios sigan el linea?

Iniciado por jeico008, Junio 17, 2015, 03:25:52 AM

Tema anterior - Siguiente tema
Junio 17, 2015, 03:25:52 AM Ultima modificación: Junio 17, 2015, 03:27:07 AM por jeico008
quiero saber si hay una forma de agrupar varios agentes que sigan a un objetivo pero todos se alinee en fila hasta llegar a dicho punto o seguir a alguien aparte, yo lo hice pero a veces se vuelven locos, lo hice en unity 5 y presiona espacio para llamar a los peces pero solo si estan cerca
 
https://dl.dropboxusercontent.com/u/51941617/pecesweb/peces2%20web.html" rel="external nofollow">https://dl.dropboxusercontent.com/u/51941617/pecesweb/peces2%20web.html

No entiendo bien como lo has programado, mi idea para resolver este problema seria el Siguiente.
 
crear una Lista de Agentes y luego en orden descendente asignar como target al anterior y el primero que tenga como target al Player! y luego de forma ascendente vas desparentando, para que cuando cada uno va llegando el siguiente empieza a seguir al Player.
 
Te lo explico mejor con Código, por que realmente no se como explicarlo y que se entienda, xD

public class Francoe1 : MonoBehaviour
{
public List<GameObject> Agents = new List<GameObject>();
void Seguir()
{
   //Tomar todos los Objecto sercanos con Agente y Agregarlos a la Lista.
   Agents = GameObject.FindObjectsOfType<NavAgent>();//Esta linea es imaginaria, no estoy en Unity en este momento.
   //Luego Asiganar a cada Agente su agente anterior de la lista
   GameObject LastAgent; = Player;//Que esta variable inicie con Player.
   foreach(NavAgent currentAgent in Agents)
   {
      NavAgent.target = LastAgent;//Asiganamos el objeto actual con la Variable LastAgent y luego LastAgent pasa a ser el Objeto actual.
      LastAgent = currentAgent;
   }
}   
}

Es un Codigo bastante resumido y mal escrito, pero si sigues la idea te va a funcionar, de echo ya lo plante en un proyecto con una problematica similar y con HashList funcionaba genial con mas de 300 Agentes en tiempo real!

Pues esa es la misma idea que me plantee pero le hace falta algo, y en el caso que uno cambie la direccionse vuelven locos a veces los seguidores, este es mi codigo

function AlinearPeces(){
var min : float = 999999;
var cont : int = 0;
var rep : boolean;
var pos : int;
var i : int;
var s1 : NavMeshAgent;
var s2 : NavMeshAgent;   

//ORDENAMOS EL ARRAY POR LA DISTANCIA QUE HAY HASTA EL PERSONAJE
do{
   rep = false;
   for (i = 0; i < seguidores.length-1; i++){
      s1 = seguidores[i+1];
      s2 = seguidores;
      if (s1.remainingDistance < s2.remainingDistance){         
         seguidores[i+1] = s2;         
         seguidores =  s1;
         rep = true;
      }
   }
}while(rep == true);
//BUSCAMOS EL PRIMERO QUE ESTE MENOS ALEJADO Y ANOTAMOS SU POSICION
for (i = 0; i < seguidores.length; i++){
   s1 = seguidores;
   if (s1.remainingDistance > 0.5){
      pos = i+1;
      s1.transform.gameObject.SendMessage("SigueA", transform);
      break;
   }
}
//EL RESTO DE LOS QUE ESTAN MAS ALEJADOS SEGUIRA AL SIGUIENTE MAS CERCANO
for (i = pos; i < seguidores.length; i++){
   if (pos > 0){
      s1 = seguidores;
      s2 = seguidores[i-1];
      s1.transform.gameObject.SendMessage("SigueA", s2.transform);
   }
}
}

pero almacenalos en una Lista entonces tenes un control mas comodo sobre los agentes!

Y eso no lo hace el array? pero en tu codigo no veo que los ordene por distancia hacia el objetivo


osea una lista no es un array? el codigo que medio tiene logica pero veo que al empezar como se ordena por la distancia hacia el objetivo asi como hice yo

Si, en si es lo mismo, pero con listas se trabaja mucho mejor, mi pregunta es para que queres implementar esta funcion?

quiero para mi juego de un marciano que por tal motivo cayo a las profundidades del mar y ayuda a los peces a su destino, evitando tiburones, pulpos barracudas etc.
entonce asi como puse en el enlace quiero que los peces sigan al marciano, pero a veces se vuelven locos, lo otro estaba pensando hacer un join para que se mantenga unido pero en orden empezando por los mas cercanos

Tratare de ayudarte un poco mas.
 
Primero necesitas crear un Agente para cada uno de los Peces.

public class Agente : MonoBehaviour
{
    //Ahora creamos las variables necesarias.
    private Agente Target;
    public Transform SetTarget{set{Target = value;}}
    private NavMeshAgent agent{get{return GetComponent<NavMeshAgent>();}}
    private bool ObjetiveComplete{get{return agent.DestineOK();}}
    //Ahora nuestro metodo.
    public void Run()
    {
       if(Target!= null)agent.Destine(Target); //Esto es un Codigo de referencia, no se si funciona o los nombres estan correctos por que lo estoy haciendo directamente desde el foro sin testear ni nada.
    }
}

Ahora, que ya tenes todos los peces con ese componente asignado creamos nuestro Controlador.

public class ControlAgent : MonoBehaviour
{
      //Creas la lista de Agentes
      public List<Agente> agentes = new List<Agente>();
      void Update()
      {
         foreach(Agente a in agentes)
         {
            if(!a.ObjetiveComplete) a.Run(); else agentes.Remove(a);
         }
      }
      
      void PonerEnFila()
      {
//Usa tu algoritmo para poner los mas cerca primeros o como quieras y luego lo vas añadiendo a la lista...
      }
}

Lo que quiero explicarte es que cada agente se maneje por separado y que tengas un controlador de asignaciones de tareas para cada uno, por el momento solo podes dar una tarea, seguir en orden a sus objetivos..
 
Espero te sirvas y lo entiendas! un Abrazoo


Junio 19, 2015, 08:00:02 AM #11 Ultima modificación: Junio 19, 2015, 01:56:13 PM por jeico008
listo ya lo solucione, cada pez tendra una variable agente aparte del que esta siguiendo y usaran la funcion Esperar
para seguir al otro, y cuando tengan una nueva posicion a seguir hara el codigo que se ha hecho pero en orden van a esperar
osea el primero 0.2s, el segundo 0.4s, el tercero 0.6s y asi sucesivamente. y actualize el enlace:
https://dl.dropboxusercontent.com/u/51941617/pecesweb/peces2%20web.html" rel="external nofollow">https://dl.dropboxusercontent.com/u/51941617/pecesweb/peces2%20web.html

function Esperar(nvot : float){   
   yield WaitForSeconds (nvot);
   agente.path =  agente2.path;
}

antes cuando no llegaban a la meta y cambiaban de posicion destino los ultimos se quedaban y no seguian, ahora si trabajan bien.
gracias francoe1 por la ayuda.

Hay un plugin gratuito muy potente para la IA en Unity donde tienes pathfinding, patrolroutes, waypoints y mucho más. Está en:http://rivaltheory.com/rain/features/" rel="external nofollow">http://rivaltheory.com/rain/features/ 
Hay un plugin gratuito muy potente para la IA en Unity donde tienes pathfinding, patrolroutes, waypoints y mucho más. Está en:http://rivaltheory.com/rain/features/" rel="external nofollow">http://rivaltheory.com/rain/features/ 

Etiquetas: