Noticias

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

Enemigo tiene que volver a una posición almacenada en variable

Iniciado por Wazabee, Agosto 30, 2017, 09:22:16 AM

Tema anterior - Siguiente tema
Hola a todos,
 
Tengo un pequeño problema con un enemigo. Por ahora, en el escenario, sólo tengo un enemigo que, cuando me acerco a una cierta distancia, me persigue y me ataca. El problema que tengo es que, cuando deja de detectarme necesito que vuelva a su posición inicial almacenada en una variable y no sé cómo hacerlo. Llevo varios dias dándole vueltas al tema y no hay manera de encontrar la sentencia adecuada y todo lo que consigo es que, cuando deja de "verme", siga andando hacia mí y eso no me interesa... Adjunto código a ver si me podéis ayudar:
 

var target : Transform;
var initpos : Vector3;
var anim : Animator;
var SeeU : boolean = false;
var attackanim : boolean = false;
//var notSee : boolean = false;
 
function Start () {
    initpos = transform.position;
    anim = GetComponent.<Animator>();

}
function Update () {
    if (transform.position.y > target.position.y -0.5f && transform.position.y < target.position.y + 0.5f){
        // var pos = transform.position - target.position;  
        var pos = target.position - transform.position;    
        SeeU = true;                                        
        if (Vector3.Distance(transform.position, target.transform.position)<12 && Vector3.Distance (transform.position, target.transform.position)>1 && SeeU == true){
            var rot = Quaternion.LookRotation (pos, Vector3.up);
            if (SeeU == true){
                anim.SetTrigger ("seeU");
                transform.rotation = Quaternion.Slerp (transform.rotation, rot, 2*Time.deltaTime);
                transform.Translate (Vector3.forward * Time.deltaTime * 0.3);
                print ("Te estoy viendo");
            }
        }
        else if (Vector3.Distance (transform.position, target.transform.position)<=1) {
            var rot2 = Quaternion.LookRotation (pos, Vector3.up);
            transform.rotation = Quaternion.Slerp (transform.rotation, rot2, 2*Time.deltaTime);
            anim.SetTrigger ("attack");
        }      
        else {
           
            print ("no te veo");
          //AQUI DEBERÍA IR LA SENTENCIA QUE HACE QUE EL ENEMIGO VUELVA A SU SITIO, PERO NO DOY CON ELLA...
           
        }
    }

 
Muchas gracias
 
Salu2!

Estás haciendo una IA demasiado básica, si es lo que necesitas te ayudaré pero creo que es chapucera. Unity trae el navmeshagent, es muy simple de utilizar y te será más fácil que todo lo que has hecho, mediante funciones y parámetros puedes crear una IA totalmente funcional, que a diferencia de lo que estás haciendo, no atravesará o chocará con las paredes sino que buscara la manera de evitarla. 
 


   
eature=oembed" width="480">

 
 

Ugh...Gracias, pero eso de chapucera...Estoy aprendiendo a codear en JavaScript y a mi me parece muy complicado. Hago lo que puedo....Por el momento he podido solucionarlo, pero tomo nota de tu consejo. Esta noche le echo un ojo al video y, si necesito ayuda te comento!!
 
Gracias!

Agosto 30, 2017, 09:49:39 PM #3 Ultima modificación: Agosto 30, 2017, 09:50:15 PM por lightbug
Cita de: Wazabee date=1504077736Hola a todos,
   
   
      Tengo un pequeño problema con un enemigo. Por ahora, en el escenario, sólo tengo un enemigo que, cuando me acerco a una cierta distancia, me persigue y me ataca. El problema que tengo es que, cuando deja de detectarme necesito que vuelva a su posición inicial almacenada en una variable y no sé cómo hacerlo. Llevo varios dias dándole vueltas al tema y no hay manera de encontrar la sentencia adecuada y todo lo que consigo es que, cuando deja de "verme", siga andando hacia mí y eso no me interesa... Adjunto código a ver si me podéis ayudar:
   


Y hace lo mismo que haces para que vaya a la posicion del Player pero para la posInicial...
 
Mas alla del sistema de Pathfinding que uses (solo una parte de la IA), el como mover hacia donde no importa (por ahora, vamos a suponer) lo minimo que tenes que tener son estados, y podes definir esos estados con un target, entonces ahora no tendrias un "veo" o "no veo" podes tener varios estados, dentro de cada uno unas acciones de este + un condicional que haga que pase a otros estados (generalmente un switch va bien), olvidate del movimiento, usa prints solamente para asegurarte que todo anda (ponele un "el estado actual es xxxxx y el target actual es xxxxx").
 
Lo mismo va a pasar con posInicial, quizas en una semana empieces a usar varias posiciones de IDle o targets (tipo un patrol basico de enemigos) entonces todo el sistema "posInicial y SeeU " no te va a servir. El enemigo va siempre al target, "el target cambia". En tu caso definir un target(obj o transform) para la pos inicial es un desperdicio pero si tuvieras muchos lugares posibles de retorno no lo seria (cada target se actualizaria solo, es la naturaleza del transform)
 
Se me ocurren ahora tres estados:
 
idle ----->  seeU (target = player) -------------> returning (target = posInicial).
 
 ^ ---------------------------------------------------------------------------|
 
Una vez tengas eso organizado y sabes que anda el resto es usar el pathfinding que quieras, o una NavMesh, o quizas tu propio sistema de pathfindig.
 
 

Muchas gracias. Supongo que, cuando termine estos ejercicios, me liaré con todo el tema de los enemigos que patrullan y todo eso. Por ahora todo esto me resulta un poco confuso pero espero que, con un poco de práctica, todo quede más claro y los códigos sean un poco más eficientes.
 
Gracias!!

Etiquetas: