jairogarcíarincón
Contenidos
Es el momento de disparar nuestras bombas.
Crea un EmptyObejct dentro de Tank y llámalo FireTransform.
Ajusta su Position a 0, 1.7, 1.35 y su Rotation a 350, 0, 0.
Haciendo clic derecho en el Canvas de Tank, selecciona UI > Slider y llámalo AimSlider.
Alt + clic en AimSlider para expandir todos sus hijos.
Borra Background y Handle Slide Area del AimSlider.
Selecciona el AimSlider y en la Inspector window, deselecciona Interactable para que el usuario no pueda modificarlo.
Ajusta además Transition a None, Direction a Bottom to Top, Min Value a 15 y Max Value a 30.
Selecciona AimSlider y Fill Area.
En su Rect Transform, clic en los Anchor Presets y Alt + clic en el de abajo a la derecha para hacer stretch vertical y horizontal sobre el Canvas.
Expande Fill Area y selecciona Fill.
En su Rect Transform, ajusta Height a 0, y en su componente Image, selecciona Aim Arrow como Source Image.
Selecciona el AimSlider y ajusta su Rect Transform a Left 1, Top -9, Pos Z -1, Right 1 y Bottom 3.
Las acciones a realizar son:
- Comprobar el estado del botón de disparo
- Actualizar la carga de disparo
- Instanciar la bomba cuando se suelta el botón o se llega a la máxima carga
Arrastra el script TankShooting desde Scripts > Tank al Tank y ábrelo. el código debería ser similar a este, y deberías leer los comentarios e intentar comprenderlo:
using UnityEngine;
using UnityEngine.UI;
public class TankShooting : MonoBehaviour
{
public int m_PlayerNumber = 1; //Para identificar a los diferentes jugadores
public Rigidbody m_Shell; //Prefab de la bomba
public Transform m_FireTransform; //Hijo del tanque en el que se generará la bomba (desde donde se lanzará)
public Slider m_AimSlider; //Hijo del tanque que muestra la fuerza de lanzamiento de la bomba
public AudioSource m_ShootingAudio; //Referencia a la fuenta de audio que se reproducirá al lanzar la bomba
public AudioClip m_ChargingClip; //Clip de audio que se reproduce cuando se está cargando el disparo
public AudioClip m_FireClip; //Clip de audio que se reproduce al lanzar la bomba
public float m_MinLaunchForce = 15f; //Fuerza mínima de dipsaro (si no se mantiene presionado el botón de disparo)
public float m_MaxLaunchForce = 30f; //Fuerza máxima de dipsaro (si se mantiene presionado el botón de disparo hasta la máxima carga)
public float m_MaxChargeTime = 0.75f; //Tiempo máximo de carga antes de ser lanzado el disparo con máxima fuerza
private string m_FireButton; //Eje de disparo utilizado para lanzar las bombas
private float m_CurrentLaunchForce; //Fuerza dada a la bomba cuando se suelta el botón de disparo
private float m_ChargeSpeed; //Velocidad de carga, basasda en el máximo tiempo de carga
private bool m_Fired; //Booleano que comprueba si se ha lanzado la bomba
private void OnEnable()
{
//Al crear el tanque, reseteo la fuerza de lanzamiento y la UI
m_CurrentLaunchForce = m_MinLaunchForce;
m_AimSlider.value = m_MinLaunchForce;
}
private void Start()
{
//El eje de disparo basado en el número de jugador
m_FireButton = "Fire" + m_PlayerNumber;
//Velocidad de carga, basasda en el máximo tiempo de carga y los valores de carga máximo y mínimo
m_ChargeSpeed = (m_MaxLaunchForce - m_MinLaunchForce) / m_MaxChargeTime;
}
private void Update()
{
// Asigno el valor mínimo al slider.
m_AimSlider.value = m_MinLaunchForce;
//Si llego al valor máximo y no lo he lanzado...
if (m_CurrentLaunchForce >= m_MaxLaunchForce && !m_Fired)
{
// ... uso el valor máximo y disparo.
m_CurrentLaunchForce = m_MaxLaunchForce;
Fire ();
}
// Si no, si ya he pulsado el botón de disparo...
else if (Input.GetButtonDown (m_FireButton))
{
// ... reseteo el booleano de dipsaro y la fuerza de disparo.
m_Fired = false;
m_CurrentLaunchForce = m_MinLaunchForce;
// Cambio el clip de audio al de cargando y lo reproduzco.
m_ShootingAudio.clip = m_ChargingClip;
m_ShootingAudio.Play ();
}
//Si no, si estoy manteniendo presionado el botón de disparo y aún no he disparado...
else if (Input.GetButton (m_FireButton) && !m_Fired)
{
// Incremento la fuerza de disparo y actualizo el slider.
m_CurrentLaunchForce += m_ChargeSpeed * Time.deltaTime;
m_AimSlider.value = m_CurrentLaunchForce;
}
//Si no, si ya he soltado el botón de disparo y aún no he lanzado...
else if (Input.GetButtonUp (m_FireButton) && !m_Fired)
{
// ... disparo.
Fire ();
}
}
private void Fire()
{
// Ajusto el booleano a true para que solo se lance una vez.
m_Fired = true;
// Creo una instancia de la bomba y guardo una referencia en su Rigidbody.
Rigidbody shellInstance =
Instantiate (m_Shell, m_FireTransform.position, m_FireTransform.rotation) as Rigidbody;
// Ajusto la velocidad de la bomba en la dirección de disparo.
shellInstance.velocity = m_CurrentLaunchForce * m_FireTransform.forward; ;
// Cambio el audio al de disparo y lo reproduzco.
m_ShootingAudio.clip = m_FireClip;
m_ShootingAudio.Play ();
//Reseteo la fuerza de lanzamiento como precaución ante posibles eventos de botón "perdidos".
m_CurrentLaunchForce = m_MinLaunchForce;
}
}
Para terminar, debemos asociar los diferentes objetos con las variables públicas de nuestro script:
Arrastra el prefab Shell desde Prefabs a la variable Shell
Arrastra el objeto FireTransform a la variable FireTransform
Arrastra el objeto AimSlider a la variable AimSlider
Arrastra la segunda AudioSource de Tank (la que no tiene seleccionado ni Loop ni Play on Awake) y arrástrala a la variable Shooting Audio
Selecciona el clip ShotCharging para la variable Charging Clip
Selecciona el clip ShotFiring para la variable Fire Clip
Asegúrate de que el objeto Tank sigue seleccionado y haz clic en Apply para guardar el prefab.
Ahora tu tanque ya debería poder disparar pulsando la barra espaciadora.
Una vez que hayas probado que todo funciona correctamente, asegúrate de haber aplicado los cambios al prefab Tank, arrástralo a la carpeta Prefabs y por último bórralo de la Hierarchy window (ya que lo crearemos desde el Manager). No te olvides de guardar la escena.
Publicado el 30 de Enero de 2025
Unity2dortográfico