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

Disparo não está no centro da Mira

Olá, Tudo bem ?

Vi que você respondeu a essa pergunta duas vezes, porem não estou sabendo como implementar isso em meu código.

Preciso fazer as alterações citadas nos outros posts somente em MovomentoJogador ?

Ao fazer as mudanças em meu código o "ray" dentro da condição do IF esta dando erro e não consigo solucionar.

Meu código esta dessa forma:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovimentoJogador : MovimentoPersonagem
{
    private GameObject posicaoMira;

    public void RotacaoJogador(LayerMask MascaraChao)
    {
        Ray raio = Camera.main.ScreenPointToRay(Input.mousePosition);
        Plane plano = new Plane(Vector3.up, posicaoMira.transform.position);

        //RaycastHit impacto;

        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);
        }
    }
}
8 respostas

Oi, Guilherme, tudo bem?

Sim! Essa pergunta aparece realmente as vezes hehe

Você tem que mudar só no jogador porque ele é o único que usa esse método no momento.

Acho que devo ter me equivocado na hora de traduzir o código para português (eu tenho mania de codar em inglês) então no seu if tem uma variável ray que deveria chamar raio que é o Ray criado acima.

Veja se isso soluciona o problema, se tiver mais algum erro avisa pra gente o que aparece no console :)

Obrigado pelo retorno,

Então, eu até tinha trocado o ray para raio, mas como continuava com erro pensei que podia não ser isso.

O erro que aparece quando troco é o:

NullReferenceException: Object reference not set to an instance of an object

MovimentoJogador.RotacaoJogador (UnityEngine.LayerMask MascaraChao) (at Assets/Scripts/MovimentoJogador.cs:33)

ControlaJogador.FixedUpdate () (at Assets/Scripts/ControlaJogador.cs:41)

Tem dois erros no seu código então um na linha 33 e outro na linha 41 do ControlaJogador. Quer mandar um .zip do seu projeto pra darmos uma olhada?

Tudo bem, segue o link do arquivo no google drive.

https://drive.google.com/file/d/15kG8dFfhF1eApyQ4ucVMk2MK75eAuc_k/view?usp=sharing

Oi, Guilherme, tudo bem?

Antes a variável posicaoMira era um calculo agora ela é uma referencia a um objeto. Então você pode deixar ela publica e preencher com o objeto CanoDaArma (ou usar Tag, serialize field, etc) porque essa referencia agora é necessária, por isso que o cast do plane não estava funcionando.

O Plane para a rotação ficar correta tem que estar bem na altura da mira do jogador.

Olá Henrique,

Infelizmente continuo sem entender onde devo fazer essas alterações.

solução!

Oi, Guilherme, blz?

No seu script MovimentaJogador nessa linha

private GameObject posicaoMira;

Temos uma variável que precisa ser preenchida porque o plano para ser criado precisa de uma posição, que seria a localização desse objeto.

Deixe a variável pública e no Inspector preencha ela com o objeto CanoDaArma. Assim ele terá uma posição para referenciar.

Olá Henrique,

Agora finalmente entendi, obrigado.

Não estava entendendo que precisava preencher no unity também.