1 00:00:06,769 --> 00:00:11,669 Bien, anteriormente ya hemos visto cómo funcionan las físicas o el mundo de la física real dentro de Unity, 2 00:00:11,849 --> 00:00:16,010 pero vamos a ir un pasito más allá y vamos a abordar el tema de las colisiones, 3 00:00:16,109 --> 00:00:19,469 es decir, qué hacer cuando un objeto entra en contacto con otro. 4 00:00:19,609 --> 00:00:27,370 Es algo totalmente habitual, por ejemplo, sin ir más lejos, las balas cuando impactan en los personajes o en los NPCs. 5 00:00:27,609 --> 00:00:31,109 Para eso usaremos los colliders, vamos a adentrarnos en ellos. 6 00:00:31,109 --> 00:00:34,409 Bien, para este ejemplo voy a usar una escena similar a la que estuve usando para el RigidBody, 7 00:00:34,409 --> 00:00:38,310 en el que he creado un plano 3D con un poco de textura de mármol para darle un poco de solidez, 8 00:00:38,429 --> 00:00:43,329 que tiene ya por defecto un mesh collider, eso no lo he añadido yo, sino que automáticamente al ser un objeto 3D 9 00:00:43,329 --> 00:00:46,270 pues entiende que tiene una colisión en su malla. 10 00:00:47,149 --> 00:00:53,270 He creado una esfera bastante grande, ahí está, ahí arriba, que también por defecto viene con su propio colisionador, 11 00:00:53,409 --> 00:00:56,810 ahora veremos, pero desde luego lo que no tiene es un rigid body, de hecho ahora mismo si yo lanzo la escena 12 00:00:56,810 --> 00:01:00,229 también tengo aquí una cámara que la va a seguir, como hemos visto en ejemplos anteriores, 13 00:01:00,350 --> 00:01:03,070 pero vemos que la esfera ahí se queda, ¿por qué? Porque no le afecta la física. 14 00:01:03,070 --> 00:01:07,469 Así que lo primero que voy a hacer es añadirle a esta esfera un componente, en este caso un RigidBody. 15 00:01:08,689 --> 00:01:15,590 Ahí está. Con un peso, el peso le da igual, le podemos poner 2 kilos por base de metal y con una 16 00:01:15,590 --> 00:01:19,769 resistencia al aire que bueno, le puedo dar un 0,5 aunque insisto, para lo que vamos a ver hoy no nos 17 00:01:19,769 --> 00:01:23,810 interesa. Pero sí desde luego lo que me interesa es que esté afectado por la gravedad, para que caiga. 18 00:01:23,810 --> 00:01:29,209 De hecho ahora mismo si lanzamos el juego la cámara le seguirá la esfera, ahí la veremos, ahí la sigue, 19 00:01:29,209 --> 00:01:37,430 cae, cae, cae y choca contra el suelo. ¿Por qué? Porque ambos dos tienen el Mesh Collider. En este 20 00:01:37,430 --> 00:01:42,890 caso un Collider específico para las esferas, que eso es lo que vamos a tratar hoy. Antes de hacerlo 21 00:01:42,890 --> 00:01:50,409 voy a hacer un poco de trampa a la esfera. Le voy a aplicar un material que le dé apariencia de 22 00:01:50,409 --> 00:01:59,510 metal y también le voy a añadir esto. Ya lo veremos más adelante cuando veamos los materiales. Le voy 23 00:01:59,510 --> 00:02:03,170 a añadir un material físico, un Physic Material, que he creado por aquí. Estos tienen que estar 24 00:02:03,170 --> 00:02:07,530 asociados a colliders cuando nosotros añadimos cualquier tipo de collider en un objeto nos da 25 00:02:07,530 --> 00:02:11,270 la opción de añadirle un material porque lógicamente la forma en la que un objeto 26 00:02:11,270 --> 00:02:14,949 colisiona con otro pues depende del material que está hecho no es lo mismo que sea goma que metal 27 00:02:14,949 --> 00:02:19,189 de hecho en este caso le he dado un poquito de bouncing es que es para que rebote porque hemos 28 00:02:19,189 --> 00:02:23,789 visto que antes ha caído la pelota a peso y ahora le ha dado un poco de eso pues rebote para que la 29 00:02:23,789 --> 00:02:30,629 esfera ahora mismo aunque sea de metal pues por lo menos de algo de sensación de ahí está pues 30 00:02:30,629 --> 00:02:33,050 Claro, pues sí que rebota. Y eso se lo da el material del collider. 31 00:02:33,509 --> 00:02:37,629 Pues ya estamos preparados. Antes de meternos en la programación y ver cómo funcionan las colisiones, 32 00:02:37,849 --> 00:02:41,590 vamos a ver un momentito este panel de collider, que puede variar dependiendo del tipo de collider que sea, 33 00:02:41,669 --> 00:02:43,389 pero tiene algunos parámetros que suelen ser bastante habituales. 34 00:02:43,650 --> 00:02:49,509 Para ejemplo, para empezar el edit collider, esto, cuando lo activamos, automáticamente vemos que nos aparece aquí 35 00:02:49,509 --> 00:02:56,409 una especie de esfera, de malla que va rodeando a nuestro cuerpo y que, insisto, dependerá del tipo de collider que estemos usando. 36 00:02:56,409 --> 00:03:00,770 Este objeto, al ser una esfera, pues lógicamente la forma que tiene su collider es esférica. 37 00:03:01,030 --> 00:03:03,289 Pero si estuviésemos en otro tipo de collider, pues aparecería con otra forma. 38 00:03:03,650 --> 00:03:08,729 Pero lo que me interesa es que si nos acercamos, veremos que tiene unos pequeños asideros, aquí los tenemos, pequeñitos, 39 00:03:09,330 --> 00:03:13,030 que nos permiten deformar la forma de la malla. 40 00:03:13,229 --> 00:03:17,870 Y lo que implica esto es cuándo empieza a entrar en contacto con otros objetos. 41 00:03:18,330 --> 00:03:23,550 Si extendemos la malla del collider, o extendemos el collider fuera de su forma, 42 00:03:23,550 --> 00:03:25,889 detectará las colisiones antes de entrar en contacto 43 00:03:25,889 --> 00:03:27,889 y al contrario, si la contraemos por dentro 44 00:03:27,889 --> 00:03:29,870 de su forma, pues primero 45 00:03:29,870 --> 00:03:31,430 contactará y luego detectará la colisión 46 00:03:31,430 --> 00:03:33,849 en este caso es una esfera, es muy fácil determinar 47 00:03:33,849 --> 00:03:35,569 dónde empieza y dónde termina 48 00:03:35,569 --> 00:03:37,849 pero imaginemos un personaje 3D cuyo collider 49 00:03:37,849 --> 00:03:39,969 no lo podemos hacer que tenga exactamente la misma forma 50 00:03:39,969 --> 00:03:42,069 del personaje 3D, sino que tenemos que más o menos 51 00:03:42,069 --> 00:03:43,789 decidir, pues normalmente suele ser 52 00:03:43,789 --> 00:03:45,789 una cápsula y en esa cápsula metemos nuestro personaje 53 00:03:45,789 --> 00:03:47,370 y la agrandamos o la empequeñecemos dependiendo de 54 00:03:47,370 --> 00:03:48,909 si queremos que sea más 55 00:03:48,909 --> 00:03:51,150 extensa la zona de colisión 56 00:03:51,150 --> 00:03:52,909 pero bueno, siempre podremos 57 00:03:52,909 --> 00:03:55,569 Aquí cuando le damos al botón de Edit Collider 58 00:03:55,569 --> 00:03:58,569 Siempre nos saldrán esos asideros 59 00:03:58,569 --> 00:04:02,789 Que podemos pincharlo y veremos que se agranda o se empequeñece 60 00:04:02,789 --> 00:04:05,469 Si pinchamos el Alt, veremos que se agranda o se empequeñece 61 00:04:05,469 --> 00:04:06,870 Respetando el centro de la forma 62 00:04:06,870 --> 00:04:08,750 Lo cual en este caso es bastante práctico 63 00:04:08,750 --> 00:04:10,110 Lo voy a dejar un poquito que se expanda hacia afuera 64 00:04:10,110 --> 00:04:11,710 Pero no demasiado para que no quede poco realista 65 00:04:11,710 --> 00:04:14,009 Y veamos que ese mismo botón lo tenemos aquí 66 00:04:14,009 --> 00:04:15,389 Es decir, que cuando tenemos un objeto en la escena 67 00:04:15,389 --> 00:04:19,730 Podemos pinchar ese botón y accederemos a la edición de su colisionador 68 00:04:19,730 --> 00:04:22,009 Y de hecho lo que hemos estado haciendo básicamente es 69 00:04:22,009 --> 00:04:24,389 si nos fijamos en este caso ampliar su radio 70 00:04:24,389 --> 00:04:25,290 ahí está 71 00:04:25,290 --> 00:04:27,850 pero también podemos desplazarlo, es decir 72 00:04:27,850 --> 00:04:29,850 si queremos que el coleccionador 73 00:04:29,850 --> 00:04:31,629 esté fuera del objeto 74 00:04:31,629 --> 00:04:33,389 por algún motivo que ahora mismo no se me ocurre pero 75 00:04:33,389 --> 00:04:34,689 pues también podemos hacerlo 76 00:04:34,689 --> 00:04:37,829 pero bueno, en este caso no, me interesa que esté centrado 77 00:04:37,829 --> 00:04:38,930 más opciones 78 00:04:38,930 --> 00:04:41,649 tenemos aquí Strigger que lo que hace es 79 00:04:41,649 --> 00:04:43,889 lanzar un aviso cuando ha coleccionado con otro objeto 80 00:04:43,889 --> 00:04:45,290 lo veremos ahora cuando nos metamos en el 81 00:04:45,290 --> 00:04:47,889 código y aquí el material 82 00:04:47,889 --> 00:04:49,750 que es un material físico 83 00:04:49,750 --> 00:04:51,470 que es el que he creado previamente y que bueno que ya veremos 84 00:04:51,470 --> 00:04:53,389 en detalle cuando veamos los materiales. 85 00:04:53,870 --> 00:04:55,769 Pero ahora lo que nos interesa es, mediante código, 86 00:04:56,029 --> 00:04:58,029 detectar cuando se ha producido 87 00:04:58,029 --> 00:04:59,170 una colisión. 88 00:04:59,670 --> 00:05:00,670 Y eso es lo que vamos a hacer. 89 00:05:01,170 --> 00:05:02,290 Yo voy a crear un nuevo script 90 00:05:02,290 --> 00:05:05,129 al que le voy a llamar SphereCollider, por ejemplo. 91 00:05:06,250 --> 00:05:07,389 Y se lo voy a asociar 92 00:05:07,389 --> 00:05:08,129 a mi espera. 93 00:05:09,550 --> 00:05:11,649 Pues fijémonos que lo primero que voy a hacer es borrar 94 00:05:11,649 --> 00:05:13,610 los métodos que vienen por defecto, 95 00:05:13,610 --> 00:05:15,290 el de Start y Update, porque no los voy a necesitar. 96 00:05:15,589 --> 00:05:17,889 De hecho, vamos a utilizar un método propio 97 00:05:17,889 --> 00:05:19,430 que lo empiezo a escribir. Es un método que no devuelve nada, 98 00:05:19,430 --> 00:05:31,250 Por eso escribo aquí void. Y si empezamos a escribir onTriggerEnter, veremos que automáticamente Unity nos lo completa diciendo que es un método privado, eso lo ha puesto él, pero no está de más que lo indique. 99 00:05:31,649 --> 00:05:36,389 El método onTriggerEnter, que es decir que esto se va a lanzar cuando se ha lanzado el trigger, es decir, el disparador. 100 00:05:36,970 --> 00:05:46,209 Y ahora automáticamente dentro ha atrapado una variable tipo collider a la que le ha llamado other. Es decir, que dentro de la variable other tendremos todos los datos referidos al objeto con el que ha colisionado. 101 00:05:46,209 --> 00:05:49,009 y es en este momento cuando, por ejemplo, le puedo decir 102 00:05:49,009 --> 00:05:50,649 que mande a consola 103 00:05:50,649 --> 00:05:53,230 se ha chocado con algo 104 00:05:53,230 --> 00:05:54,930 y ahora en mi Unity 105 00:05:54,930 --> 00:05:57,050 si es verdad que a la esfera, en el collider 106 00:05:57,050 --> 00:05:58,149 le tengo que decir 107 00:05:58,149 --> 00:06:00,750 que es trigger 108 00:06:00,750 --> 00:06:02,089 es decir, que se lance 109 00:06:02,089 --> 00:06:04,129 un disparador cuando ha chocado 110 00:06:04,129 --> 00:06:06,870 así que ahora mismo, en la consola 111 00:06:06,870 --> 00:06:08,209 si lo lanzo 112 00:06:08,209 --> 00:06:11,310 veremos aquí en la consola que efectivamente cuando choque con el suelo 113 00:06:11,310 --> 00:06:15,189 efectivamente ha detectado 114 00:06:15,189 --> 00:06:17,689 Pero fijémonos una cosa, la esfera sigue cayendo 115 00:06:17,689 --> 00:06:19,370 Y eso es algo que tenemos que entender 116 00:06:19,370 --> 00:06:22,389 Que es que cuando activamos el trigger de los colliders 117 00:06:22,389 --> 00:06:25,490 De repente deja de detectar las colisiones 118 00:06:25,490 --> 00:06:27,209 Y ya es como si no tuviese física 119 00:06:27,209 --> 00:06:29,250 Lo único que hace es que cuando colisiona 120 00:06:29,250 --> 00:06:31,069 Manda un aviso, nada más 121 00:06:31,069 --> 00:06:34,329 Pero ya no es materia sólida 122 00:06:34,329 --> 00:06:38,370 Ahora lo que tenemos que hacer es actuar en consecuencia desde el código 123 00:06:38,370 --> 00:06:39,769 Algo que puedo hacer 124 00:06:39,769 --> 00:06:42,050 Es que cuando choque con algo 125 00:06:42,050 --> 00:06:45,110 Destruya este objeto 126 00:06:45,110 --> 00:06:51,040 y eso lo hacemos con el método destroy 127 00:06:51,040 --> 00:06:54,939 y que destruya el GameObject. ¿Cuál? Pues como no le identifico cuál 128 00:06:54,939 --> 00:06:59,319 o no le especifico cuál, pues destruirá al que está asociado este script. 129 00:07:00,000 --> 00:07:03,180 Y efectivamente ahora mismo veremos caer la esfera. Allá va 130 00:07:03,180 --> 00:07:07,019 y cuando llegue al final, ¡oh! desaparece. Pero es que desaparece 131 00:07:07,019 --> 00:07:10,740 incluso de mi jerarquía. Algo que tenemos que entender 132 00:07:10,740 --> 00:07:14,839 es que la variable other que hemos capturado aquí nos da 133 00:07:14,839 --> 00:07:18,439 toda la información con respecto al objeto con el que ha colisionado, es decir, le podemos 134 00:07:18,439 --> 00:07:22,839 preguntar cualquier cosa, entre otras cosas su nombre o los tags 135 00:07:22,839 --> 00:07:27,060 a los que pertenece. Ejemplo, voy a preguntarle 136 00:07:27,060 --> 00:07:29,459 aquí que me muestre 137 00:07:29,459 --> 00:07:34,920 la variable order que, insisto, tiene el objeto con el que ha colisionado 138 00:07:34,920 --> 00:07:38,240 pues que se vaya al objeto GameObject 139 00:07:38,240 --> 00:07:42,839 de esa variable y que me dé su nombre, por ejemplo 140 00:07:42,839 --> 00:07:47,680 que es uno de los atributos que tengo dentro de un GameObject 141 00:07:47,680 --> 00:07:51,319 el nombre de ese GameObject. Así que por ejemplo yo ahora cuando lance el juego 142 00:07:51,319 --> 00:07:55,819 aquí en consola me dirá que ha chocado con el plane 143 00:07:55,819 --> 00:08:01,620 si yo le cambio el nombre a suelo 144 00:08:01,620 --> 00:08:07,870 y lanzo el juego, efectivamente el objeto 145 00:08:07,870 --> 00:08:13,899 con el que ha chocado es el suelo. A partir de ese momento 146 00:08:13,899 --> 00:08:17,879 pues lógicamente podemos empezar a programar en el sentido de que 147 00:08:17,879 --> 00:08:26,870 Porque yo le puedo decir que cuando colisione, si el nombre del objeto con el que has chocado 148 00:08:26,870 --> 00:08:35,549 es el suelo, cuidado con mayúsculas y minúsculas, entonces destruye el objeto.