Programación de Disparo de Bola de Fuego en Videojuegos 3D
Clase 17 de 33 • Curso 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 derightHand.transform.position
lastPositionLeft
, a la que le hemos asignado el valor deleftHand.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>)