[AUDIO_EN_BLANCO] Una vez creado nuestro terreno vamos a crear un personaje y vamos a darle movimiento mediante el control de teclado. Entonces para ello vamos a crear el personaje que estamos creando, que tenemos creado. Y voy a llamar Player. Y le voy a añadir un componente de tipo Character Controller. Y otro componente que va a ser de tipo MonoBehaviour. Es un New Script. ¿Vale? Entonces lo puedo hacer mediante añadir componente o, directamente, en la carpeta Code que he creado previamente. Voy a crear una nueva carpeta va a ser Game y otra carpeta game la creo en MonoBehaviour de tipo C# script que va a ser PlayerController que va a contener el código para modificar el comportamiento de nuestro enemigo. Entonces, me voy a player, nuestro personaje y añado el componente arrastrando el PlayerController. Si hago doble clic Unity me abrirá mi editor favorito para editar código de scripting este caso el C#. El editor que yo utilizo en este caso es el Mono Develop, que es el que viene por defecto con Unity. Puedes utilizar otros editores como Visual Studio. Pero ya depende de vuestras prioridades o preferencias. Al fin y al cabo lo único que vamos a hacer es editar códigos. Podemos incluso con un editor de texto. Entonces el Mono Develop, como digo, es una herramienta de editor de texto que nos permite editar el código de scripting y tenemos nuestro comportamiento, nuestro MonoBehaviour. Eso es todo. Este caso será el del primer player. Entonces voy a crear una variable que es la velocidad con la que se va a mover. [AUDIO_EN_BLANCO] Y lo que voy a hacer es mover el Character Controller a medida que pulso las teclas. Entonces, para ello voy a coger, voy a crear otra variable que va a ser el Character Controller. [AUDIO_EN_BLANCO] Que lo voy a inicializar en el start y lo voy a inicializar con el componente CharacterController. Entonces para ello, como yo soy un MonoBehaviour, tengo el método GetComponent y le pido del tipo CharacterController y cogerá el componente CharacterController de mi game object. Entonces yo aquí en el update puedo hacer un Move con un motion, o sea con un movimiento. Entonces voy a crear una variable y se va a llamar L_Movement de tipo vector 3. Vale. Entonces, si pulsamos la tecla derecha, ya está pulsada, la tecla derecha. [AUDIO_EN_BLANCO] El movimiento será del eje x. Si pulsamos la tecla izquierda. [AUDIO_EN_BLANCO] Será el eje x pero en negativo. Ahora a confirmarlo. Si en la escena si pulso a la derecha se mueve en esta dirección, si pulso la derecha se mueve en esta dirección. Si pulso hacia arriba quiero que se mueva en la z positivo y si pulso hacia abajo, en la z negativo. Entonces, esto es lo que vamos a hacer. [AUDIO_EN_BLANCO] Vamos a confirmar. [AUDIO_EN_BLANCO] La velocidad, como veis, por decir he puesto un valor de 0 vamos a poner un menos 4, perdón. Lo he hecho en movimiento. Entonces lo que voy a hacer es normalizar el vector y el movimiento va a ser. [AUDIO_EN_BLANCO] [AUDIO_EN_BLANCO] Le voy a llamar L_Direction, el movimiento va a ser la posición actual del objeto, más el vector director por la velocidad, por el tiempo transcurrido desde el último frame. Time.deltaTime Es decir, esto será la fórmula del movimiento rectilíneo, x igual a posición inicial másvelocidad por diferencial de tiempo. Y este es el, perdón. Quitamos la posición porque solo queremos el movimiento. Entonces será el vector director por la velocidad por el delta time. Y eso le da que suba CharacterController. Así, ejecutamos. La velocidad la voy a poner 5 metros por segundo. Ejecuto. [AUDIO_EN_BLANCO] [AUDIO_EN_BLANCO] [AUDIO_EN_BLANCO] [AUDIO_EN_BLANCO] El CharacterController, si lo vemos, si nos fijamos, está metido debajo del suelo. Entonces no lo podemos mover. Entonces tengo que centrarlo más arriba. [AUDIO_EN_BLANCO] Y ahora sí podemos mover al personaje. Bien. Entonces como vemos, el personaje no se orienta. Entonces como queremos que se oriente vamos a hacerlo de la siguiente manera. Si pulsamos a la derecha, queremos que vaya en 90 grados en Y. Si pulsamos a la izquierda, será menos 90. Si pulsamos arriba será 0. Y si pulsamos abajo será 180. Entonces, ¿qué significa esto? Hemos dicho que si pulsamos a la derecha será 90 grados. Bien. Esto quiere decir float L_DesiredAngle igual transform. Ahora voy a coger el valor actual que será el deseado. en caso de que se nos modifique. Rotation.eulerAngles.y que es el ángulo de rotación en el eje Y. Ese es el por defecto. En caso de que pulsemos la derecha, hemos dicho que queremos 90 grados. Por lo tanto será 90. En caso de que sea a la izquierda será menos 90 grados. En caso de que sea hacia arriba será 0 grados. Pero puede ser 0 o 45, o menos 45. Es decir, podemos coger y decir que será si el DesiredAngle es igual a 90. [AUDIO_EN_BLANCO] Será igual a 45.0f. [AUDIO_EN_BLANCO] [AUDIO_EN_BLANCO] [AUDIO_EN_BLANCO] Y si es menos 90 será menos 45, siempre y cuando el ángulo sea el que hemos establecido actualmente. Es decir, se ha establecido en este frame. Entonces, vamos a crear una bandera que va a decirnos que se ha activado este frame. Es decir NewAngle igual a false. Si modificamos el ángulo, lo establecemos acá. Si se ha establecido el ángulo giramos y si no, en caso de pulsar arriba, el ángulo será, hemos dicho, 0. [AUDIO_EN_BLANCO] Y luego, en caso de que sea hacia abajo será similar a esto que hemos hecho. Si no es nuevo ángulo, será 180 grados. Firmamos. Si vamos hacia la derecha será 135 y si vamos hacia la izquierda 225. Bien. Entonces quiere decir 225 y 135, hemos dicho. Es decir, si vamos a la derecha, si vamos a la izquierda será 225, si vamos a la izquierda el ángulo que estamos dando es menos 90. Y si vamos a la derecha es 135. Confirmamos y por último hay que establecer rotation igual la quaternion.rotation.euler igual a 0.0f, el DesiredAngle, ¿vale? Entonces con esto conseguiremos establecer el ángulo, esta rotación de nuestro personaje. Si ejecutamos. Si giramos hacia la izquierda, el ángulo que miro es hacia la izquierda, la derecha, arriba, abajo diagonal arriba a la izquierda, diagonal arriba a la derecha, diagonal abajo a la derecha y abajo a la izquierda, por lo tanto está funcionando correctamente. Entonces, si quisiéramos que no fuera tan tan brusco el cambio de orientación podríamos hacer un un lerp, que es una transformación lineal entre los dos ángulos para que fuera más suave. Entonces para ello vamos a coger y vamos a hacer el transform.rotation, vamos a hacer quaternion.lerp entre el ángulo actual, es decir transform.rotation la posición actual, la rotación que deseamos y el tiempo. El tiempo es un valor entre 0 y 1. Es decir, 0 será la rotación actual y un 1 será la rotación deseada. Entonces lo que vamos a hacer es, para hacerlo por el elapsed time vamos a bajar el Time.deltaTime y vamos a decir dividido entre 0.3f. Y queremos siempre que no sea mayor de 1. Entonces, lo que estamos haciendo aquí es, va a tardar 3 décimas de segundo en hacer la re orientación. Y si no, según el elapsed time, es un poco más grande 0.4 segundos. Pues ahora ejecutamos, damos a play. [AUDIO_EN_BLANCO] Vemos como el personaje se reorienta en la posición que deseamos, pero no tan brusco como hemos hecho antes. Se puede mejorar pero de momento es lo que hemos hecho. Entonces eso sería nuestro motor de personaje actualmente. [AUDIO_EN_BLANCO]