Para ter uma melhor representação do cenário, resolvi colocar um MeshCollider no chão do estacionamento. Assim o personagem iria descer e subir pelos buracos. Como isso altera a forma como o raycast interage com o chão, criei uma plano no código e usei o método raycast dele. Até aí tudo funcionando.
private void Rotate()
{
Plane floor = new Plane(Vector3.up, Vector3.zero);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float enter = 0f;
if (floor.Raycast(ray, out enter))
{
Vector3 hitPoint = ray.GetPoint(enter);
transform.LookAt(new Vector3(hitPoint.x, transform.position.y, hitPoint.z));
}
}
O problema ocorre quando vou fazer a rotação. Se eu utilizar o transform.LookAt(), meu personagem rotaciona corretamente, mas apresenta um problema na animação em alguns momentos, com a arma ficando com uma espécie de fantasma. Acredito que isso ocorra porque a animação tenta uma rotação e o código força outra.
Para tentar resolver isso, tentei utilizar Quaternion, substituindo o transform.LookAt pelo código abaixo:
Vector3 lookAt = hitPoint - transform.position;
lookAt.y = transform.position.y;
_rigidbody.MoveRotation(Quaternion.LookRotation(lookAt));
A princípio o código funciona corretamente, com o "fantasma" na animação desaparecendo. O problema aqui é quando tenho que passar em algum buraco mais fundo. Nesses casos o personagem apresenta um pitch, rotacionando no eixo x, enquanto eu só gostaria que ele tivesse yaw. Eu não consegui entender o porque disso estar acontecendo, uma vez que as rotações do rigdbody estão bloqueadas, o plano onde o raycast incide ser sem deformações e eu ainda estar definindo a posição em y do vector3, que vai dar origem à rotação, igual ao do transform.
Já procurei bem a solução na internet, mas não consegui encontrar.