Programação para Unity 3d em Csharp.

14/09/2015

1

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);

}
}
}
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
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira