Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 58,34€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
Alex

Girar enemigo 2d viendo al jugador

Recommended Posts

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);
 
     }

}

 

Share this post


Link to post
Share on other sites

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.

Edited by iRobb

Share this post


Link to post
Share on other sites

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);
         }
     }

}
Edited by Alex

Share this post


Link to post
Share on other sites

×
×
  • Create New...