Programación de Disparo de Bola de Fuego en Videojuegos 3D

Clase 17 de 33Curso de VR con Unity

Resumen

Para calcular la fuerza (o velocidad) a la que debemos lanzar un proyectil, necesitamos conocer primero la diferencia de posición en que se encuentra el control derecho en dos momentos.

Para ello hemos definido antes, al final del método Update(), en el script de weapons, dos variables particulares:

  • lastPositionRight, a la que le hemos asignado el valor de rightHand.transform.position
  • lastPositionLeft, a la que le hemos asignado el valor de leftHand.transform.position.

Nótese que todos los objetos tienen la propiedad transform, que nos dan acceso a position, scale y rotation, entre otras.

La fuerza con la que se hará el lanzamiento del proyectil debe ser definida como una variable de tipo Vector3, ya que es este el tipo de valor que podremos utilizar luego para indicar el impulso con el que será disparada la magia.

Debemos tener en cuenta que hemos definido antes la magia de fuego como un objeto hijo del arma alternativa, con una componente Rigid Body con _constrains en x, y y z que la mantendrían vinculada a la posición de esta, por lo que al salir disparada, debemos desvincularla para que sea entonces un objeto independiente y su desplazamiento sea autónomo. Esto lo hacemos asignando a la propiedad <GameObject>.transform.parent el valor de null y al <GameObject>.GetComponent<Rigidbody>().constraints el valor de RigidbodyConstraints.None.

Finalmente para lanzar el proyectil, le aplicamos a la instancia de la bola de fuego creada al presionar el trigger en el control, la fuerza que hemos calculado antes, para lo cual usando la función: <GameObject>.GetComponent<Rigidbody>().AddForce(<vector de fuerza>, ForceMode.Impulse). El parámetro ForceMode.Impulse indica a la función que el vector pasado debe ser aplicado como una velocidad inicial (un impulso) y no como una aceleración, que tendría un comportamiento diferente.

Para cambiar el efecto de sonido de la magia al momento de dispararla y reproducirlo tan solo una vez, usamos la función <GameObject>.GetComponent<AudioSource>().PlayOneShot(<AudioClip>)