me gustaría hacer videojuegos pero eres un poco lento has intentado aprender por tu cuenta pero no das para tanto para los retrasados como tú y como yo intentar hacer cosas es duro pero no te preocupes porque si yo lo conseguí tú también puedes hacerlo cuando quieres hacer un videojuego por muchos tutoriales que sigas hay cosas que vas a tener que aprender por ti mismo porque son específicas del juego que estás intentando hacer por ejemplo cuando yo quise hacer mayor y no pude seguir una guía que me explicase paso a paso cómo hacer un mayor y porque es un juego que no existía las bases las vas a poder aprender con tutoriales pero en cuanto quieras ir un poco más allá vas a estar solo y vas a tener que aprender por ti mismo cómo hacer lo que quieres hacer una de las peores partes era empezar a usar unite y es que es muy fácil quedarse atascado con tonterías que tiene una solución muy fácil si sabes cuál es pero si no las cuales vas a estar horas y horas intentando mil cosas que no funcionan y dando de cabezazos contra el juego hasta que lo consigas porque claro la gente como tú y como yo somos demasiado retrasados como para leer nos la documentación y entenderla en este tutorial no voy a enseñarte cómo hacer un tipo de juego en concreto ya existen muchos tutoriales para eso pero sí voy a enseñarte a hacer cosas generales de una forma en la que entiendas la lógica de lo que están haciendo para que te sea más fácil cosas diferentes sin quedarte atascado tan rápido empecemos aquí tengo un nuevo proyecto dos de abierto en la versión de unity 2018 punto 2 que es la más reciente en el momento de grabar este vídeo este de aquí es la escena aquí es donde saltan listados los objetos de la escena tenemos ya una cámara y el event system que no vamos a tocarlos de momento aquí está el inspector que nos permitirá manipular información sobre los objetos y aquí abajo tenemos un explorador y otras pestañas todo esto lo puedes mover y recolocar lo como a ti te guste lo primero que vamos a hacer es poner un personaje en esta escena aquí es donde mucha gente comete el primer error y es que dicen un personaje es una imagen así que hago clic derecho aquí busco la opción de crear una imagen y aquí está pero este no es el tipo de imagen que nosotros queremos esto es una imagen de uruguay que es para hacer interfaces y menús y si intentamos hacer un personaje con esto no va a funcionar nada lo que vamos a hacer en su lugar es crear un objeto vacío y le vamos a llamar player una cosa que no te suelen explicar es que casi cualquier tipo de objeto se puede crear a partir de un objeto vacío añadiéndole los componentes necesarios aquí en el inspector podemos ver que nuestro objeto vacío ahora tiene un solo componente que es el transform que contiene la posición la rotación escala si queremos añadirle una imagen en este caso un sprite le damos a añadir componente y buscamos el componente space render este componente tiene muchos parámetros pero lo que nos interesa ahora es el sprite que está vacío para ponerle la especie queremos vamos a navegar a la carpeta sprites que ya he preparado antes y vamos a arrastrar el spread que queremos a la casilla sprite si le damos doble clic al objeto le hará zoom hasta que se vea otra forma de crear un objeto con sprite es arrastrar el espai directamente a la escena como vemos se crea un objeto con un transforming space render con el spa ya puesto pero quería que entendiese es cómo funcionan los componentes porque nuestro personaje se ve tan borroso porque el programa por defecto está suavizando la imagen pero nosotros estamos usando pixel art así que queremos los bordes nítidos sin suavizado para arreglar esto tenemos que seleccionar el sprite y cambiar las opciones de importación aquí en filter mode que está en mi línea le vamos a decir que lo cambie a point y le damos a aplicar ahora a nuestro personaje de no sé de borroso lo que sí que pasa es que es minúsculo si reducimos el zoom con la rueda del ratón podemos ver que el recuadro de la cámara es enorme en comparación con el personaje arreglar esto tenemos dos opciones una es aumentar la escala del personaje aquí en la x le decimos que sea cien veces más ancho y en la y que sea cien veces más alto la zeta en la profundidad pero los sprites son planos así que no sirve de nada tocarla sin embargo esta solución no es ideal porque tendremos que aumentar el tamaño de todos los objetos para que se vean bien en su lugar lo que queremos es configurar correctamente el tamaño de la cama y el tamaño de importación de los sprites si vamos a la cámara podemos ver que tiene un tamaño de 30 unidades si vamos al sprite podemos ver que tiene un tamaño de 100 píxeles por unidad la cámara tiene 30 unidades y le estamos diciendo que muestre 100 píxeles por unidad así que nuestro personaje que mide poco más de 10 píxeles es prácticamente invisible como estamos haciendo pixel art le vamos a decir que queremos enseñar un píxel por unidad y ahora como un píxel equivale una unidad el tamaño de la cámara será equivalente a la resolución en píxeles que queremos para nuestro juego como los space que estoy usando tienen una resolución muy baja le vamos a dejar el tamaño a 30 y ahora le damos al play podemos ver a nuestro personaje en la pantalla fíjate que le hemos dicho que el tamaño de la cámara es de 30 unidades pero la cámara es más ancha que alta esto es porque el tamaño al eje vertical es decir la cámara va a tener siempre 30 unidades de arriba a abajo pero el ancho depende del tamaño de la pantalla si lo hacemos más pequeña tendrá menos unidades y si lo hacemos más grande tendrá más unidades esto es algo que habría que solucionar luego por código si queremos que la resolución horizontal sea fija pero de momento podemos tener una previsualización fija cambiando aquí donde pone fría aspect por una relación de aspecto que nosotros queramos o creando una propia con la cruz de aquí abajo yo lo voy a dejar en 16 9 que es lo más normal ahora que ya tenemos un personaje que se ve bien vamos a hacer que se mueva para eso necesitamos programar código vamos a crear una carpeta scripts para tener nuestro proyecto organizado y dentro le vamos a decir que cree un nuevo script de fiserv y le vamos a llamar player controller un script nuevo viene por defecto con dos funciones startup de estas se ejecuta una sola vez cuando se activa este script update se ejecuta una vez por frame lo primero que vamos a hacer es simplemente decirle que se mueva 20 unidades a la derecha al empezar el juego para hacer que pasen cosas en yuty la mayoría de las veces lo que vamos a querer hacer es modificar un parámetro de un componente si volvemos a la escena podemos ver que el parámetro que queremos modificar es la posición x es la horizontal y este parámetro está en el componente transform volviendo a nuestro script como este script se lo vamos a meter a nuestro objeto player podemos hacerle referencia escribiendo game object en minúscula esto quiere decir el game o diet dentro del cual está este script ahora ponemos un punto y le decimos que queremos el componente transform the game o el jet del componente transform queremos el parámetro position y del position queremos el eje x y le decimos que sea igual a 20 esto va a dar un error porque por varios motivos que no nos interesan no podemos modificar el valor x de la posición de forma individual el parámetro posición sólo acepta un vector de posición así que en su lugar le decimos que position es igual a new vector free ahora dentro de los paréntesis tenemos que poner tres parámetros la x la y y la z así que vamos a decir que x sea 20 y llegase a 0 y z sea 0 ahora si guardamos el script volvemos al juego y le damos al play vemos que no pasa absolutamente nada este es un fallo que ocurre constantemente y es que nos hemos olvidado de añadir el script al objeto así que vamos a arrastrar selo encima y ya podemos ver que tiene un nuevo componente qué es el script player controller ahora si le damos al play vemos que el personaje se mueve 20 unidades a la derecha pero en realidad no se está moviendo 20 unidades a la derecha sino que se está moviendo a un punto en concreto de la escena si cambiamos la posición inicial del personaje y le damos al play vemos que el personaje vuelve a la misma posición x 20 y 0 para hacer que se mueva 20 unidades a la derecha tenemos que añadir 20 unidades a su posición actual primero un pequeño truco y es que el componente transform tiene un atajo que nos permite escribir transform directamente sin tener que buscar el componente y así nos queda más corto ahora en vez de decirle que la posición x sea 20 le vamos a decir que sea la posición x actual + 20 game o diet punto transform punto position punto x + 20 y que la posición y y la posición z sean la misma que ya tiene game jet punto transform punto position punto y y game o jet punto transform punto position punto z volvemos al juego y vamos a separar la pestaña game y ponerle aquí a un lado para poder ver mejor que al darle al play el personaje se mueve 20 unidades a la derecha desde su posición inicial ahora vamos a ir un paso más allá y a decirle que en vez de moverse una sola vez se mueva cada frame vamos a esta línea y la vamos a poner en la función de it en vez de en la función start si se mueve 20 unidades cada frame va a salirse de la pantalla en una fracción de segundo así que vamos a cambiar el 20 por un 0.1 recordad que como el número decimal es un flow hay que ponerle una vez y al final guardamos el script volvemos al juego y le damos al play ahora podemos ver cómo se mueve poco a poco antes de continuar tengo que explicar algo que es importante por un poco confuso un juego se mueve a varios frames por segundo pero esa cantidad de frames por segundo puede variar debido a varios factores por ejemplo lo rápido que sea el ordenador entonces si le decimos que el personaje se mueva a 0,1 unidades por frame en nuestro ordenador que va a 60 frames por segundo si lo jugamos al juego en un ordenador más lento que va solo a 30 frames por segundo el personaje se moverá el doble de lento para evitar esto tenemos que usar time punto delta time time punto delta time nos devuelve cuántos segundos ha tardado en renderizar se el último frame en vez de ponernos a hacer matemáticas simplemente créeme cuando te digo que la solución es multiplicar la distancia que vamos a avanzar por time punto delta time ahora la velocidad a la que se mueve el personaje va a ser la misma independientemente de la velocidad a la que vayan los frames esto ahora significa que el personaje avanzar 0.1 unidades por segundo esto es lentísimo así que vamos a cambiarlo por 50 unidades vamos a dejar escrita la f aunque el número no sea un decimal porque así queda más claro a simple vista qué números son float y qué números son integre este en su opción tan larga que estamos usando para mover al personaje también tiene un atajo que es escribir transform punto translate y entre paréntesis decirle directamente cuánto queremos que se mueva respecto a su posición actual ahora en vez de hacer que el personaje se mueva solo lo que vamos a hacer es que se mueva cuando pulsamos una tecla hay varias formas de hacer eso pero en este tutorial vamos a ir por la más simple que es comprobar en cada frame si estamos pulsando una tecla o no y ya estamos pulsando le decimos que mueva el personaje hacemos un ir y en los paréntesis ponemos input punto getty left esto será true si la tecla left que es la flecha izquierda está pulsada y dentro decimos que se mueva menos 50 unidades por segundo o séase hacia la izquierda debajo hacemos otro igual pero este para la tecla right y moviéndose hacia la derecha y volvemos al juego ahora podemos controlar nuestro personaje con las flechas de izquierda y derecha vamos a hacer ahora que salte hay mil formas de hacerlo y tienes que experimentar y encontrar la que mejor se adapta a lo que quieres hacer pero vamos a hacer una rápida y cutre de ejemplo vamos a crear una nueva función manás jump para tener el código un poco más ordenado y un booleana can't jump para poder controlar que el personaje solo pueda saltar cuando está en el suelo dentro de manás jump lo primero que le vamos a decir es que si la y del personaje es menor o igual a 0 es decir si está tocando el suelo que en jump sea igual a true por qué decimos menor o igual a 0 en vez de igual a 0 porque al caer después del salto puede que el personaje no aterrice exactamente en la posición 0 sino que se quede unas décimas por debajo y esta es una forma rápida de hacer que funciona igualmente aquí debajo añadimos otro y que diga si estás pulsando la tecla up y can't jump es true y la altura del personaje es menor que 10 haz que se mueva hacia arriba si estas condiciones no se cumplen haz que can jump sea igual a falls y si la y del personaje es mayor que 0 es decir que el personaje esté en el aire hace que hacia abajo si grabamos y le damos al pay podemos ver que ahora al pulsar la flecha hacia arriba el personaje sube hasta que llega a 10 unidades de altura y luego baja y si soltamos la tecla antes de que llegue algo más alto también vuelve a bajar ahora que ya sabemos cómo mover a un personaje de forma manual vamos a borrar todo esto y hacer lo mismo pero usando físicas para usar física necesitamos dos componentes el primero es el rip it body tudi que es el que va a aplicarle las físicas en sí y ahora le damos al play podemos ver que el personaje cae porque le está afectando la gravedad el otro componente que necesitamos es un colíder to be que es el que definirá el contorno del personaje para que se pueda chocar con otros objetos hay muchos tipos de colíder para adaptarse a diferentes formas pero ahora vamos a usar el box cold aire del tuy iv que es simplemente un rectángulo voy a añadir este sprite que no es más que un cuadrado en blanco para usarlo como suelo lo estiramos para que cubra la parte de baja de la pantalla y le añadimos un box colíder to be al suelo no hace falta que le añadamos un try it body porque el suelo no se va a mover así que no tiene que afectarle la gravedad y ahora le damos al play y podemos ver que el personaje baja hasta que se choca con el suelo pasemos a hacer que se mueva pero esta vez en vez de decirle cuántas unidades tiene que avanzar vamos a añadirle fuerzas físicas para eso esta vez tenemos que acceder al componente ready to be y lo que le vamos a decir es que añada una fuerza con force esta función espera que le pasemos un vector con dos parámetros la fuerza en el eje xy la fuerza en el eje y para eso le pasamos un new vector to en el que la fuerza para el eje x sea menos mil por time punto delta time y la fuerza para el eje i sea cero necesitamos pasar de tanta fuerza porque juniti viene configurado por defecto asumiendo que una unidad equivale un metro como nosotros estamos haciendo que cada pixel mida una unidad es como si cada pixel mide un metro así que tenemos que añadirle mucha fuerza para poder ver que el personaje se mueve hacemos lo mismo para la flecha derecha pero con fuerza positiva y ya podemos darle al play y ver cómo se mueve no está como ahora si queremos cambiar de dirección tarda mucho en hacerlo esto es porque primero tiene que frenar toda la fuerza que llevaba en la dirección contraria también podemos ver cómo después de soltar las teclas el personaje sigue moviéndose solo hasta que se frena su fuerza al cabo de un rato para solucionar esto podríamos hacer un código que frene al personaje cuando no estamos tocando ninguna tecla pero en su lugar vamos a hacerlo también con físicas cambiando el parámetro linear track de su ritmo de tu di lo que indica el parámetro drack es como de rápido se frenan sus fuerzas de movimiento el parámetro angular drag es lo mismo pero para fuerzas de rotación pero no estamos rotando el personaje así que de momento no nos interesa si ponemos en línea la draga 1 ahora podemos ver que el personaje se frena mucho más rápido pero también se mueve mucho más lento porque ahora la fuerza que le estamos aplicando está siendo frenada constantemente en vez de cambiar la cantidad de fuerza que le aplicamos al objeto podemos reducir su masa ahora el personaje se mueve mucho más rápido pero vuelve a tardar mucho en frenar si seguimos jugando con los valores de la masa y el freno podemos encontrar algo que funcione como nos gustaría en este caso con una masa de 0.01 y un linear track de 10 se mueve rápido y también frena rápido el problema ahora es que tarda mucho en caer al suelo esto es porque su masa es muy pequeña en comparación con su gravedad así que vamos a aumentar el parámetro gravity scale a 100 ahora ya que haya una velocidad decente estoy tocando todo esto para enseñar cómo funciona pero en un proyecto de verdad probablemente te convendría más modificar el código o la cantidad de píxeles por unidad para que el protagonista no tenga que pensar un gramo y tener 100 puntos de gravedad porque si mantienes relaciones reales te será más fácil añadir nuevos objetos y saber cómo de pesados o ligeros tienen que ser en vez de multiplicar tanto la gravedad otra cosa que podríamos hacer es ir a edith project settings physics to be y cambiar el valor de la gravedad por defecto está puesto menos 9 con 81 que es el valor de la gravedad en la tierra pero como en nuestro juego cada centímetro tiene casi el tamaño de un metro vamos a hacer la gravedad cien veces más pesada ahora con una escala de gravedad de 1 nuestro personaje pesado suficiente para evitar futuros quebraderos de cabeza tienes que saber que las físicas no son perfectas y entender más o menos cómo se calculan mira lo que pasa si ahora le ponemos una escala de gravedad de 100 y le damos al play el personaje desaparece porque pesa tanto que ha atravesado el suelo esto es por la forma en la que se calculan las físicas lo que ocurre básicamente es que en cada frame el juego mueve el personaje la cantidad correspondiente a las fuerzas que tiene y comprueba si está chocando se con algo en el siguiente frame vuelve a moverlo y vuelve a comprobar si se está chocando con algo y así hasta que detecte que se está chocando contra el suelo y lo frene pero qué pasa si la fuerza es tan grande que la distancia que recorre de un clima a otro es tan grande que atraviesa el suelo sin tocarlo pues como hemos visto antes pasa exactamente son que el personaje atraviesa el suelo para intentar arreglar esto podemos cambiar la detección de colisión de su rigidez body de discreta a contínua haciendo esto el juego comprobará cada frame si entre la posición anterior del personaje y la nueva había algo que se ha saltado y recalcular a las físicas para arreglarlo ahora nuestro personaje ya no atraviesa el suelo pero como dije antes las físicas no son perfectas y depende de lo que hagamos pueden pasar cosas raras como estas que nos cuesta entender y que a lo mejor no tienen solución vamos a hacer ahora que el personaje salte esta vez será más fácil porque solo tenemos que darle una fuerza inicial y la gravedad hará el resto en vez de que vamos a usar get down porque que tira un solo se active en el momento en el que se pulsa la tecla y no todo el rato mientras la tecla permanece pulsada como el salto va a aplicar una fuerza en un único frame y no de forma continua no necesitamos multiplicar la por delta time pero tenemos que hacerlo un poco más pequeña para compensar vamos a dejarla en 100 ahora ya podemos comprobar como nuestro personaje es alta pero va a saltar cada vez que demos a la tecla y no sólo cuando esté en el suelo soluciona esto ahora es un poco más complicado de nuevo hay varias maneras de hacerlo pero la que vamos a usar es detectar cuando el colíder del personaje se choca con dent colíder del suelo lo primero que vamos a hacer es añadirle un tag al objeto del suelo aquí arriba elegimos attack y creamos un tag volvemos al objeto y le añadimos la etiqueta que acabamos de crear ahora en el código del personaje vamos a crear una función en colisión enter to be esta función se llama automáticamente cuando el colíder del objeto se choque con otro colíder y le pasa a la variable colisión que hace referencia al colíder con el que se ha chocado creamos un volea en can't jump le decimos que sólo salte si camps es true y que cuando salte lo ponga falls y en la función and collision le decimos que si el tag del objeto colisión que está en transform es igual a ground can't jump sea true ahora nuestro personaje solo salta si ha tocado primero el suelo sabes porque sé que soy porque acepte hacer este tutorial pensando que no sería tan difícil y ahora me quiero morir y eso que solo enseñado una pequeña parte de lo que me gustaría vamos a tener que dividir esto en diferentes vídeos así que nos vemos en el siguiente [Música]