Programação para Unity 3d em Csharp.

14/09/2015

2

Boa noite galera, estou fazendo um jogo em 2D no unity 3D com um amigo e estamos apanhando pra caramba pra fazer o personagem atirar para o lado contrário dele, no caso o esquerdo, para o lado direito ele atira normal, o problema é quando vira o personagem, pois as balas continuam saindo para ambos os lados, vou colocar o código logo abaixo.

:::::::::::::::::::: Código do player ::::::::::::::::::::

public class Player : MonoBehaviour
{
//Movimentação e pulo
public float velocidade;
public float forcaPulo;
private bool estaNoChao;
public Transform chaoVerificador;
public Transform spritePlayer;
private Animator animator;

//Vida
public Texture Sangue, Contorno;
public int maxVida = 100;
public int vidaAtual;



//Tudo o que ocorre quando o personagem é criado
void Start()
{
animator = spritePlayer.GetComponent<Animator>();

//Vida
vidaAtual = maxVida;
}

//Tudo o que ocorre enquanto o personagem existe
void Update()
{
Movimentacao();

//Faz a checagem da vida
if (vidaAtual >= maxVida)
{
vidaAtual = maxVida;
}
else if (vidaAtual <= 0)
{
vidaAtual = 0;
}

}

//Responsável pela movimentação do personagem
void Movimentacao()
{

//Ativa a condição para mudar de animação
animator.SetFloat("movimento", Mathf.Abs(Input.GetAxisRaw("Horizontal")));

//verifica se o personagem está no chão
estaNoChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Piso"));
animator.SetBool("chao", estaNoChao);

//Anda para direita
if (Input.GetAxisRaw("Horizontal") > 0)
{

transform.Translate(Vector2.right * velocidade * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 0);
}

//Anda para esquerda
if (Input.GetAxisRaw("Horizontal") < 0)
{

transform.Translate(Vector2.right * velocidade * Time.deltaTime);
transform.eulerAngles = new Vector2(0, 180);
}

//Faz o personagem pular
if (Input.GetButtonDown("Jump") && estaNoChao)
{

if (Input.GetButtonDown("Jump") && estaNoChao)
{
GetComponent<Rigidbody2D>().AddForce(transform.up * forcaPulo);
}
}

}

//Parte que posiciona e altera a textura de vida
void OnGUI()
{

GUI.DrawTexture(new Rect(Screen.width / 27, Screen.height / 25, Screen.width / 5.5f / maxVida * vidaAtual, Screen.height / 10.5f), Sangue);
GUI.DrawTexture(new Rect(Screen.width / 40, Screen.height / 40, Screen.width / 5, Screen.height / 8), Contorno);


}

//Sistema para perder vida
public void PerdeVida(int dano)
{
vidaAtual -= dano;

if (vidaAtual <= 0)
{
Application.LoadLevel("Gameover");
}
Sangue.width = dano - vidaAtual;

}

//Sistema para recuperar vida
public void RecuperaVida(int recupera)
{
vidaAtual += recupera;

if (vidaAtual > maxVida)
{
vidaAtual = maxVida;
}
Sangue.width = recupera + vidaAtual;
gameObject.GetComponent<AudioSource>().Play();

}

}

:::::::::::::::::::: Código da arma ::::::::::::::::::::

public class ArmaPlayer : MonoBehaviour {

public Transform BalaPlayerPrefab;

public float TempoTiro = 0.25f;

private float VerificaTempotiro;

private bool DirecaoPlayerRight = true;

// Use this for initialization
void Start () {

VerificaTempotiro = 0;

}

// Update is called once per frame
void Update () {

if (VerificaTempotiro > 0)
{

VerificaTempotiro -= Time.deltaTime;

}

//Ativa o tiro
if (Input.GetButtonDown("Fire1"))
{

ArmaPlayer AP = GetComponent<ArmaPlayer>();
if (AP != null)
{

AP.Ataque();
GameObject projectil = Instantiate(BalaPlayerPrefab.gameObject, transform.position, transform.rotation) as GameObject;
projectil.GetComponent<BalaPlayer>().right = DirecaoPlayerRight;

}

}

}

public void Ataque()
{

if (VerificaTempotiro <= 0)
{

VerificaTempotiro = TempoTiro;
var BalaTransform = Instantiate(BalaPlayerPrefab) as Transform;
BalaTransform.position = transform.position;
}

}

}

:::::::::::::::::::: Código da bala ::::::::::::::::::::

public class BalaPlayer : MonoBehaviour {

public float velocidadeDaBala;
public int dano = 1;
public bool right = true;

// Use this for initialization
void Start () {

gameObject.GetComponent<AudioSource>().Play();
Destroy(gameObject, 1.4f);

}

// Update is called once per frame
void Update () {
if (right)
transform.Translate(Vector2.right * velocidadeDaBala * Time.deltaTime);
else
transform.Translate(Vector2.left * velocidadeDaBala * Time.deltaTime);
}


// Colisão da bala
void OnTriggerEnter2D(Collider2D colisor)
{
if (colisor.gameObject.tag == "Inimigo")
{
VidaInimigo VI = colisor.gameObject.GetComponent<VidaInimigo>();
VI.Dano(dano);

}
}
}
Jefferson Silva

Jefferson Silva

Responder

Post mais votado

21/12/2017

Olá , boa tarde.

Aparentemente o problema ocorre pela variavel velocidadeDaBala , como o valor deve ser positivo , mesmo quando vc instancia a bala pra direita pois ao multiplicar pela velocidade algumas balas vão para a direita, talvez colocar o valor da variavel como negativo isso pode resolver.

um abraço

Eduardo Chaves

Eduardo Chaves
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar