Disparo de bola de fuego en VR

Clase 17 de 33Curso de VR con Unity

Resumen

Domina el disparo de una bola de fuego desde la vara en Unity con un flujo claro: carga automática en la punta, verificación de cooldown, cálculo de fuerza según el movimiento de la mano, desacople del padre, físicas con impulso y cambio de audio en el disparo. Todo pensado para que la mecánica se sienta potente y consistente.

¿Cómo se carga y se dispara la magia con cooldown?

Al equipar la vara, se instancia la bola de fuego en el Magic launch point de la punta. El disparo se realiza con el trigger derecho solo si el magic cooldown supera el magic cooldown time de 2 segundos. Antes de disparar se valida que exista current magic para evitar errores.

  • Instanciar la magia en el Magic launch point de la vara.
  • Verificar que current magic no sea nulo antes de disparar.
  • Controlar magic cooldown y compararlo con magic cooldown time de 2 s.
  • Disparar al pulsar el trigger derecho cuando el cooldown lo permita.
  • Reiniciar el cooldown a cero tras el disparo.

¿Cómo se calcula la dirección y la fuerza del lanzamiento?

Se rastrea la mano derecha para obtener una velocidad de lanzamiento realista. Se guardan las posiciones previas y actuales de ambas manos con last position right y last position left, actualizándolas al final de Update. La dirección y fuerza salen de la diferencia de posiciones dividida por Time.deltaTime.

  • Actualizar al final de Update: última posición de mano derecha e izquierda.
  • Calcular velocidad: espacio/tiempo con la posición actual menos la anterior.
  • Escalar la fuerza multiplicando el vector por 20, 50 o 100 si es necesario.
  • Conseguir un lanzamiento largo y visible, no dependiente solo de la fuerza real del usuario.

Ejemplo del cálculo en C#:

// Al final de Update: lastPositionRight = rightHand.transform.position; lastPositionLeft = leftHand.transform.position; // Al disparar: Vector3 force = (rightHand.transform.position - lastPositionRight) / Time.deltaTime; force *= 20f; // ajustar a 50f o 100f si hace falta más alcance

¿Cómo se desacopla la bala y se aplican físicas y audio?

Antes de aplicar la fuerza, la bola de fuego debe dejar de ser hija de la vara. Luego se eliminan las constraints del Rigidbody y se aplica la fuerza como impulso. Finalmente, se cambia el sonido: de un fuego ambiente en la punta a un disparo potente con PlayOneShot.

  • Desacoplar el padre: currentMagic.transform.parent = null.
  • Quitar restricciones: GetComponent<Rigidbody>().constraints = RigidbodyConstraints.None.
  • Aplicar fuerza instantánea: AddForce(force, ForceMode.Impulse).
  • Dejar que la gravedad actúe tras el impulso para una trayectoria natural.
  • Cambiar el audio de ambiente a disparo con PlayOneShot.
// Desacoplar y liberar físicas currentMagic.transform.parent = null; var rb = currentMagic.GetComponent<Rigidbody>(); rb.constraints = RigidbodyConstraints.None; rb.AddForce(force, ForceMode.Impulse); // Audio de disparo var audio = currentMagic.GetComponent<AudioSource>(); AudioClip clip = Resources.Load<AudioClip>("audio/fire shoot seis"); audio.PlayOneShot(clip);

¿Qué implica usar impulso en lugar de fuerza continua?

  • Impulso: toda la fuerza en un instante para un “efecto cañonazo”.
  • Fuerza continua: empuje sostenido que acelera la bola durante un tiempo.
  • En este caso conviene el impulso para un disparo inmediato y contundente.

Habilidades y conceptos reforzados:

  • Gestión de cooldowns para equilibrar el juego: intervalo de 2 s.
  • Cálculo de velocidad con posiciones consecutivas y Time.deltaTime.
  • Control de jerarquías en escena: separar padre e hijo antes de aplicar físicas.
  • Dominio de Rigidbody y constraints para liberar movimiento.
  • Uso de AddForce con ForceMode.Impulse para aplicar fuerza instantánea.
  • Audio reactivo con AudioSource.PlayOneShot y carga con Resources.Load.

¿Te gustaría que revisemos juntos por qué la vara no se recarga tras el primer disparo y cómo depurarlo paso a paso?