Noticias

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

Moverse al enemigo

Iniciado por ramunda, Diciembre 20, 2018, 06:15:33 PM

Tema anterior - Siguiente tema
Buenas tardes a todos/todas, es una tonteria pero me he liado.
 
estoy haciendo que dos pequeños ejercitos se peguen de leches unos con otros y para eso he creado (creo) la manera que detecte al enemigo mas cercano.
 
Hasta aqui va ok, me dice la distancia y detecta al tag requerido, pero me he atascado a la hora de decirle que si la distancia es +o- la esti***da el agresor vaya hacia ese objetivo.
 
Moverse se mueve pero no se para al llegar al ojectivo! el sigue palante .
 
 
 

public class Enemy : MonoBehaviour
{
    public float curDist = 20;
    GameObject[] enemigos;
    GameObject enemigo;
    public GameObject player;
    public float MoveSpeed = 3f;
    void Update()
    {
       
            enemigos = GameObject.FindGameObjectsWithTag("enemy1");
            curDist = 1;
            foreach (GameObject item in enemigos)
            {
                float dist = Vector3.Distance(player.transform.position, item.transform.position);
                if (dist >= curDist) ;
                {
                    curDist = dist;
                    enemigo = item;
                    print(dist);
                    player.transform.position += transform.forward * MoveSpeed * Time.deltaTime;
                }
            }
           
    }
}

 
seguro que es un tonteria pero me he bloqueado!, agradezco una mano , gracias de antemano y Feliz Navidad!
 
 

Mmm no me suena que eso sea para encontrar al más cercano, parece al más lejano (quizás me equivoque), fijate que el if lo gana la distancia mayor a la previa calculada. también fijate que se puede meter varias veces dentro del if es decir que vas a estar moviendo innecesariamente al player varias veces (quizás no notable pero va a estar sucediendo), lo que podés hacer es primero detectar y después mover.
 
De todos modos con la distancia sola no hacés nada, necesitas una posicion de destino (caso general, en este caso no se por que te movés solo para adelante), pero bueno así podés determinar la distancia y/o el transform del enemigo más cercano al player (a uno, no es la forma con la que se encaran los problemas entre ejercitos o grupos pero bueno...):
 

float currentDistance = Mathf.Infinity;   //arrancás de lo peor -> infinito
Transform closestEnemy = null;         //arrancás de lo peor -> nadie
    foreach (Transform enemy in enemies)
    {
        float distance = Vector3.Distance( transform.position, enemy.position);
        if (distance < currentDistance)
        {
            currentDistance = distance;
            closestEnemy = enemy;
       }        
    }

 
Para el final de este foreach vas a tener enemigo más cercano y su distancia (solo con el enemigo te alcanza). Lo unico que te queda es moverlo. Para el movimiento podés usar lo que estás usando o irte por el MoveTowards. El método MoveToward, hace lo mismo, si le queda por mover una distancia mayor a un "thresold" lo mueve ese valor (generalmente este umbral es tu delta de posición, en tu caso MoveSpeed * Time.deltaTime ), si le queda por mover una distancia menor al thresold lo pone directamente en la posición de destino (es decir no se pasa).
 
A esto podés agregarle algun timer o incluso una corrutina para que la detección ocurra cada, no se, 0.2f segundos en vez de cuadro a cuadro (típico de la IA), te aliviana un poco el procesamiento, pero hacer esto soldado a soldado no es la forma (como dije arriba).
 
 
 
Saludos
 
 
 
PD: nunca uses un Find dentro del Update, usalo en Start en todo caso, más si tenés muchos GameObjects.
 
 

Muchas gracias por la explicación /respuesta #lightbug, desgracidamanete no me ha funcionado o no he sabido aplicar el ejemplo que me has propuesto.
 
Y si, la idea era que detectara el enemigo mas cercano habiendo varios pululando cerca.
 
De todas maneras mil gracias , ya vere como lo apaño...
 
Feliz Navidad amigo.

Cita de: ramunda date=1545342874Muchas gracias por la explicación /respuesta #lightbug, desgracidamanete no me ha funcionado o no he sabido aplicar el ejemplo que me has propuesto.
   


Está algo tocado, es conceptual más que nada, si copias pegás no anda.
 
Cita de: ramunda date=1545342874Feliz Navidad amigo.
   


Felices fiestas!

Buenas, 
 
 
 
Gracias a los dos, en mi rpg estaba haciendo que cuando el personaje esta quieto recupere vida poco a poco, pero queria que si hay algun enemigo cerca no lo hiciera, con esto me ha funcionado de lujo
 
Gracias y feliz Navidad!!

Primero, es "menor que", no "mayor o igual que". Y muchos tenéis la manía de poner el "ó igual que..." y en Unity esa condición no es nada buena. Acostumbraos siempre a evaluar de forma absoluta, no permitáis segundas condiciones opcionales, es menos efectivo...
 
Segundo, acuérdate de orientar al enemigo hacia el objetivo antes de moverlo, o  se irá para dónde no quieres...

Etiquetas: