1 00:00:07,150 --> 00:00:10,890 Bueno, si seguimos vivos a estas alturas 2 00:00:10,890 --> 00:00:12,710 vamos con el tercer método para 3 00:00:12,710 --> 00:00:16,449 recibir las entradas del Input System 4 00:00:16,449 --> 00:00:18,890 Este quizás es el que menos me gusta a mí 5 00:00:18,890 --> 00:00:21,949 si bien es cierto que hay gente en Internet que lo usa 6 00:00:21,949 --> 00:00:24,230 lo sé porque mis alumnos alguna vez me lo han puesto 7 00:00:24,230 --> 00:00:26,050 y no sé por qué, porque yo no se lo he enseñado 8 00:00:26,050 --> 00:00:29,489 y segundo, si es verdad que lo recomienda Unity 9 00:00:29,489 --> 00:00:32,210 en el caso de juegos en los que haya múltiples jugadores 10 00:00:32,210 --> 00:00:35,789 porque es verdad que tiene ciertas opciones que facilitan mucho 11 00:00:35,789 --> 00:00:37,090 a la hora de crear multijugador 12 00:00:37,090 --> 00:00:50,009 Pero bueno, vamos a ver cómo funciona. Este método, he cambiado un poco la distribución para tenerlo más a mano, porque este método utiliza un componente que es el PlayerInput. 13 00:00:50,189 --> 00:00:57,109 Y de hecho, en el momento en el que lo pongamos, veremos que a nuestro personaje le aparece ese iconito indicando que tiene un PlayerInput. 14 00:00:57,490 --> 00:01:03,810 Lo primero, le tenemos que vincular, igual que hicimos en el sistema anterior, un asset de entradas preconfigurado. 15 00:01:03,810 --> 00:01:07,489 Bien, él ha cogido por defecto el que está como Project Wide, 16 00:01:07,609 --> 00:01:08,950 pero vamos que podemos ponerle cualquiera. 17 00:01:09,670 --> 00:01:11,969 Ahora mismo le ha arrastrado el que venía en Unity. 18 00:01:12,390 --> 00:01:17,650 Y fijémonos que al ponerle el de Unity, reconoce los esquemas. 19 00:01:17,930 --> 00:01:20,549 Entonces podemos decirle que utilice todos los esquemas o solo uno. 20 00:01:21,650 --> 00:01:25,010 Bueno, y ¿veis lo que aparece aquí? Pues ahora entenderemos por qué. 21 00:01:25,469 --> 00:01:26,609 Le voy a vincular con el mío. 22 00:01:27,590 --> 00:01:30,469 Cuestiones. No me voy a detener mucho en cómo funciona el componente, 23 00:01:30,469 --> 00:01:32,609 pero fijaros que tiene para vincular una cámara. 24 00:01:32,609 --> 00:01:37,989 Y esto está pensado para, lo he dicho, juegos multijugador en el que tengamos varias cámaras funcionando 25 00:01:37,989 --> 00:01:44,049 y entonces unos inputs funcionen con una cámara y otros con otros, por ejemplo, para el input system, 26 00:01:44,150 --> 00:01:48,329 para que no haya conflictos. En fin, tiene muchas opciones, pero me quedaré con esto. 27 00:01:48,810 --> 00:01:54,230 No voy a entrar mucho en detalle, pero sí que entendamos que un GameObject, 28 00:01:54,230 --> 00:02:00,209 una vez que tiene el componente PlayerInput, podemos desde un script que tenga ese GameObject 29 00:02:00,209 --> 00:02:03,450 llamar a las acciones de ese input asset 30 00:02:03,450 --> 00:02:04,489 que acabamos de vincular. 31 00:02:05,250 --> 00:02:07,590 ¿Cómo? Pues bien, vemos que hay un sendMessages 32 00:02:07,590 --> 00:02:09,830 que es básicamente todos los scripts 33 00:02:09,830 --> 00:02:11,349 que tengan este objeto 34 00:02:11,349 --> 00:02:14,009 pueden hacer uso de ese input. 35 00:02:14,189 --> 00:02:16,310 Antes no, antes era el script que le habíamos vinculado. 36 00:02:16,389 --> 00:02:17,550 Ahora no, ahora cualquier script. 37 00:02:18,150 --> 00:02:20,289 Podemos incluso hacer un broadcastMessages 38 00:02:20,289 --> 00:02:22,969 que significa no solo los scripts que tengan mi objeto, 39 00:02:22,969 --> 00:02:25,689 sino los hijos de este objeto 40 00:02:25,689 --> 00:02:28,710 también pueden hacer uso de este input asset 41 00:02:28,710 --> 00:02:29,610 que tengo vinculado. 42 00:02:29,610 --> 00:02:32,150 y tenemos el InboxUnityEvents 43 00:02:32,150 --> 00:02:33,750 que lo veremos más adelante 44 00:02:33,750 --> 00:02:35,289 que eso ya es hilar muy fino 45 00:02:35,289 --> 00:02:37,009 pero quedémonos con el SendMessages 46 00:02:37,009 --> 00:02:38,590 con lo cual le voy a poner un 47 00:02:38,590 --> 00:02:39,969 un script 48 00:02:39,969 --> 00:02:42,810 y fijémonos 49 00:02:42,810 --> 00:02:43,830 esto es interesante 50 00:02:43,830 --> 00:02:46,710 al poner SendMessages nos dice 51 00:02:46,710 --> 00:02:49,409 qué mensajes 52 00:02:49,409 --> 00:02:51,509 puede recibir desde un script 53 00:02:51,509 --> 00:02:52,669 y de hecho nos aparece 54 00:02:52,669 --> 00:02:55,710 las acciones que yo he creado en este input 55 00:02:55,710 --> 00:02:56,930 vemos que pone 56 00:02:56,930 --> 00:02:59,590 OnJump, OnWork, OnMove, OnCrouch 57 00:02:59,590 --> 00:03:02,930 es decir, que ya nos está dando una pista 58 00:03:02,930 --> 00:03:06,150 o por lo menos una chuleta de qué métodos podemos usar 59 00:03:06,150 --> 00:03:07,909 de hecho si abro el script 60 00:03:07,909 --> 00:03:11,189 y es quizá por lo que este sistema tiene sus fans 61 00:03:11,189 --> 00:03:14,129 porque yo automáticamente ahora mismo ya puedo usar 62 00:03:14,129 --> 00:03:17,189 los métodos que me aparecen aquí 63 00:03:17,189 --> 00:03:20,349 en la chuleta, por ejemplo le puedo decir void 64 00:03:20,349 --> 00:03:25,930 onJump y para que no le vea el print 65 00:03:25,930 --> 00:03:27,689 salto 66 00:03:27,689 --> 00:03:29,909 sin más, ya está 67 00:03:29,909 --> 00:03:33,849 y como insisto que hemos hecho una especie de set message 68 00:03:33,849 --> 00:03:36,729 es decir que cualquiera puede llamar a estos métodos 69 00:03:36,729 --> 00:03:38,009 pues ya está, ya funciona 70 00:03:38,009 --> 00:03:41,629 no necesito más, le doy a saltar 71 00:03:41,629 --> 00:03:43,669 y ahí me aparece, salto 72 00:03:43,669 --> 00:03:46,530 bien, esto está bien y nos vale para muchas cosas 73 00:03:46,530 --> 00:03:47,750 pero ahora vamos a lo siguiente 74 00:03:47,750 --> 00:03:51,610 que es necesito obtener los datos de esa entrada 75 00:03:51,610 --> 00:03:54,870 vamos a usar la acción move 76 00:03:54,870 --> 00:03:57,250 que era un vector2 para que veamos como puedo 77 00:03:57,250 --> 00:04:01,169 obtener ese vector 2 de ese sistema de entrada. Entonces voy a ir 78 00:04:01,169 --> 00:04:04,449 lo mismo, voy onMove 79 00:04:04,449 --> 00:04:08,250 que es como se llamaba, recordemos que tenemos aquí una chuleta 80 00:04:08,250 --> 00:04:13,009 onMove, lo puedo llamar. Pero 81 00:04:13,009 --> 00:04:17,029 ahora sí que necesito recibir un valor en este 82 00:04:17,029 --> 00:04:20,910 método. ¿De qué tipo? De tipo inputValue 83 00:04:20,910 --> 00:04:23,910 voy a llamar value, por ejemplo. 84 00:04:23,910 --> 00:04:29,050 por cierto que se nos ha añadido automáticamente la librería inputSystem 85 00:04:29,050 --> 00:04:31,230 como hemos visto en cuanto hemos usado un inputValue 86 00:04:31,230 --> 00:04:35,110 y ahora, si necesito una variable que recoja eso 87 00:04:35,110 --> 00:04:38,170 pues voy a crear una variable de tipo vector2 88 00:04:38,170 --> 00:04:40,990 y le voy a llamar myMove para no mezclarlo 89 00:04:40,990 --> 00:04:45,620 y ahora en este método 90 00:04:45,620 --> 00:04:47,699 que recoge el valor del joystick 91 00:04:47,699 --> 00:04:49,300 le digo, oye pues myMove 92 00:04:49,300 --> 00:04:52,879 es igual a ese valor que me has devuelto 93 00:04:52,879 --> 00:04:53,759 que yo le he llamado value 94 00:04:53,759 --> 00:04:56,180 y tiene un método llamado get 95 00:04:56,180 --> 00:04:59,000 y entre menor que y mayor que le tenemos que decir 96 00:04:59,000 --> 00:05:00,680 qué tipo de valor va a obtener 97 00:05:00,680 --> 00:05:02,620 y en este caso es un vector2, correcto 98 00:05:02,620 --> 00:05:04,579 entonces ahora mismo myMove 99 00:05:04,579 --> 00:05:06,899 va a valer en todo momento lo que diga 100 00:05:06,899 --> 00:05:07,600 el joystick 101 00:05:07,600 --> 00:05:09,399 como sé que funciona 102 00:05:09,399 --> 00:05:14,000 voy a crear un método para mover 103 00:05:14,000 --> 00:05:16,300 movePlayer 104 00:05:16,300 --> 00:05:20,759 y le voy a decir pues 105 00:05:20,759 --> 00:05:22,920 lo de siempre, transform, translate 106 00:05:22,920 --> 00:05:27,519 hacia adelante por lo que 107 00:05:27,519 --> 00:05:29,040 diga 108 00:05:29,040 --> 00:05:37,680 myMove en y y por time delta time, claro. Ahí está. Lo voy a duplicar porque voy a 109 00:05:37,680 --> 00:05:45,649 decir que se mueve hacia la derecha por su valor en x. Recuerdo que myMove era un 110 00:05:45,649 --> 00:05:50,310 vector 2 y va a tener un valor en y y un valor en x. Y lo gente, este método lo 111 00:05:50,310 --> 00:05:59,449 tengo que llamar en algún sitio, es decir, en el update. Pues vamos a ver si hay suerte. 112 00:05:59,449 --> 00:06:04,709 le doy al play, para adelante 113 00:06:04,709 --> 00:06:08,509 para atrás, derecha 114 00:06:08,509 --> 00:06:12,629 izquierda, bien 115 00:06:12,629 --> 00:06:17,350 ¿qué ocurre? que este sistema es un poco limitado, en el sentido de que 116 00:06:17,350 --> 00:06:21,370 yo necesito saber cuando pulso algo, cuando lo estoy pulsando o cuando dejo de pulsarlo 117 00:06:21,370 --> 00:06:25,170 igual que hacíamos en el primer sistema, que no se puede hacer 118 00:06:25,170 --> 00:06:29,089 claro que se puede hacer, aquí todo se puede hacer, lo que pasa es que es un poco más rebuscado la forma de hacerlo 119 00:06:29,089 --> 00:06:32,990 Lo vamos a ver para que sepamos que esa opción también existe. 120 00:06:34,009 --> 00:06:38,129 Para ello tenemos que ir a Unity y cambiar aquí el comportamiento. 121 00:06:39,050 --> 00:06:43,149 Teníamos en mandar mensajes o broadcast messages para que lo recoja cualquiera de nuestros hijos 122 00:06:43,149 --> 00:06:45,750 y tenemos el Invoke Unity Events. 123 00:06:47,110 --> 00:06:51,069 Entonces, si lo seleccionamos, veremos que hay una pestañita que nos dice eventos 124 00:06:51,069 --> 00:06:53,949 e incluso tenemos eventos para cada mapa de acciones. 125 00:06:54,029 --> 00:06:58,790 Si despliego el player, por ejemplo, veré que efectivamente hay todas las acciones que he creado 126 00:06:58,790 --> 00:07:02,269 tendrá aquí su representación. Bien, si le doy un más 127 00:07:02,269 --> 00:07:06,290 me está pidiendo un objeto y un script. Esto es muy parecido, por ejemplo, para lo que usábamos 128 00:07:06,290 --> 00:07:09,949 para los botones. Voy a usarlo en el mismo script. 129 00:07:11,029 --> 00:07:18,839 Necesito un método público al que le voy a llamar, por ejemplo, 130 00:07:20,660 --> 00:07:22,000 walk, que no lo he usado hasta ahora. 131 00:07:24,250 --> 00:07:27,129 Le voy a llamar walk callback. ¿Qué ocurre? 132 00:07:27,850 --> 00:07:31,129 Este método que acabo de crear necesita 133 00:07:31,129 --> 00:07:37,259 un callback de la clase 134 00:07:37,259 --> 00:07:38,139 inputAction 135 00:07:38,139 --> 00:07:42,189 inputActionCallbackContext 136 00:07:42,189 --> 00:07:44,750 que le voy a llamar ctx, igual que usábamos 137 00:07:44,750 --> 00:07:46,550 en el primer sistema, porque es la convención 138 00:07:46,550 --> 00:07:47,790 para decirle un callback 139 00:07:47,790 --> 00:07:50,470 y ahora le tengo que decir, voy a crear una variable 140 00:07:50,470 --> 00:07:52,670 tipo float, para mi caminar 141 00:07:52,670 --> 00:07:54,910 workValue 142 00:07:54,910 --> 00:07:56,250 le voy a llamar, por ejemplo 143 00:07:56,250 --> 00:07:58,750 y ahora, ¿qué hacemos 144 00:07:58,750 --> 00:07:59,490 con este callback? 145 00:08:00,110 --> 00:08:02,329 es muy parecido a como funcionaba el primer sistema 146 00:08:02,329 --> 00:08:04,870 lo que pasa es que aquí, se lo tenemos que preguntar 147 00:08:04,870 --> 00:08:12,810 le tenemos. Oye, si ese callback que estás llamando ha iniciado, es decir, han 148 00:08:12,810 --> 00:08:18,689 empezado a mover el joystick, lo va a mandar a la consola 149 00:08:18,689 --> 00:08:30,269 caminando. Si ese callback se sigue, voy a ponerle aquí iniciar 150 00:08:30,269 --> 00:08:42,480 el camino. Si se está ejecutando, es decir, está PERFORMED, es decir, print caminando. Y si 151 00:08:42,480 --> 00:08:57,690 ese callback ha dejado de usarse, print determinado. Conclusión. Al final el resultado es muy parecido 152 00:08:57,690 --> 00:09:04,649 al que vimos en el primer sistema. He creado un método que va a retornar un callback y dentro 153 00:09:04,649 --> 00:09:08,950 de ese método le tengo que preguntar en todo momento si ha empezado, si se está ejecutando 154 00:09:08,950 --> 00:09:12,710 o si ha dejado de ejecutarse. Que esto, utilizando el playerInput 155 00:09:12,710 --> 00:09:16,870 y utilizando el invokeUnityEvents, lo voy a vincular 156 00:09:16,870 --> 00:09:20,190 voy a quitar este, que no, a la acción walk 157 00:09:20,190 --> 00:09:24,149 le añado una nueva callbackContext 158 00:09:24,149 --> 00:09:28,870 necesita un objeto. Bien. Como lo he usado en el mismo script 159 00:09:28,870 --> 00:09:32,669 que tiene el objeto, lo puedo arrastrar. ¿Podría ponerlo en otro objeto 160 00:09:32,669 --> 00:09:34,590 con otro script? por supuesto que sí 161 00:09:34,590 --> 00:09:36,289 igual que cuando lo hacíamos con los botones 162 00:09:36,289 --> 00:09:38,610 y aquí en las funciones 163 00:09:38,610 --> 00:09:39,830 no sé si se llega a ver 164 00:09:39,830 --> 00:09:42,289 para que se vea 165 00:09:42,289 --> 00:09:43,710 ahí está 166 00:09:43,710 --> 00:09:46,190 dynamic callback context, es decir 167 00:09:46,190 --> 00:09:48,149 funciones que están esperando ese callback 168 00:09:48,149 --> 00:09:49,929 ahí está, la que yo he creado 169 00:09:49,929 --> 00:09:51,730 bueno, vamos a ver si funciona 170 00:09:51,730 --> 00:09:54,750 no soy muy fan ni uso mucho este método 171 00:09:54,750 --> 00:09:55,210 pero 172 00:09:55,210 --> 00:09:58,190 debería funcionar 173 00:09:58,190 --> 00:09:59,610 entonces si yo muevo el eje x 174 00:09:59,610 --> 00:10:00,830 que es el que 175 00:10:00,830 --> 00:10:07,190 Lo veis, lo estoy moviendo, con lo cual inicio el camino y estoy caminando, mientras siga 176 00:10:07,190 --> 00:10:10,870 presionando va a seguir y es importante hacer lo que hicimos en el primer sistema, cuando 177 00:10:10,870 --> 00:10:19,539 deje de mover el joystick decirle que deje de caminar, he terminado, ahí está. 178 00:10:19,539 --> 00:10:23,779 Ya que los vinculé con los cursores, lo voy a probar con los cursores, pulso el cursor 179 00:10:23,779 --> 00:10:28,860 de arriba y efectivamente estoy caminando, sigo pulsando el botón de arriba y cuando 180 00:10:28,860 --> 00:10:36,179 suelto he terminado de caminar y lo mismo con el de abajo estoy caminando y he dejado de caminar 181 00:10:36,179 --> 00:10:43,200 y es importante por ejemplo si esto lo fuésemos bien a vincular a un movimiento de nuestro 182 00:10:43,200 --> 00:10:56,460 personaje pues work value por ejemplo y le digo si estoy caminando lo que usamos el primer sistema me 183 00:10:56,460 --> 00:11:03,019 estoy moviendo? Pues walkValue vale, y esto es igual que en el primer 184 00:11:03,019 --> 00:11:11,080 método. ctx.readValue, ¿de qué tipo? float. ¿Y qué pasa si dejo de moverme? Pues que 185 00:11:11,080 --> 00:11:21,450 walkValue es igual a cero. Voy a quitar esto, 186 00:11:21,450 --> 00:11:32,340 porque ahora ya, de hecho en el update lo voy a quitar, y le voy a decir en el update 187 00:11:32,340 --> 00:11:51,019 muévete hacia adelante por lo que diga el walk value por por supuesto time delta time vamos a 188 00:11:51,019 --> 00:12:04,590 comprobar que funciona está en el jugador desde el play y ahora en principio con los cursores que son 189 00:12:04,590 --> 00:12:11,470 los que están vinculados a la acción walk debería caminar hacia delante y hacia atrás y además cuando 190 00:12:11,470 --> 00:12:21,779 empieza me sale abajo el aviso de que efectivamente ha iniciado el camino ahí está y si me voy a su 191 00:12:21,779 --> 00:12:28,509 inspector, veré que lo he vinculado con 192 00:12:28,509 --> 00:12:33,879 un InvokeUnityEvents y dentro de los eventos, dentro 193 00:12:33,879 --> 00:12:37,759 del mapa de acciones, efectivamente he vinculado el walk con 194 00:12:37,759 --> 00:12:41,460 ese objeto que tiene ese script y ese método. 195 00:12:44,110 --> 00:12:47,750 Este último sistema para movimientos o para acciones sencillas, la verdad 196 00:12:47,750 --> 00:12:51,750 es que es muy práctico porque el código es muy sencillo porque solo hay que 197 00:12:51,750 --> 00:12:55,029 ya tenemos disponible nuestros métodos, pero es verdad que cuando queremos algo 198 00:12:55,029 --> 00:12:58,870 más elaborado, pues quizás complica un poquito más. 199 00:12:58,990 --> 00:13:00,669 Pero no más que la primera forma. 200 00:13:02,110 --> 00:13:05,149 A partir de aquí, insisto, parece complicado. 201 00:13:05,330 --> 00:13:07,529 Primero porque son tres métodos y no tenemos que usar los tres. 202 00:13:07,649 --> 00:13:10,149 Tenemos que elegir uno y emplearlo. 203 00:13:10,750 --> 00:13:12,789 Y dos, es complicado la primera vez. 204 00:13:13,029 --> 00:13:15,950 Luego ya, de tanto repetirlo, de tanto repetirlo 205 00:13:15,950 --> 00:13:18,669 y sobre todo de copiar y pegar y copiar y pegar siempre el mismo código, 206 00:13:18,669 --> 00:13:21,169 al final nos resulta cómodo. 207 00:13:21,309 --> 00:13:24,710 Por no decir que, si somos listos, sabremos cómo reutilizar. 208 00:13:25,029 --> 00:13:25,750 Mismo script. 209 00:13:26,309 --> 00:13:28,889 Pues nada, elige a tu jugador. 210 00:13:29,230 --> 00:13:30,529 Pues nada, elige tu favorito.