Programação para Unity 3d em Csharp.
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);
}
}
}
:::::::::::::::::::: 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
Curtidas 0
Melhor post
Eduardo Chaves
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
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
GOSTEI 1