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/b84b3e8d231a3ff11180396cbe728adb (https://gyazo.com/b84b3e8d231a3ff11180396cbe728adb)aquí 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);
}
}
}
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>();