Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Problema dirección disparos juego 2D

Iniciado por Joawin, Agosto 21, 2015, 02:40:39 AM

Tema anterior - Siguiente tema
Buenas, cuando disparo con mi personaje el proyectil no va a donde está mirando el personaje que es lo que quiero. Si me muevo si que funciona correctamente pero si estoy quieto suele ir para la izquierda siempre aunque mira a la derecha os muestro: https://gyazo.com/b84b3e8d231a3ff11180396cbe728adbaquí los scripts del arma y el ataque: Arma Arrojadiza:
using UnityEngine;
using System.Collections;

//Creamos un tipo enumerado para definir la dirección
public enum Direccion { Horizontal, Vertical }

public class ArmaArrojadiza : MonoBehaviour
{
//Variables públicas
public Direccion DireccionArma = Direccion.Horizontal;
public float Velocidad = 50.0F;

//Variables privadas
private Rigidbody thisRigidbody;

void Start ()
{
   thisRigidbody = GetComponent<Rigidbody>();
}

void Update ()
{
   //Establecemos su velocidad y su dirección
   if (DireccionArma == Direccion.Horizontal)
   {
      //Movemos el arma en horizontal
      thisRigidbody.transform.Translate(new Vector3(Velocidad, 0, 0) * Time.deltaTime);
   }
   else
   {
      //Movemos el arma en vertical
      thisRigidbody.transform.Translate(new Vector3(0, Velocidad, 0) * Time.deltaTime);
   }
}

void OnTriggerEnter(Collider other)
{
   if (other.tag == "Enemigo")
   {
      //Si el ataque colisiona contra un objeto con el tag 'Enemigo', se decrementan las vidas de dicho enemigo
      other.gameObject.GetComponent<ComportamientoEnemigo>().Vidas--;
      
      //Destruimos el objeto cuando colisione contra un enemigo
      Destroy(gameObject);
   }
}
}
 Ataque Personaje:
using System.Collections;
using System;

public class AtaquePersonaje : MonoBehaviour
{
//Creamos una variable pública donde asignar nuestro prefab 'Shuriken'
public GameObject ShurikenPrefab;

void Update ()
{
   //Si pulsamos el botón 'Fire1'...
   if (ShurikenPrefab != null && Input.GetButtonDown("Fire1"))
   {
      //Accedemos al script 'ArmaArrojadiza.cs' del prefab
      ArmaArrojadiza scriptShuriken = ShurikenPrefab.GetComponent<ArmaArrojadiza>();
      
      if (Input.GetAxis("Vertical") > 0)
      {
         //Ataque hacia arriba
         scriptShuriken.DireccionArma = Direccion.Vertical;
         scriptShuriken.Velocidad = Math.Abs(scriptShuriken.Velocidad);
      }
      else if (Input.GetAxis("Vertical") < 0)
      {
         //Ataque hacia abajo
         scriptShuriken.DireccionArma = Direccion.Vertical;
         scriptShuriken.Velocidad = -Math.Abs(scriptShuriken.Velocidad);
      }
      else if (Input.GetAxis("Horizontal") > 0)
      {
         //Ataque hacia la derecha
         scriptShuriken.DireccionArma = Direccion.Horizontal;
         scriptShuriken.Velocidad = Math.Abs(scriptShuriken.Velocidad);
      }
      else
      {
         //Ataque hacia la izquierda
         scriptShuriken.DireccionArma = Direccion.Horizontal;
         scriptShuriken.Velocidad = -Math.Abs(scriptShuriken.Velocidad);
      }
      
      //Creamos una instancia del prefab en nuestra escena, concretamente en la posición de nuestro personaje
      Instantiate(ShurikenPrefab, transform.position, Quaternion.identity);
   }
}
}
 

Agosto 21, 2015, 10:32:02 AM #1 Ultima modificación: Agosto 21, 2015, 10:33:34 AM por juanma_teso
En el primer script, si vas a mover el objeto usando el componente Transform, no es necesario que cargues una variable de rigidbody, usa directamente el tranform:
transform.Translate(new Vector3(0, Velocidad, 0) * Time.deltaTime);
En el segundo script, el problema está en que si el personaje está quieto, los dos Axis valen 0, y en tu condicional, la rama por defecto (el caso que entra cuando ninguno se cumple) hace que se mueva para la izquierda.
else
{
   //Ataque hacia la izquierda
   scriptShuriken.DireccionArma = Direccion.Horizontal;
   scriptShuriken.Velocidad = -Math.Abs(scriptShuriken.Velocidad);
}
Para solucionarlo, cambia de "else" a "else if" y luego crea un "else" pasándole la velocidad según la dirección del personaje, para saberla puedes usar "transform.forward" que te devuelve un vector con la dirección del personaje. PD: Tampoco hace falta que accedas al script cada vez que disparas:
//En start
//Accedemos al script 'ArmaArrojadiza.cs' del prefab
ArmaArrojadiza scriptShuriken = ShurikenPrefab.GetComponent<ArmaArrojadiza>();
 

Etiquetas: