Noticias

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

Temas recientes

Girar enemigo 2d viendo al jugador

Iniciado por Alex, Octubre 01, 2019, 08:45:08 PM

Tema anterior - Siguiente tema
buenas.
 
Estoy desarrollando un juego 2d y tal vez esto suene sencillo para ustedes, pero llevo casi 3 horas intentando hacer que un enemigo gire en el eje Y conforme a la posición donde se encuentre el jugador ( derecha o izquierda) pero lo que he logrado es hacer que el enemigo gire pero en 180 (va girando de poco a poco) en el eje Y, alguien sabe como puedo hacer que gire de un solo golpe de izquierda a derecha y no de poco a poco?
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IAEnemy : MonoBehaviour
{
    public float speed;
    public GameObject iPlayer;
    public bool Detect;
    //void OnCollisionEnter2D(Collision2D collision)
    void OnTriggerStay2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Player")
        {
       
          iPlayer =  collision.gameObject;
         
          Detect = true;
    }else
    {
        Detect = false;
    }
}
void Update(){
    if(Detect == true){
        Invoke ("IAReady", 0.1f);
    }
   //esta es la parte que hace girar al enemigo:
  Vector3 dir = iPlayer.transform.position - transform.position;
 float angle = Mathf.Atan2(dir.y,dir.x) * Mathf.Rad2Deg;
 transform.rotation = Quaternion.AngleAxis(angle, Vector3.up);  
                 
   
}    
     public void IAReady () {
         transform.position = Vector2.MoveTowards(transform.position,iPlayer.transform.position, speed * Time.deltaTime);
 
     }
}

 
 

Octubre 01, 2019, 09:58:38 PM #1 Ultima modificación: Octubre 01, 2019, 10:15:36 PM por iRobb
Hola
 
Cómo la position respecto al player se ejecuta con un valor de speed * deltaTime y la rotation es respecto a esa position, el movimiento se ejecuta a intervalos. Eso produce que la rotation vaya según el movimiento que se ejecuta más lentamente.
 
Y ese Invoke? Cuántas veces se va a ejecutar? Porqué como se ejecute más de una vez la llamada...
 
A ver si te ayuda y vamos corrigiendo.

Octubre 02, 2019, 03:55:02 AM #2 Ultima modificación: Octubre 02, 2019, 04:05:31 AM por Alex
Me ha costado realmente mucho pero al final lo he logrado, le adjunto el código que he editado, para otra persona que se encuentre con el mismo problema:
 


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowPlayer : MonoBehaviour
{
    public float speed;
    public GameObject Jugador;
    public bool Direccion;
 
  void Start(){
    //Para evitar el error continuo en la consola al no encontrar al jugador.
        if(Jugador == null){
            Debug.LogWarning("Voy a comenzar a buscar al jugador!");
        }
    }
    void OnTriggerStay2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Player") {
      
      if (collision.gameObject.transform.position.x < transform.position.x)
              //si el jugador esta a la izquierda: detection = true
      Direccion = true;
          //si no esta en la derecha: detection = false
      else
      Direccion = false;
         Invoke("Follow", 0.1f);
                Jugador = collision.gameObject;
   }
}
 
     public void Follow () {
       //una vez detectado al jugador, el enemigo lo sigue.
         transform.position = Vector2.MoveTowards(transform.position,Jugador.transform.position, speed * Time.deltaTime);
         if(Direccion == true){
           //gira al enemigo hacia la izquierda.
             transform.rotation = Quaternion.Euler(Vector3.up * 180f);
         }else{
           //gira al enemigo hacia la derecha.
             transform.rotation = Quaternion.Euler(Vector3.up * 0f);
         }
     }
}

Etiquetas: