Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Como alinhar a mira com o cursor?

Oi, Henrique

Como falei em outro tópico, mas dessa vez tentando postar no lugar certo hahah, andei testando o jogo finalizado e essa foi outra coisa que não to sabendo corrigir e fiquei na dúvida. O cursor está de acordo com o vídeo, textura com dimensão 32x32 e 'Hotspot' modificado para 16 em X e Y e tal.

O problema é que a mira funciona bem quando o mouse está acima ou abaixo do jogador mas, mesmo com essas modificações feitas, quando o mouse está aos lados e nas diagonais a bala não vai no centro da mira. Às vezes vai até fora da figura do cursor.

Acredito que essa diferença seja pelo 'RaycastHit' do mousePosition tocar o chão, mas a bala sai do cano da arma com algumas unidades acima disso em Y... Enfim, tem alguma forma de deixar isso sempre alinhado?

2 respostas
solução!

Você acertou exatamente o problema, por causa do ângulo da câmera o acerto no chão ocorre um pouco depois da posição do personagem, e quando estamos olhando para a direita e esquerda isso fica mais aparente.

Daria pra corrigir usando Raycast em objetos mas dando menos trabalho e até mostrando uma forma diferente de fazer a mesma coisa (que é um pouco mais difícil), poderíamos ter um código da seguinte forma:

Criamos um raio apontando para a posição do mouse.

Ray raio = Camera.main.ScreenPointToRay(Input.mousePosition);

Depois ao invés de usarmos o nosso chão para fazer a colisão com o raio, nós criamos um plano usando como normal a direção para cima e a posição ficaria bem onde queremos que a mira fique, por isso pensei em algo como criar uma referência ao local da mira:

Plane plano = new Plane(Vector3.up, posicaoMira.transform.position);

Em seguida podemos usar o Raycast no plano que usa uma variável de distância como referência de qual a distância do raio quando ele tocou no plano e apontamos nosso jogador para essa direção:

float distanciaColisao;

if (plano.Raycast(ray, out distanciaColisao))
{
    Vector3 localColisao = raio.GetPoint(distanciaColisao);
    localColisao.y = 0; //ou transform.position.y

    //direcao para onde vamos olhar baseado onde estamos
    Vector3 posicaoParaOlhar = localColisao - transform.position;

    Quaternion novaRotacao = Quaternion.LookRotation(posicaoParaOlhar);
    GetComponent<Rigidbody>().MoveRotation(novaRotacao);
}

Assim temos mais precisão e controle de onde nosso raio está saindo e onde ele está colidindo.

Referência

Bons estudos!

Opa, desse jeito aí corrigiu como eu tava imaginando sim =P

Eu tinha até mudado a bala pra seguir uma trajetória da arma até o centro da mira mas aí, se não atingisse nada nesse caminho, ela deixava de seguir sempre em frente como estava e passava a ir só até esse ponto colidindo com o chão.

Mas desse novo jeito fica alinhado sem perder o comportamento de antes da bala.

Obrigado, novamente =)