jairogarcíarincón

Morir

Para que el personaje se muera al pisar una trampa, evidentemente lo primero que necesitamos es la trampa.

Crea un Quad de color rojo en cualquier parte de la escena, llámalo Trampa y aplícale las propiedades Convex e Is Trigger a su Mesh Collider:



A continuación debemos añadir el booleano isDead y modificar el Animator para añadirle las transiciones necesarias (solo de ida):

  • Quieto a Morir
  • Andar a Morir
  • Correr a Morir
  • Saltar a Morir
  • Pegar a Morir
  • Trabajar a Morir


En todas ellas, la condición siempre será la misma, que IsDead sea true. Además, como en casos anteriores, desactivaremos la propiedad Has Exit Time. Como ejemplo, esta sería transición de Quieto a Morir:



Y este sería el resultado del Animator final:



Y en JugadorController, añade el método OnTriggerEnter para que se muera cuando pise la trampa:


//Morir: Se ejecuta al entrar a un objeto con la opción isTrigger seleccionada
void OnTriggerEnter(Collider other)
{

if (other.gameObject.CompareTag("Trampa"))
{
//Reproduzco la animación de morir
animator.SetBool("isDead", true);
//Deshabilito el script para que ya no se mueva más
GetComponent<JugadorController>().enabled = false;

}

}


El problema es que el jugador se queda "flotando en el aire" ya que su Collider es fijo. Para resolverlo, capturaremos el BoxCollider del Jugador y modificaremos su Collider en tiempo de ejecución (en el script) mediante una coroutine a la que llamaremos desde OnTriggerEnter:


//Variable para capturar el BoxCollider (antes del Start)
BoxCollider boxCollider;

void Start(){

//Resto de código

//Capturo el componente boxCollider del Jugador al empezar el juego
boxCollider = GetComponent<BoxCollider>();
}

//Se ejecuta al entrar a un objeto con la opción isTrigger seleccionada
void OnTriggerEnter(Collider other)
{

if (other.gameObject.CompareTag("Trampa"))
{
//Reproduzco la animación de morir
animator.SetBool("isDead", true);
StartCoroutine(cambiarCollider());
//Deshabilito el script para que ya no se mueva más
GetComponent<JugadorController>().enabled = false;

}

}

//Cambiar tamaño del collider tras un tiempo
IEnumerator cambiarCollider()
{
//Espero 2 segundos
yield return new WaitForSeconds(2.0f);

//Cambio el tamaño del collider para que se apoye en el suelo
boxCollider.size = new Vector3(boxCollider.size.x, 0.66f, boxCollider.size.z);
}

//Cambiar tamaño del collider tras un tiempo de forma gradual
private IEnumerator cambiarColliderGradual()
{
//Espero 2 segundos
yield return new WaitForSeconds(2.0f);

//Valor final
float valorFinal = 0.66f;

while (boxCollider.size.y > valorFinal)
{
//Voy bajando el tamaño del size en y
boxCollider.size -= new Vector3(0, 50 * Time.deltaTime, 0);
yield return null;
}


}


Como ves, se presentan dos soluciones diferentes, una más gradual que la otra.

Ejercicio propuesto 7
Añade unos bloques/elementos a la escena que obstaculicen al jugador y la interactividad necesaria para que pueda destruirlos con el botón de pegar (cuya animación se debe reproducir en ese momento, claro).


Publicado el 02 de Diciembre de 2021

unityanimaciónhumanoide3d