Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Rotação com MeshCollider

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.

1 resposta
solução

Oi, Ulisses, tudo bem?

Você pode fazer o seu lookAt sempre ser zero então como o personagem está se deslocando no Y, pra descartar essa rotação.

lookAt.y = 0;

Assim mesmo que mesh collider mude o ponto de colisão porque ele fica mais preciso, você não tem o prejuízo da altura.