Noticias

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

Script de movimiento al darle click

Iniciado por Daniel Reyes, Agosto 04, 2015, 12:11:25 AM

Tema anterior - Siguiente tema
Hola desarrolladores! Tengo un molesto problemilla con un script que no es mio, su funcion es mover mi personaje por el mapa al darle click a una parte de este, y lo hace a la vez ejecutando animaciones del animator, entonces cuando doy click y el personaje llega a su destino, este comienza a dar vueltas como alrededor de algo inexistente y no realiza la animacion de "idle" sino se queda en ese bucle, que hago? Aqui el script y el video: https://www.youtube.com/watch?v=Cc_xwMkGHtg
        var smooth:int; // Determines how quickly object moves towards position 
               
                       
               
                private var targetPosition:Vector3;
               
               
               
               
               
                var speed = 60;
               
               
               
                               
               
                function Update () {
               
                        if(Input.GetKeyDown(KeyCode.Mouse0))
               
                        {
               
                       
               
                        smooth=1;
               
                       
               
                                var playerPlane = new Plane(Vector3.up, transform.position);
               
                                var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
               
                                var hitdist = 0.0;
               
                               
               
                                if (playerPlane.Raycast (ray, hitdist)) {
               
                                        var targetPoint = ray.GetPoint(hitdist);
               
                                        targetPosition = ray.GetPoint(hitdist);
               
                                        var targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
               
                                        transform.rotation = targetRotation;
               
                                       
               
                                                       
               
                                }
               
                                       
               
                        }
               
                       
               
                                var dir:Vector3 = targetPosition - transform.position;
               
        var dist:float = dir.magnitude;
               
        var move:float = speed * Time.deltaTime;
               
        if(dist > move){
               
        transform.position += dir.normalized * move;
               
        } else {
               
        transform.position = targetPosition;
               
        }
               
                       
               
                       
               
                        transform.position += (targetPosition - transform.position).normalized * speed * Time.deltaTime;
               
                       
               
                               
               
                               
               
                               
               
                        }
 

Se pone a mirar a algo definido en:
       private var targetPosition:Vector3; 
Quita este trozo de código:
                  if (playerPlane.Raycast (ray, hitdist)) { 
               
                                        var targetPoint = ray.GetPoint(hitdist);
               
                                        targetPosition = ray.GetPoint(hitdist);
               
                                        var targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
               
                                        transform.rotation = targetRotation;
               
                                       
               
                                                       
               
                                }
Y prueba

Yo creo que el trozo que quieres quitar es el que le dice la dirección en la que quiere ir... yo creo que el problema está en la última línea, ya estás diciéndole que se mueva si la distancia es mayor que la velocidad, aunque yo creo que deberías mirar si la distancia es menor que cierto valor (por ejemplo 1) y asignarle la posición si es true, o moverlo si es false, y por supuesto quitar la última línea.

Gracias a ambos por comentar...
Oye juanma_teso, no entiendo muy bien a lo que te refieres, soy novato en esto y nose que es lo que me dices que reemplace, me podrias dar la parte del codigo ya editado?, ojala no este sonando como si quisiera todo regalado, gracias (Y)

Así es como suena jajaja.Mira, tienes una dirección:
var dir:Vector3 = targetPosition - transform.position;
y una distancia, que es la magnitud de la dirección, entre más cerca menor es la distancia.
var dist:float = dir.magnitude;
después tienes una condición de dos ramas, esto significa que puede coger uno de los dos caminos.
if(dist > move){ //
aquí está la condición.
    transform.position += dir.normalized * move; //esto se ejecuta si es verdadero
} else {
    transform.position = targetPosition; //esto otro si es falso
}
si te fijas, lo que se ejecuta cuando es verdadero es igual a la última línea, a diferencia que llega un momento en el que no se ejecutará más porque la distancia será menor que la velocidad cuando esté muy cerca.Lo que tienes que hacer es borrar la última línea de código, y te aconsejaría cambiar la condición a un valor fijo, como (dist > 1).

Etiquetas: