Si, te puedo dar un empujón en la dirección correcta (o por lo menos la dirección de como yo lo hice).
Primero obtuve la posición de donde hace click el mouse haciendo un raycast (el largo del rayo es medio arbitrario pero yo le puse 400 para asegurarme que hago click en el terreno):
| Código: |
RaycastHit hit;
Ray ray;
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 400.0f))
{
//Guardo hit.point en alguna variable y/o llamo a rutina que me calcule una ruta
}
|
Ahora bien, en el Update del personaje uso esta posición y lo muevo de acuerdo a su velocidad:
| Código: |
Vector3 moveDirection;
Quaternion rotation;
float aux;
moveDirection = (targetPosition - transform.position).normalized;
//Rota hacia el objetivo
rotation = Quaternion.LookRotation(moveDirection);
aux = Mathf.Min(rotationSpeed * Time.deltaTime, 1);
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, aux);
//Avanza hacia el objetivo
controller.Move(transform.forward * Time.deltaTime * movementSpeed);
|
Hay que notar algunas cosas en este ultimo código: targetPosition es la variable Vector3 donde guardé hit.point, o sea donde se hizo click y movementSpeed es un parámetro de la script que determina cuan rapido se mueve el personaje.
También, muy importante, el personaje debe tener un Character Controller (en este caso, lo dejé en la variable controller al iniciar la script) o si no, no va a servir controller.Move.
Tambien tendrías que ver una distancia mínima entre targetPosition y transform.position (Vector3.Distance) para detener el movimiento
Si necesitas implementar pathfinding (o sea, que el personaje pueda evitar obstáculos) aquí hay un link a un código que a mí me ayudó:
www.unifycommunity.com/wiki/index.php?title=WaypointMaster
Básicamente, te entrega un arreglo con waypoints que debe recorrer el personaje para evitar un obstáculo (estos waypoints deben ser puestos por tí en el nivel por supuesto).
Saludos.