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)

Minhas balas saem girando

Olá, quando aperto para disparar minhas balas, elas saem do cano da arma girando para todas as direções :/ Alguém poderia me ajudar? Agradeço desde já!

CÓDIGO DA BALA

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

public class Bala : MonoBehaviour
{

public float Velocidade = 20;
    // Update is called once per frame
    void FixedUpdate()
    {
        GetComponent<Rigidbody>().MovePosition
        (GetComponent<Rigidbody>().position + transform.forward * Velocidade * Time.deltaTime);
    }
}

CÓDIGO CONTROLE DA ARMA

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

public class ControlaArma : MonoBehaviour
{
    public GameObject Bala; // coloca o Prefab da bala nesse espaço.
    public GameObject CanoDaArma; //Feita para pegarmos as infos do cano
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetButtonDown("Fire1")){
         Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.transform.rotation);   
        }
    }
}
6 respostas

TEM CURSO DE UNITY AQUI KKK...VOU TENTAR TE AJUDAR, MAS GOSTAVA QUANDO A UNITY USAVA JAVASCRIPT.

VAMOS LÁ

  void Update()
    {
        if(Input.GetButtonDown("Fire1")){
         Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.transform.rotation);   
        }
    }

Esse é o código da arma, ele está certo. Ele instancia a bala em um determinado local com uma posição e uma determinada rotacao. O seu Instantiate está certo, entretanto o tranform.rotation que está fazendo referencia a arma pode ser mudado para tranform.Quaternion.identity, creio que seja assim.

Tenta:

Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.Quaternion.Identity);   

public float Velocidade = 20;
    // Update is called once per frame
    void FixedUpdate()
    {
        GetComponent<Rigidbody>().MovePosition
        (GetComponent<Rigidbody>().position + transform.forward * Velocidade * Time.deltaTime);
    }

Esse acima é o seu código. No caso acima você está pegando o componente Rigidbody e acessando a posição do objeto. Isso é ótimo, dessa forma você tem uma maior colisão dos objetos, mas se você está tendo problemas, você pode tentar isso de outras maneiras já que o script vai estar na bala .Ex.:

private Vector 3 mypos;
void Start(){

}
void Update(){
    mypos = transform.position;
    mypos.x += 5*Time.deltaTima; // nesse caso a bala só anda no eixo x
    transform.position = mypos;
}

Um outro jeito é :

private float velocidade = 35;

void Update(){
    transform.Translate(35*Time.deltaTime,0,0); // Esse meio é muito usado, mas tem suas complicações. Aqui ele vai andar 35 metros por segundo. O Time.deltaTime calcula a distância com relação ao tempo e não com relação ao  pulso processador.
}

transform.Translate(x , y ,z );

Ok, isso ajuda quando o tira não está saindo em uma direção fixa. Ex. : Quando queremos que uma bala seja instanciada no eixo X da arma, ela será instanciada no eixo X, mas se a arma mudar de posição a bala não muda. Isso ocorre em algumas versões do unity.

Sendo assim, você pode criar uma referencia para a bala. Sabe lá em cima onde você edita as tags para colição, então do lado tem um botão parecido chamado Layer. Nele podemos criar uma tag especial que diz para a engine que certo objeto não colide com outro.

O que pode estar acontecendo é que a bala ta encostando na arma na hora de instanciar. Dependendo da programação que você fizer a bala pode ser destruída só por tocar na arma.

Agora se a bala continuar girando, o problema pode ser no RigidyBody da bala. Na função rigidybody que você adiciona no corpo da bala, você tem uma setinha para baixo, um campo irá se abrir com as funções de posição e rotação. Na rotação desmarque tudo e na direção desmarque o eixo Y para fazer um teste.

As vezes o erro nem é de código mas o objeto que instancia as balas que pode estar dentro da colisão do personagem então ela já sai colidindo pra qualquer lado. Dá uma olhada na posição do objeto CanoDaArma e joga ele um pouco mais pra frente e veja se isso soluciona.

Quando eu seleciono todos os eixos em rotação e o y em posição, a bala começa a ir para trás. Já mudei a opção global/local para ver se influencia, mas nada muda. Tentei o 1° código indicado:

Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.Quaternion.Identity);   

Mas deu erro :/ e os outros eu não entendi muito bem como funcionam, por isso não testei. Ah! Também alterei a posição do CanoDaArma, e nada mudou :(

solução

Se a bala está indo para trás, tenta mudar a velocidade assim você também pode mudar a direção colocando ela negativa.

      public float Velocidade = -20;   

ou

      public float Velocidade = 20;   

    void Start (){
        velocidade = -velocidade;
    }

Caramba, verdade! Funcionou direitinho :) Obrigada!!

kkk de nada : ) !