[SONIDO] Seguimos ahora con nuestra bola que es un prefab. Tenemos aquí una instancia de prueba, nuestra instancia bola o nuestro prefab bola pues responde sobre todas las físicas pero también tiene dos scripts move to closest y ball controller que nos va a permitir hacer cosas especiales que se salen del comportamiento físico. El primer comportamiento que no es físico es cuando hacemos que esas bolas suban por esta rampa, esto lo vamos a hacer por medio de este move to closest y ya vamos a ver qué hace ball controller. Entonces vamos a ver move to closest primero. Entonces nuestro move to closest nos va a permitir encontrar dos puntos que están en este, en esta rampa, nosotros hemos definido dos puntos acá arriba, hemos definido dos puntos especiales, vamos a tratar de ver dónde están esos puntos arriba de la olla hasta donde queremos que se muevan las bolas. Entonces, apenas lleguen las bolas acá abajo y encuentren una colisión con la rampa queremos que empiecen a subir hasta alguno de estos dos puntos, el que esté más cercano a la bola en ese momento. ¿Pues cómo hacemos eso? Nuestra bola tiene este script, este script va a revisar cuando está en colisión con algo, cuando entra con un collider, con un trigger. Por supuesto pues nuestra rampa tiene un trigger lo podemos ver acá bench special tiene un mesh collider y ese mesh collider es un trigger. Y en ese momento comenzamos esa animación queremos hacer que se sale de la física. Y la animación que se hace pues desde el momento que se encuentra la colisión es ir subiendo y aquí lo vemos en el update, ir subiendo esa rampa, ir cambiando su posición conforme va pasando el tiempo. Aquí entonces volvemos a utilizar una función lerp o de interpolación, en este caso una interpolación de vectores de 3 dimensiones, antes habíamos visto una interpolación en el caso de un float y esta es una interpolación esférica. Pueden ver ustedes el detalle, hay lerp y hay slerp que es spherical lerp, para que vean un poco más los detalles de cómo se hace la interpolación. Aquí podríamos realmente utilizar también lerp. Vamos desde una posición inicial desde donde comenzó la colisión a una posición final y aquí vamos moviéndonos desde un tiempo inicial a un tiempo final de ese movimiento. En el fix update en la parte física nos damos cuenta cuando llegamos arriba, en el momento en que llegamos arriba queremos resetear todos los parámetros del RigidBody, o sea no hay velocidad, no hay velocidad angular no hay drag, no hay tensor y en ese momento pues queremos que empiece de nuevo a comportarse de manera física y por lo tanto pues caiga dentro de la olla, que es lo que queremos en este momento simular. El siguiente script es el que denominábamos ball controller. Aquí entonces tenemos otros elementos adicionales. Queremos darnos cuenta cuando se toca el fondo de la olla, queremos darnos cuenta cuando se destruye la ola, y eso pues entonces son eventos que vamos a registrar desde acá. Y nuestro código hace varias cosas, vamos a ver sobre todo lo que hacemos cuando queremos que nuestra bola al llegar al fondo de la olla se vuelva transparente y empiece a subir hasta cierto punto. Entonces, lo vemos acá cuando tenemos una colisión con lo que denominamos fondo olla, y allá en la olla hemos puesto un cilindro que lo llamamos de esa manera que es un trigger. Hacemos que nuestra bola sea un fantasma, lo llamamos aquí make ghost, aquí lo vemos, ese básicamente que ahora es kinemático o sea, no va a responder a las leyes de la física, cambiamos el color y cambiamos el alfa para hacerlo transparente. Y desde ese momento comenzamos a decir que estamos flotando, floating to generator rampa que es de la parte de abajo de la olla hacia la rampa ir flotando e ir interpolando la posición entre esos dos puntos. Y generando pues el evento de un fondo de olla que podría utilizarse por ejemplo para un evento de sonido en ese momento. ¿Qué hacemos entonces mientras estamos moviéndonos? Si estamos en ese estado flotando alrededor de la rampa entonces hacemos una interpolación desde la posición inicial que esta en el fondo de la olla ala posición final que está en la rampa. Y aquí vemos de una posición inicial al generador rampa que es donde vamos a poner nuestra bola cuando termine la, el movimiento, hacemos ese movimiento y cuando terminemos el movimiento o sea, el tiempo pues ya es uno en esa interpolación que estamos haciendo, entonces ya no estamos en ese estado, ya no queremos que sea fantasma y hacemos un reset, ya no queremos que se vea como fantasma queremos que se vea sólida y que empiece de nuevo a responder a los eventos de la física. Seguimos ahora con el fonógrafo, entonces nuestro fonógrafo dentro del locker versión uno tenemos nuestro fonógrafo bien bonito, pues una geometría interesante que conseguimos gratuita. Y vemos acá un script que tenemos el control fonógrafo. Entonces hemos llegado a nuestro control fonógrafo. Este control hace que la canción suene más y más lento, hasta que reciba un evento de bola destruida, cuando una bola se colisione con el fonógrafo, en este momento queremos que la velocidad de la canción vuelva a ser normal. El código pues hay varias cosas que ustedes pueden ver, cuando empezamos, empezamos a registrar un evento que queremos llamar de una manera periódica, lo registramos solo una vez para más adelante registrarlo de nuevo. Entonces aquí decimos que queremos correr el método Decrease Pitch cuando pasa un time out bola. Si vemos Decrease Pitch lo que vamos a hacer es ir reduciendo, aquí lo denominamos curPitch. Ir reduciendo eso por un deltaPitch cada vez que llamemos este método hasta un mínimo, en ese mínimo pues ya no lo seguimos reduciendo. Y si hay un audio mixer registrado que es el que tiene el sonido de este, de esta canción con el efecto de sonido que le hemos puesto. ya ustedes pueden ver en este módulo que es un audio mixer, entonces vamos a ponerle un parámetro que es el pitch al cual queremos que suene esta canción. Y de nuevo, si este método se llamó queríamos invocarlo de nuevo. Entonces se va invocando de manera periódica pero no se registra de una vez, sino simplemente cada vez que se llame el método se vuelve a registrar el siguiente. Ahora, si en algún momento y por eso es que aquí vemos que estamos escuchando el evento con bola destruida, si en algún momento viene una bola y se colisiona con nuestro, con nuestro fonógrafo entonces vamos a llamar esos métodos de bola destruida, en particular que tenemos acá registrado. Entonces lo primero que hacemos es un CancelInvoke, entonces si había un llamado recurrente a decreasePitch no lo hagan y lo que queremos es, si hay un audio mixer, de nuevo poner el pitch en 1, que es el máximo la velocidad normal, ponerlo allá como el parámetro y al final empezar el conteo de nuevo, el time out para decrementar si no vienen nuevas bolas. Entonces si se van registrando bolas se vuelve a poner el pitch en 1 y se vuelve a esperar 2 segundos, si no llegan bolas se llama decrease pitch y se empieza a reducir el pitch en cada llamada. Por último entonces tenemos nuestro multipurpose camera rig, que es la cámara que estamos utilizando en este caso para seguir a nuestro personaje. Es un prefab como ustedes lo saben de standard assets, ya vienen con 2 scripts, third person user y third person character que nos permiten ubicar por supuesto la cámara detrás de nuestro objeto. Y aquí le hemos agregado pues a nuestro personaje el cambio cuadro que ya habíamos visto. Eso es todo. Si vemos se utiliza extensivamente la física de Unity para hacer que las bolas y los demás objetos se comporten como deberían comportarse y cuando se necesita un comportamiento especial se hace por medio de un script. Espero esto te sirva como base para desarrollar tu comportamiento de tu nivel. Que te rinda y mucha suerte.