Noticias

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

IA Camino/Andar random

Iniciado por neiro, Febrero 19, 2017, 01:04:16 AM

Tema anterior - Siguiente tema
Buenas, llevo un par de dias buscando como hacer que haya objetos que se paseen por el mapa aleatoriamente, pero el problema es que algunos objetos se mueven por lo que creo que navegation no lo puedo utilizar ya que a la minima que cambie algo el mapa se queda obsoleto el mapa de navegacion que calcula unity.
 
Basicamente quiero que el objeto se mueva aleatoriamente sin que parezca artificial preferiblemente.

Si quieres que el objeto se mueva y sea realista utiliza NavMeshAgent y si algunos objetos se mueven dirás Ahh pero no puedo hacer el baking o ponerlos static en tiempo de ejecución(eso lo pensé xD) existe una componente llamado Navmesh Obstacle lo que hace es calcular el mesh y ... mejor leelo, nunca lo utilice pero deberia funcionar.
 
https://docs.unity3d.com/es/current/Manual/class-NavMeshObstacle.html
 
 

Podes utilizar el sistema de navigation de unity, navmesh agent para los personajes que se van a mover y navmesh obstacles para los obstáculos que puedan llegar a haber en el escenario, dentro de los navmesh obstacles utiliza carve cuando el obstáculo se va a encontrar de forma estática y desactivalo para los obstáculos con movimiento. 

De todas formas siempre se debe complementar el mismo con scripting, puedes utilizar waypoints alrededor de todo el mapa y que el jugador elija random a cual ir luego, maquinas de estado para tomas de decisiones, etc.

Te recomiendo estos libros para profundizarte en la IA 
https://www.packtpub.com/game-development/unity-4x-game-ai-programming
https://www.packtpub.com/game-development/unity-ai-game-programming-second-edition

Cita de: stick date=1487517270Podes utilizar el sistema de navigation de unity, navmesh agent para los personajes que se van a mover y navmesh obstacles para los obstáculos que puedan llegar a haber en el escenario, dentro de los navmesh obstacles utiliza carve cuando el obstáculo se va a encontrar de forma estática y desactivalo para los obstáculos con movimiento. 

      De todas formas siempre se debe complementar el mismo con scripting, puedes utilizar waypoints alrededor de todo el mapa y que el jugador elija random a cual ir luego, maquinas de estado para tomas de decisiones, etc.

      Te recomiendo estos libros para profundizarte en la IA 
https://www.packtpub.com/game-development/unity-4x-game-ai-programming
https://www.packtpub.com/game-development/unity-ai-game-programming-second-edition
   


 
 
 
 
La cosa es si lso muebles se mueven esos dos sistemas no se quedan obsoletos ? Ej pongo una estanteria en medio y ya se quedaria intentando pasar bugeado porque cuando se hizo el waypoint o el navmesh decia que si se podia, obviamente ya no ? Creo que va así no ?

Febrero 19, 2017, 05:36:49 PM #4 Ultima modificación: Febrero 19, 2017, 05:38:00 PM por stick
Si el destino se setea por el agente no debería haber ningún problema siempre y cuando exista otro camino para llegar ahí. El navmesh agent siempre intenta evitar el obstáculo por más que sea rodeándolo lo más cercano posible. 

Si necesitas hacer mejores comportamientos deberías ver la documentación del navmesh agent para, volver a calcular el camino, resetear el destino, limpiar la ruta actual, etc.
https://docs.unity3d.com/ScriptReference/AI.NavMeshAgent.html

Andar Random: Cada agent tiene su destination, en el momento de asignarla que puede ser de la manera que quieras elegis aleatoriamente entre algunos nodos o posiciones que tengas, que pueden ir actualizandose dinamicamente o no.
 
No se, algo asi se me ocurre:
 

public Transform refnodo1;
public bool dinamico1 = false;
public Transform refnodo2;
public bool dinamico2 = false;
public Transform refnodo3;
public bool dinamico3 = false;
 
//...
//Update
//actualizar arreglo o lista de nodos
for(todos los nodos "i")
{
if(nodo "i" es dinamico?)
   nodo "i" = refnodo "i";
}
 

if(se llego al nodo actual?)
ElegirNodoActual();
else
Ir hacia Nodo Actual();
//...
//elegir nodo aleatoriamente
void ElegirNodoActual()
{
nodoActual = nodo[ Random.Range(listaNodos[0], listaNodos.Count) ];
}

 
LO mejor es usar estructuras, bien prolijo para cada nodo que tenga distintas propiedades (estatico dinamico, posicion, etc)
 
IA/Camino:
 
Un NavMesh Agent es lo mismo que tener un charactercontroller (sin tanto sistemas de deteccion de colision). El agente tiene su nuevo mundo que el el navmesh. Para ir del punto A al B siempre tenes un camino mas corto basado en el calculos de muchisimos nodos , lo que se llama pathfinding. Cuando en la escena algo tiene el componente Obstacle o NavMeshObstacle (no recuerdo bien) lo que pasa es que a la hora de hacer el tipico pathfinding de siempre sobre un mundo estatico ahora se tiene en cuenta en el calculo a dicho objeto dinamico, entonces el camino resultante no es el mismo que si este no estuviera. Por supuesto meter cientos de objetos con el NavMeshObstacle no te va a salir gratis.

Podrias crear un sistema de waypoints:
 

 
La estructura que ves de puntos y lineas es normalmente llamada Grafo y es frecuentemente utilizada en IA. Desde 1 solo puedes ir a  [2 , 3], desde 2 a [1, 3, 5] desde 3 a [2, 4] desde 4 a [3, 5] y desde 5 a [2, 4]. Estos waypoints puedes generarlos manualmente y programar la lista de WayPoints adyacentes (A los que puedo ir) es simple tambien. Asegurate de que cuando el mapa no este modificado, 2 Waypoints solo estan conectados si pueden verse (Como en la imagen). Una vez hecho esto podrias generar rutas, por ejemplo, empezando en 1:
 
¿Desde 1 a que WPs puedo ir? - al 2 -> RUTA: 1, 2
 
¿Desde 2 a que WPs puedo ir? - al 3, 5 -> RUTA: 1, 2, 5 (Por ejemplo) , etc, etc
 
De esta forma estas generando rutas aleatorias en las que el personaje puede andar en linea recta, mayor numero de WPs = mas aleatoriedad y trayectorias menos rectas.
 
¿Como solucionar el problema de los muebles?
 
Simplemente al crear las rutas haces un RayCast al WP al que te tocaria ir, al crear los WPs la condicion que impusimos es que se pudiera ir en linea recta, si resulta que ahora no se puede por que el RayCast se choca con algo significa que ahora hay un obstaculo asique buscamos otra ruta aleatoria.
 

 
Ejemplo: Ruta generada aleatoriamente: 1 - 2 - 3 - 4 - 5 , Raycast de 1 a 2 => OK, Raycast de 2 a 3 => ERROR , genero otra ruta aleatoria 1 - 2 - 5, COMPRUEBO => TODO OK => Me muevo
 
Hacer esto a gran escala imaginate 100 WPs en esa imagen es lo que denominamos PathFinding podrias programarte tu un PathFinding mas simplificado pero dado que no sabias como afrontar el problema y tal no creo que sea lo mas apropiado. El sistema de WayPoints es lo mas sencillo si no te funciona lo que te han dicho los compañeros y puede dar un resultado decente.
 
 
 
Un saludo.
 
 

Visita http://www.programacionwh.com encontraras tutoriales y muchas cosas .


Tambien puedes visitar mi canal de YouTube https://www.youtube.com/channel/UClSCTn0wPN1iFjED0yaoJUA



Cita de: ProgramacionWH date=1487544257Podrias crear un sistema de waypoints:
   
   
      
   
   
      La estructura que ves de puntos y lineas es normalmente llamada Grafo y es frecuentemente utilizada en IA. Desde 1 solo puedes ir a  [2 , 3], desde 2 a [1, 3, 5] desde 3 a [2, 4] desde 4 a [3, 5] y desde 5 a [2, 4]. Estos waypoints puedes generarlos manualmente y programar la lista de WayPoints adyacentes (A los que puedo ir) es simple tambien. Asegurate de que cuando el mapa no este modificado, 2 Waypoints solo estan conectados si pueden verse (Como en la imagen). Una vez hecho esto podrias generar rutas, por ejemplo, empezando en 1:
   
   
      ¿Desde 1 a que WPs puedo ir? - al 2 -> RUTA: 1, 2
   
   
      ¿Desde 2 a que WPs puedo ir? - al 3, 5 -> RUTA: 1, 2, 5 (Por ejemplo) , etc, etc
   
   
      De esta forma estas generando rutas aleatorias en las que el personaje puede andar en linea recta, mayor numero de WPs = mas aleatoriedad y trayectorias menos rectas.
   
   
      ¿Como solucionar el problema de los muebles?
   
   
      Simplemente al crear las rutas haces un RayCast al WP al que te tocaria ir, al crear los WPs la condicion que impusimos es que se pudiera ir en linea recta, si resulta que ahora no se puede por que el RayCast se choca con algo significa que ahora hay un obstaculo asique buscamos otra ruta aleatoria.
   
   
      
   
   
      Ejemplo: Ruta generada aleatoriamente: 1 - 2 - 3 - 4 - 5 , Raycast de 1 a 2 => OK, Raycast de 2 a 3 => ERROR , genero otra ruta aleatoria 1 - 2 - 5, COMPRUEBO => TODO OK => Me muevo
   
   
      Hacer esto a gran escala imaginate 100 WPs en esa imagen es lo que denominamos PathFinding podrias programarte tu un PathFinding mas simplificado pero dado que no sabias como afrontar el problema y tal no creo que sea lo mas apropiado. El sistema de WayPoints es lo mas sencillo si no te funciona lo que te han dicho los compañeros y puede dar un resultado decente.
   
   
       
   
   
      Un saludo.
   
   
       
   


Gracias creo que probare esta , si me pudieras decir como hacerlo mas fácil obviamente te lo agradecería. 
 
 
 
Cita de: lightbug date=1487535765Andar Random: Cada agent tiene su destination, en el momento de asignarla que puede ser de la manera que quieras elegis aleatoriamente entre algunos nodos o posiciones que tengas, que pueden ir actualizandose dinamicamente o no.
   
   
      No se, algo asi se me ocurre:
   
   

public Transform refnodo1;
public bool dinamico1 = false;
public Transform refnodo2;
public bool dinamico2 = false;
public Transform refnodo3;
public bool dinamico3 = false;
 
//...
//Update
//actualizar arreglo o lista de nodos
for(todos los nodos "i")
{
if(nodo "i" es dinamico?)
   nodo "i" = refnodo "i";
}
 

if(se llego al nodo actual?)
ElegirNodoActual();
else
Ir hacia Nodo Actual();
//...
//elegir nodo aleatoriamente
void ElegirNodoActual()
{
nodoActual = nodo[ Random.Range(listaNodos[0], listaNodos.Count) ];
}

   
      LO mejor es usar estructuras, bien prolijo para cada nodo que tenga distintas propiedades (estatico dinamico, posicion, etc)
   
   
      IA/Camino:
   
   
      Un NavMesh Agent es lo mismo que tener un charactercontroller (sin tanto sistemas de deteccion de colision). El agente tiene su nuevo mundo que el el navmesh. Para ir del punto A al B siempre tenes un camino mas corto basado en el calculos de muchisimos nodos , lo que se llama pathfinding. Cuando en la escena algo tiene el componente Obstacle o NavMeshObstacle (no recuerdo bien) lo que pasa es que a la hora de hacer el tipico pathfinding de siempre sobre un mundo estatico ahora se tiene en cuenta en el calculo a dicho objeto dinamico, entonces el camino resultante no es el mismo que si este no estuviera. Por supuesto meter cientos de objetos con el NavMeshObstacle no te va a salir gratis.
   


Ya lo probé lo que ocurría es que iba pero si hay algo en medio se quedaba ahí bugeado.

Cita de: neiro date=1488040599Ya lo probé lo que ocurría es que iba pero si hay algo en medio se quedaba ahí bugeado.
   


Hola neiro, eso de que se quedaba bugueado no puede deberse a la eleccion de los nodos, jamas, vos seteas el destino y no importa lo que "haya en el medio", Si existe algo dinamico que te buguea todo es porque no estara seteado como obstaculo, aunque al nav mesh agent  no le importa pasa por arriba lo que sea.

Cita de: lightbug date=1488040965Hola neiro, eso de que se quedaba bugueado no puede deberse a la eleccion de los nodos, jamas, vos seteas el destino y no importa lo que "haya en el medio", Si existe algo dinamico que te buguea todo es porque no estara seteado como obstaculo, aunque al nav mesh agent  no le importa pasa por arriba lo que sea.
   


okay, yo a lo que me refieria y lo que entendi es que elegia x destino aleatorio e iba a por el directamente solo eso entendi

Cita de: neiro date=1488041058okay, yo a lo que me refieria y lo que entendi es que elegia x destino aleatorio e iba a por el directamente solo eso entendi
   


Ah claro, como un Translate decis? esa es la ventaja del navmesh, y como "desventaja" (entre archi-super comillas) es que estas limitado a la navmesh, por eso te puse lo siguiente:
 
Cita de: neiro date=1488040599Para ir del punto A al B siempre tenes un camino mas corto basado en el calculos de muchisimos nodos , lo que se llama pathfinding
   


Yo habia implementado algo como lo que hizo @ProgramacionWH en la epoca que el navmesh venia en pro solamente (hace un tiempito), eran arreglos de nodos, en los que uno podia conectarse con algunos otros, y te digo que esta muy bueno para aprender, claro que tenes mas probabilidades de tener un comportamiento erratico que dependera del tipo de escena y personaje, pero cuando te sale podes jugar mucho mas con el comportamiento del gameObject.
 
Un ejemplo, tenia un monstruo que me ***guia, si me ocultaba el monstruo seguia hasta el ultimo nodo que me vio, luego elegia al azar dos nodos mas (no repetitivos hacia atras logico) si no me encontraba seguia patruyando como siempre. Con nav mesh te calcula todo a la perfeccion pero va derecho hasta el destino, no tiene eso de "real", sino fijate en la mayoria de los juegos de terror, salvo en Alien Isolation que es la cumbre de la IA

Cita de: lightbug date=1488040965Hola neiro, eso de que se quedaba bugueado no puede deberse a la eleccion de los nodos, jamas, vos seteas el destino y no importa lo que "haya en el medio", Si existe algo dinamico que te buguea todo es porque no estara seteado como obstaculo, aunque al nav mesh agent  no le importa pasa por arriba lo que sea.
   


podria crear un script en el que vaya a un mueble que busque en el array pero mi problema es que tendria que atravesar los demas muebles e ir a por el elegido aleatoriamente. No se como hacer que evite los muebles.
 
Cita de: lightbug date=1488042286Ah claro, como un Translate decis? esa es la ventaja del navmesh, y como "desventaja" (entre archi-super comillas) es que estas limitado a la navmesh, por eso te puse lo siguiente:
   
   
      Yo habia implementado algo como lo que hizo http://www.unityspain.com/profile/27156-programacionwh/?do=hovercard" data-mentionid="27156" href="<___base_url___>/profile/27156-programacionwh/" id="ips_uid_6058_6" rel="" style="">@ProgramacionWH en la epoca que el navmesh venia en pro solamente (hace un tiempito), eran arreglos de nodos, en los que uno podia conectarse con algunos otros, y te digo que esta muy bueno para aprender, claro que tenes mas probabilidades de tener un comportamiento erratico que dependera del tipo de escena y personaje, pero cuando te sale podes jugar mucho mas con el comportamiento del gameObject.
   
   
      Un ejemplo, tenia un monstruo que me ***guia, si me ocultaba el monstruo seguia hasta el ultimo nodo que me vio, luego elegia al azar dos nodos mas (no repetitivos hacia atras logico) si no me encontraba seguia patruyando como siempre. Con nav mesh te calcula todo a la perfeccion pero va derecho hasta el destino, no tiene eso de "real", sino fijate en la mayoria de los juegos de terror, salvo en Alien Isolation que es la cumbre de la IA


Utilizare esto para que calcule a tiempo real el camino para ir al objeto http://arongranberg.com/astar/

Etiquetas: