Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Javierhakerone en Junio 22, 2018, 08:19:52 PM

Título: Dudas: IA choca, y ***guir
Publicado por: Javierhakerone en Junio 22, 2018, 08:19:52 PM
Tengo este Script de IA pero hay unos detalles que me gustaría resolver
 


    //public float speed, distancia;
    float tiempo, y, distancia;
    public bool Tgirar, cambio = true;
    public int estado = 1;
    public NavMeshAgent agent;
    public Transform Guarida;
    float RadioCambio = 13f;
   
   
    [Header("Estado")]
    public bool Vagar;
    public bool Atacar;
    public bool ***r;
    void start()
    {
       
    }
    void Update()
    {
        tiempo += 1 * Time.deltaTime;
        if (estado == 1)
        {
            cambio = true;
            agent.enabled = false;
            Vagar = true;
            Atacar = false;
            ***r = false;
        }
        if (estado == 2)
        {
            cambio = false;
            agent.enabled = true;
            Vagar = false;
            Atacar = true;
            ***r = false;
        }
        if (estado == 3)
        {
            cambio = false;
            agent.enabled = true;
            Vagar = false;
            Atacar = false;
            ***r = true;
        }
        if (Vagar == true)
        {
            VagarMode();
        }
        if (Atacar == true)
        {
            AtacarMode();
            Debug.DrawLine(transform.position, GameObject.FindGameObjectWithTag("Player").transform.position, Color.red);
        }
        if (***r == true)
        {
            ***rMode();
            Debug.DrawLine(transform.position, Guarida.transform.position, Color.green);
        }
        if (Vector3.Distance(GameObject.FindGameObjectWithTag("Player").transform.position, transform.position) <= RadioCambio && cambio == true)
        {
            CambiarEstado();
        }
        distancia = Vector3.Distance(GameObject.FindGameObjectWithTag("Player").transform.position, transform.position);
    }
     
    void CambiarEstado()
    {
        estado = Random.Range(1, 4);
       
    }
    void VagarMode()
    {
        transform.Translate(Vector3.forward * Time.deltaTime);
        transform.Rotate(new Vector3(0, y, 0));
        if (tiempo >= Random.Range(3, 7))
        {
            y = Random.Range(-4, 5);
            tiempo = 0;
            Tgirar = true;
        }
        if (Tgirar == true)
        {
            if (tiempo >= Random.Range(1, 3))
            {
                y = 0;
                Tgirar = false;
            }
        }
    }
    void AtacarMode()
    {
        if (distancia >= 3)
        {
            agent.SetDestination(GameObject.FindGameObjectWithTag("Player").transform.position);
           
        }
        if (Vector3.Distance(GameObject.FindGameObjectWithTag("Player").transform.position, transform.position) > 35)
        {
            estado = 1;
        }
    }
    void ***rMode()
    {
        agent.SetDestination(Guarida.position);
        float distanciaGuarida = Vector3.Distance(transform.position, Guarida.transform.position);
        if (distanciaGuarida <= 5)
        {
            if (tiempo >= Random.Range(100, 200))
            {
                estado = 1;
            }
        }
    }

 
cuando el NPC esta en modo atacar persigue al jugador bn pero si el jugador queda quieto o este lo alcanza el npc queda chocando con el jugador entonces...
 
1- como hago para que lo persiga hasta cierta distancia pero que se mantenga siempre en cara al jugador osea viendolo por asi decirlo...
 
2- como hago para que nada choque con nada, osea quiero que yo pueda mover la nave por encima de la de los npc, ya probe quitando los collider pero igual colisionan...
Título: Dudas: IA choca, y ***guir
Publicado por: pioj en Junio 23, 2018, 12:08:38 PM
Esto es una consulta, así que te lo he separado en un tema y te lo he metido en este foro. Esta sección de foros de Unity están para consultas específicas (no preguntas teóricas) ...
Título: Dudas: IA choca, y ***guir
Publicado por: francoe1 en Junio 23, 2018, 02:33:49 PM
Deberías analizar FSM para lograr lo que estas buscando de manera más "simple" -
 
Te recomiendo este 
 


   
eature=oembed" width="480">

 
 
Título: Dudas: IA choca, y ***guir
Publicado por: lightbug en Junio 23, 2018, 04:32:21 PM
O si no querés usar una FSM propiamente dicha, quizás para un nivel base quizás sea algo complicado, más simple usa las FSM "Lite Edition" que son algunos enums (estados) con un gran switch selector  ... tiene mil fallas si te ponés a estudiarlas bien pero bueno, para lo básico y practico funcionan (que es lo primordial), tenés el estado actual y el anterior para poder ejecutar código al ingresar en cada estado y te queda algo simple, que funca y sencillo de editar.
 

enum AIState{ Idle, Walking, Chasing, Attacking , .... }
AIState currentState;
AIState previousState;
 
void Update(){   //Un update , o FixedUpdate o una corrutina
bool change = previousState != currentState;
    switch()
    {
        case AIState.Idle:
      if(change)
      {
         //logica de ingreso al estado "Idle"
         previousState = currentState;
      }
      //logica cuadro a cuadro del estado "Idle"
           break;
        case AIState.Walking:
      if(change)
      {
         //logica de ingreso al estado "Walking"
         previousState = currentState;
      }
      
      //logica cuadro a cuadro del estado "Walking"
           break;
        case .....
    }
}

 
Esas bools que tenés ya te voy diciendo de tirarlas a la basura, no le dediques ni un minuto más, es decir tomá lo que hiciste pero implementá algo relacionado a una maquina de estados de la forma que sea, te va a quitar muchos dolores de cabeza y vas a tener todo organizado.
 
Cita de: Javierhakerone date=15296915921- como hago para que lo persiga hasta cierta distancia pero que se mantenga siempre en cara al jugador osea viendolo por asi decirlo...
   
   
      2- como hago para que nada choque con nada, osea quiero que yo pueda mover la nave por encima de la de los npc, ya probe quitando los collider pero igual colisionan...
   


1 - algebra vectorial y un if?
 
2 - que es la nave? el player, un NPC? ... collider y navmeshAgent son dos mundos apartes, no interactúan entre sí, cada agent se limita a su navMesh, y cada collider los manejan las físicas.
 
Aca tenés el manual si tenés dudas:
 
https://docs.unity3d.com/Manual/class-NavMeshAgent.html (https://docs.unity3d.com/Manual/class-NavMeshAgent.html)
Título: Dudas: IA choca, y ***guir
Publicado por: Javierhakerone en Junio 23, 2018, 07:43:28 PM
Cita de: pioj date=1529748518Esto es una consulta, así que te lo he separado en un tema y te lo he metido en este foro. Esta sección de foros de Unity están para consultas específicas (no preguntas teóricas) ...
   


Gracias @pioj perdona si aun estoy algo desordenado aun poco a poco me voy estableciendo con que va donde correctamente...
 
 
 
Cita de: lightbug date=1529764341O si no querés usar una FSM propiamente dicha, quizás para un nivel base quizás sea algo complicado, más simple usa las FSM "Lite Edition" que son algunos enums (estados) con un gran switch selector  ... tiene mil fallas si te ponés a estudiarlas bien pero bueno, para lo básico y practico funcionan (que es lo primordial), tenés el estado actual y el anterior para poder ejecutar código al ingresar en cada estado y te queda algo simple, que funca y sencillo de editar.
   
   

enum AIState{ Idle, Walking, Chasing, Attacking , .... }
AIState currentState;
AIState previousState;
 
void Update(){   //Un update , o FixedUpdate o una corrutina
bool change = previousState != currentState;
    switch()
    {
        case AIState.Idle:
      if(change)
      {
         //logica de ingreso al estado "Idle"
         previousState = currentState;
      }
      //logica cuadro a cuadro del estado "Idle"
           break;
        case AIState.Walking:
      if(change)
      {
         //logica de ingreso al estado "Walking"
         previousState = currentState;
      }
      
      //logica cuadro a cuadro del estado "Walking"
           break;
        case .....
    }
}



Hola @lightbug la verdad de momento no se que significa FSM así no obviare eso hasta estar en ksa y poder ponerme a investigar eso...

y creo entiendo que para que todo esté mas ordenado use una estructura switch para mi código y los estado del NPC correcto? viéndolo bien creo si tienes razon en eso, lo que no entendí bien fue lo de previousState y currentState sobro el como ingrese al los diferentes estados... creo lo correcto seria usar un case para cada estado? con su correspondiente if obviamente...
 
 
 
Cita de: lightbug date=15297643411 - algebra vectorial y un if?
   


perdona si aquí sea algo facil pero lo mas que logre o se me ocurrió es que se cancele el Agent.Destination... si la distancia es menor a n y se reactive si es mayor pero estando en el rango de cercanía el NPC no queda como que la nave (el player) fuera un objetivo no queda señalando ni observando...
 
 
 
Cita de: lightbug date=15297643412 - que es la nave? el player, un NPC? ... collider y navmeshAgent son dos mundos apartes, no interactúan entre sí, cada agent se limita a su navMesh, y cada collider los manejan las físicas.
   


si, la nave es el player, lo demás son NPC... leo el manual pero no veo como hacer para con los Agent no colisionen entre ellos, por ejemplo... el npc esta vagando por ahí y yo paso con el player por su posición y hay una colisión la cual trato de evitar, quiero que se superponga que pase por encima noc la verdad... no quiero que haya colisiones mas que con los disparos (lo cual no he echo) pero noc como hacerlo...
 
Cita de: francoe1 date=1529757229Deberías analizar FSM para lograr lo que estas buscando de manera más "simple" -
   
   
      Te recomiendo este 
   
   

      
         
eature=oembed" width="480">
      
   
   
       
   


Muchas Gracias por tratar de ayudar amigo, pero no se casi nada de ingles jaja se que es el colmo pero peco a poco le ire entrando
Título: Dudas: IA choca, y ***guir
Publicado por: lightbug en Junio 23, 2018, 08:30:57 PM
Cita de: Javierhakerone date=1529775808Hola @lightbug la verdad de momento no se que significa FSM así no obviare eso hasta estar en ksa y poder ponerme a investigar eso...

       
   


FSM = Finite State Machine, una maquina de estados, tenés N estados y M transiciones entre estados, igual al Animator, si lo conocés es eso más o menos.
 
En el código ejemplo que puse podés poner dentro de por ej Walk un "if(seVeElPlayer) state = Chase" por decir algo, eso corresponde a una transición entre Walk y Chase, en realidad se utilizan cosas algo más complejas, con el proposito de reutilizar funcionalidades combinar FSM's y hacerlas lo más general posible reutilizando mismo código ya que el principio es el mismo para la aplicación que sea, vos en teoría introducirías código a esos estados y determinarías las condiciones para pasar de uno a otro.
 
Por Ej se podría usar  FSM una para animación (animator hace esto), otra para AI, otra para los estados de un player, quizás para este último caso una para el movimiento (andar, saltar, correr, etc) y una para la pose (normal, agachado, cuerpo tierra , etc), otra para el tipo de armas (sin arma, pistola, bazooka, etc), entonces podés combinar saltar + pose normal + bazooka, cada parte se encarga de lo suyo.
 



   
      ... y creo entiendo que para que todo esté mas ordenado use una estructura switch para mi código y los estado del NPC correcto? viéndolo bien creo si tienes razon en eso, lo que no entendí bien fue lo de previousState y currentState sobro el como ingrese al los diferentes estados... creo lo correcto seria usar un case para cada estado? con su correspondiente if obviamente...
   

[/quote]
 
Claro, el estado corresponde a cada enum y en base al estado actual te metés en los diferentes "case". Lo de previous vs current es para poder detectar un cambio, simplemente porque quizás cuando te metés en ponele "saltando" querés aplicar una fuerza una sola vez, entonces lo hacés en la parte del "Enter" del case , el if(change) del ejemplo. Es muy común en FSM detectar por lo menos Enter y Update, pensalo como Start y Update, parecido.
 
Cita de: Javierhakerone date=1529775808se me ocurrió es que se cancele el Agent.Destination... si la distancia es menor a n y se reactive si es mayor pero estando en el rango de cercanía el NPC no queda como que la nave (el player) fuera un objetivo no queda señalando ni observando...
   


y si cancelás (supongo ponés a Null) el target a quién va a mirar? ... a nadie, podés decirle que la velocidad sea cero para que se detenga, y para el tema de que lo mira (aunque creo que ya debería estar solucionado) podés imponer lo siguiente:
 

transform.LookAt (target.position, Vector3.up);

 
mira a target, luego (como plus) alinea el up del objeto con Vector3.up (en este caso funciona en 3D), podrías tambien imponer un angulo, hay varias formas. Es necesario alinear ya que si el NPC fuera de 4 m de alto y el player de 1 m cuando se acerca se inclina, con esto queda más duro que little Richard en los 70s xD
 
Cita de: Javierhakerone date=1529775808si, la nave es el player, lo demás son NPC... leo el manual pero no veo como hacer para con los Agent no colisionen entre ellos, por ejemplo... el npc esta vagando por ahí y yo paso con el player por su posición y hay una colisión la cual trato de evitar, quiero que se superponga que pase por encima noc la verdad... no quiero que haya colisiones mas que con los disparos (lo cual no he echo) pero noc como hacerlo...
   


No entiendo todavía, porque ahí pones "no veo como hacer para con los Agent no colisionen entre ellos" pero más abajo ponés "el npc esta vagando por ahí y yo paso con el player por su posición y hay una colisión la cual trato de evitar" , no se si querés NPC vs NPC o Player vs NPC, son dos mundos distintos, es más no se que tipo es tu player (kinemático, rigidbody dinámico, un navMesh ?).
 
En el manual tenés la opción de dar prioridad a los agents pero vos querés que se ignoren todos,  mmm que todos se ignoren a la vez no se la verdad como hacerlo, probá jugar con las prioridadesm, quizás si están todos en alto , o en bajo o que se yo
 
... y bueno después tenés el chanchuyo , hacés tu Navmesh con un radio considerable (que no quede pegada a las paredes como antes sino algo más alejada, quizás cerca de 0.5 a 1, quizás pensando en un pasillo real, en sí depende del nivel), y a cada agente le das un radio muuuy chiquito 0.001f o quizás menos. Practicamente parece que se solapan pero en realidad son varios hyper escualidos tratando de pasar por una misma area, visualmente se solapan pero en realidad se siguen esquivando, el jugador no lo ve a esto... es bastante algo feo pero que funciona funciona.