Hace un par de días hice un alto en mi proyecto principal para variar un poco y dediqué unas horas a implementar una cámara en tercera persona similar a la de Mass Effect/The Witcher 3. O sea, el mouse permite dirigir la cámara en cualquier dirección, y al avanzar el personaje se rota en la dirección que mira la cámara. Mi método quizás no sea el mejor, pero fue lo que se me ocurrió con mis modestos conocimientos de matemáticas y consiste en tener un gameobject pivote que es el padre de la cámara y se encarga de las rotaciones. El jugador es otro gameobject que a su vez se desplaza, arrastrando el pivote tras de sí.El freelook lo manejo con el siguiente código:
void Update () {
GameObject go = GameObject.Find ("Label");
if (Input.GetAxis ("Mouse X") != 0 || Input.GetAxis ("Mouse Y") != 0) {
float rotationX = gameObject.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * 2f;
rotationY += Input.GetAxis("Mouse Y") * 5f;
gameObject.transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
RaycastHit hit;
Ray ray = cam.ScreenPointToRay (Input.mousePosition);
if (Physics.Raycast (ray, out hit, 100)) {
var label = go.GetComponent<Text>();
label.text = "Press E to interact with "+hit.collider.name;
} else {
var label = go.GetComponent<Text>();
label.text = "";
}
}
}Las cosas funcionan bien hasta la parte del control de la cámara. Donde se fastidia, es que no consigo implementar un raycasting preciso que me retorne los objetos que están en línea con el centro de la pantalla, donde supuestamente debería poner una cruz o algo así (al;go que aún no sé cómo hacer). Pensé que lo había conseguido aquí en la oficina, pero cuando lo probé en casa, para nada, el raycast me retorna objetos que están a la izquierda del personaje, o en cualquier dirección menos en la "línea central".Alguien me puede ayudar a corregir estos problemas?