Noticias

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

Que el enemigo no me detecte a más altura

Iniciado por Wazabee, Junio 16, 2017, 11:21:27 AM

Tema anterior - Siguiente tema
Junio 16, 2017, 11:21:27 AM Ultima modificación: Junio 16, 2017, 11:22:37 AM por Wazabee
Hola a tod@s!
 
Sigo con mi proyecto de aprendizaje con Unity y JavaScript. Ahora estoy desarrollando un script para un enemigo. Por ahora he conseguido que el enemigo rote mirando al personaje conforme éste cambia su posición. Ahora bien, el enemigo siempre rota siguiendo al personaje, pero lo que me interesa es que si el personaje está a una altura diferente, el enemigo no lo detecte y no rote conforme el personaje se mueve... El script que tengo es este:
 

#pragma strict
var target : Transform;
 
function Start () {

}
function Update () {
 
        //var pos = transform.position - target.position; // Siempre de espaldas
        var pos = target.position - transform.position;   // De cara
        var rot = Quaternion.LookRotation (pos, Vector3.forward);
        transform.rotation = Quaternion.Slerp (transform.rotation, rot, 2*Time.deltaTime);
}

 
He probado con hacer algo como
 

   if (transform.position == target.position){
        //var pos = transform.position - target.position; // Siempre de espalda
        var pos = target.position - transform.position;   // De cara
        var rot = Quaternion.LookRotation (pos, Vector3.forward);
        transform.rotation = Quaternion.Slerp (transform.rotation, rot, 2*Time.deltaTime);
   
    }
   else {
        print ("Enemy 'Y' position is "+ transform.position.y);
        print ("Character 'Y' position is "+ target.position.y);
    }

}

 
Pero el "if" no se cumple nunca. He probado a cambiar la altura  del GameObject que actúa como target y varias cosas más, pero no consigo que se cumpla nunca y no sé cómo podría solucionarlo o plantearlo de otra forma. A ver si algun@ me puede echar una mano a enfocar la cosa...
 
Mil gracias,
 
Saludos!

Hola!! Recuerda que la variable 'position' es un vector de tres números con decimales (floats), y para que sean iguales los tres deben ser iguales, algo difícil con números con muchos decimales, lo que tienes que comprobar dentro del if no es que estén en la misma posición sino que tengan la misma altura 'Y', o al menos una parecida:
 
https://docs.unity3d.com/ScriptReference/Mathf.Approximately.html
 
Suerte!!

Gracias Juanma por tu respuesta, pero no logro hacerlo funcionar...Al usar "Mathf.Approximately" me pasa lo mismo de antes, el "if" no se cumple:
 

if (Mathf.Approximately(transform.position.y, target.position.y))

 
Lo que me extraña es que las posiciones en Y son parecidas, el enemigo está en Y = 2.242 y el personaje está en Y = 2.296856. Para mí son aproximadamente iguales pero, a lo mejor, para Unity excede el rango o no sé...Así que sigo atascado en esto...

Cita de: Wazabee date=1497628800Gracias Juanma por tu respuesta, pero no logro hacerlo funcionar...Al usar "Mathf.Approximately" me pasa lo mismo de antes, el "if" no se cumple:
   
   

if (Mathf.Approximately(transform.position.y, target.position.y))

   
      Lo que me extraña es que las posiciones en Y son parecidas, el enemigo está en Y = 2.242 y el personaje está en Y = 2.296856. Para mí son aproximadamente iguales pero, a lo mejor, para Unity excede el rango o no sé...Así que sigo atascado en esto...
   


 
 
 
 

if (transform.position.y > target.position.y -0.5f && transform.position.y < target.position.y + 0.5f)

 
Con este if lo detecta si solo varía 0.5 de la posición tuya. Modifica como veas el margen de detección y ya lo tienes.
 
Saludos.

Cita de: Wazabee date=1497604887Pero el "if" no se cumple nunca
   


Hacer una condicion asi es jugarsela toda, apostar los ahorros de tu vida a ese numero jaja nunca hagas eso siempre toma distancias y pregunta si esta entre tal y tal valor.
 
De lo poco que lei si queres que detecte o no si esta a diferente distancia (obvio aca no queres un != sino una margen de diferencia) lo que buscas es tomar el vector diferencia entre player y target, tomar su componente verrtical (y generalmente) y medir su valor absoluto, si es mayor a X no se detecta, sino se detecta.

Cita de: TheBullet date=1497634772 
   
   
       
   
   

if (transform.position.y > target.position.y -0.5f && transform.position.y < target.position.y + 0.5f)

   
      Con este if lo detecta si solo varía 0.5 de la posición tuya. Modifica como veas el margen de detección y ya lo tienes.
   
   
      Saludos.
   


Genial! Gracias TheBullet! Ahora si que si!
 
Saludos!

Junio 24, 2017, 02:08:38 AM #6 Ultima modificación: Junio 24, 2017, 02:11:28 AM por McReiz
lo que haria yo es medir la distancia en Y
 

// con esto obtenemos la distancia en Y
float distY = Mathf.Abs(player.transform.position - transform.position);
float maxDistY = 10;
// si la distancia es menor que rote
if(distY < maxDistY){
     // hacer que rote
}

 
 

Etiquetas: