Saltar navegación

Vídeos UT1 y UT0 - #3 - DEIM - Curso 25·26 - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 2 de octubre de 2025 por Daniel M.

21 visualizaciones

Tercer vídeo introductorio a los temas 0 y 1 de DEIM.

Descargar la transcripción

Al final de la tarea, una vez teníamos el script realizado, hay que conseguir que al lanzar el juego, dado que se ubica en el start, si no me equivoco, aquí está descrito, solo se hará una vez y se instanciará ese prefab, que es la nave, una sola vez. 00:00:02
Es cierto que, y abro aquí un código, lo pongo por aquí, que dependiendo de qué sobrecarga hayas usado del método Instantiate, hará una opción u otra. 00:00:16
El otro día dijimos, veis que aquí hay tres formas, pasarán tres cosas y se instanciarán tres naves y cada una tiene unas diferentes consecuencias. 00:00:29
Cuando empezamos a escribir el método instantiate, a ver si quiere, empieza a escribir ya incorrectamente, cuando abrimos estos paréntesis que definen a las funciones o métodos, teníamos estas sobrecargas que nos iban indicando qué propiedades está esperando. 00:00:40
En principio las tres primeras, digamos las cuatro primeras casi, son las que más se utilizan. Bueno, cada una tiene sus propias consecuencias, pero no es lo mismo, no es exactamente lo mismo, suele estar todo relacionado y instantiate sirve para generar un clon de lo que se haya referenciado, pero no es lo mismo realizar, y ahora aquí paso a ejecutar tres si queréis, 00:01:00
una instancia en la que solo se le pasa un parámetro 00:01:26
que es el objeto 00:01:29
que hemos 00:01:30
introducido, digamos 00:01:32
capturado a través del 00:01:34
serialized field, que recordemos que es 00:01:36
que luego, una vez tenemos 00:01:38
este script, a ver, perdonad 00:01:41
que es 00:01:43
importante cuando queramos ver 00:01:44
lo relativo a un 00:01:46
a un script, no olvidar 00:01:49
que ese script tiene que ser 00:01:51
componente de alguno de los elementos que están 00:01:52
en la escena ejecutándose vale por tanto voy a poner este instante prefab vale que es el script 00:01:54
que estaba revisando hace un segundito está aquí está siempre fab y perdón en inglés instancia 00:02:02
prefab si yo guardo vale tengo aquí 3 instancia y diferentes cada uno tiene sus particularidades 00:02:08
como acabo de decir y cuando yo ejecuto no en el estar se van a generar los tres o eso debería 00:02:17
hacer, vamos a darle a play y 00:02:24
a ver si lo hace 00:02:26
no hace nada y de hecho da fallo, ¿por qué? 00:02:27
porque ya que os tengo aquí 00:02:32
y entiendo que habéis estado con la tarea, ¿por qué no 00:02:34
¿por qué no se ha instanciado nada? 00:02:36
¿por qué da error? que esto ya lo vimos 00:02:38
el otro día y bueno, si habéis hecho la tarea pues 00:02:42
lo tendréis 00:02:44
claro 00:02:47
¿por qué no lo tienes instanciado, no? 00:02:48
¿a qué te refieres? porque yo aquí 00:02:51
básicamente 00:02:53
ya tengo 00:02:54
un instancia de myPrefab 00:02:56
que está aquí preparado y debería 00:02:58
instanciar ese prefab. Pero no tienes vinculado 00:03:00
Unity en la columna de la derecha. 00:03:02
Efectivamente. Es genial. 00:03:05
Aquí, si nos damos cuenta, se han 00:03:06
generado los campos para introducir 00:03:08
pues, ojo, qué es 00:03:10
mi prefab y qué GameObject 00:03:12
es el que quiero instanciar. Aquí es donde 00:03:14
podemos arrastrar este prefab 00:03:16
y pues está 00:03:18
aquí preparado y ahora todo lo que en el código 00:03:20
tenga una variable referenciada 00:03:22
con mi prefab, con myPrefab, 00:03:24
pues se refiere a ese objeto. 00:03:26
Por tanto, esta línea, por ejemplo, 00:03:27
este primer instant shade, 00:03:29
ya tiene lo que necesita para hacer la instancia. 00:03:30
Cuando solo se usa uno de los parámetros, 00:03:34
que además es la primera sobrecarga, 00:03:36
hacemos el instant shade solo dando un objeto 00:03:41
que es el original que se va a clonar, 00:03:45
que es lo que acabamos de hacer aquí. 00:03:47
Cuando yo ahora, no olvidéis de guardar, 00:03:49
siempre que hagáis algún cambio en el código 00:03:52
para que se ejecute, 00:03:53
Vale, yo ahora cuando lance el juego, al menos una nave tiene que aparecer, ¿vale? Y de hecho se han generado alguna más. Y ve, de hecho, que si nos fijamos, a ver, tenemos una aquí, tenemos otra aquí, las estoy moviendo, bueno, perdonad que estoy cogiendo partes de la nave, de este prefab si la arrastro para acá y de este prefab para acá, ¿vale? 00:03:54
Se han generado dos naves y las dos, si nos damos cuenta, están, deshago y marco una en el 0, 0, 0. Por tanto, una de estas naves, básicamente esta primera, es la primera que ha aparecido, porque recordad que el código, como os dije el otro día, a medida que lo vayamos complicando, esto no es así, pero en este momento sí que lo es, el código se va ejecutando de arriba a abajo. 00:04:15
Entonces la primera nave que se genera en la jerarquía de objetos, que si os dais cuenta a medida que voy incorporando se van añadiendo de arriba a abajo, la primera nave se hacía referencia a esa. 00:04:40
Es verdad que aquí tenemos otros dos Instantiates que no se están produciendo. 00:04:53
como ya os comenté 00:05:00
para hacer pruebas de que funciona y que no 00:05:02
y esto me sirve un poco para explicar 00:05:05
que un mismo método como este InstanceAid 00:05:06
tiene varias sobrecargas y cada una 00:05:09
tiene unas consecuencias 00:05:10
que es lo que iba diciendo del principio 00:05:12
ahora si guardo y lanzo el juego 00:05:14
pues nuevamente 00:05:16
como el prefab está ahí 00:05:18
instanciado pues 00:05:22
placa y aquí tenemos la nave 00:05:24
por tanto este InstanceAid 00:05:26
primero está funcionando 00:05:29
bueno, pues ya si quisiéramos usar 00:05:30
ese instant sheet, está ahí preparado 00:05:32
vamos a ver qué pasa con el resto 00:05:34
es decir, voy a comentar 00:05:36
el resto y voy a ver 00:05:39
esta línea, según empieza 00:05:40
es verdad que aquí está 00:05:43
generando como una variable, si os fijáis 00:05:44
que le está poniendo un nombre que se llama instancia 00:05:46
que si no 00:05:48
vemos mal, aquí pone 00:05:50
gameObjectMyPrefab, está generando 00:05:52
una variable de un tipo de variable 00:05:54
que es gameObject, es decir 00:05:57
una clase, un conjunto de código que se refiere a todo lo relativo a los GameObjects. 00:05:58
Si ya habéis estado estudiando, un GameObject en Unity se refiere a cada uno, 00:06:06
da igual que sea la cámara, la luz, un cubo, cualquier geometría, 00:06:10
todo lo que vamos teniendo aquí introducido genéricamente se llama como un GameObject. 00:06:14
Esta cajita, digamos, hecha de alambre, que no está rellena, es un GameObject aquí representado, 00:06:18
que no es lo mismo que meter un prefab que veis que sí que está lleno. 00:06:26
Pero en genérico, todo lo que se va introduciendo aquí son GameObjects. 00:06:28
Por eso, cuando queremos referenciar a un objeto, usamos esta clase GameObject que usamos como tipo de la variable. 00:06:32
Y por eso, todo lo que metamos en esta caja, si recordáis la analogía que hacía el otro día con cajas, 00:06:41
si lo que queremos es que recoja ese GameObject, pues habrá que usar la clase GameObject. 00:06:47
Voy a seguir y ahora vamos al transform y vemos un par de cosas. 00:06:54
Si yo ahora guardo y digo, a ver qué ocurre cuando yo ahora lanzo el juego, ¿no? Que solo se va a ejecutar esta línea en el start. Vamos a ver. Me voy a poner aquí a mi lado el for. Vale. Vale. Acabo de lanzar el juego y hay una nave en el 15, bueno, perdón, en el 000. Igual. Vale. 00:06:58
pues eso significa que crea una instancia en la posición, aquí os lo he comentado y está ya indicado, 00:07:22
crea una instancia en la posición del objeto de referencia y como hijo suyo. 00:07:29
Pero es verdad que está ocurriendo algo, si os dais cuenta, que es que aunque aquí he puesto dos parámetros, 00:07:33
my prefab y referencia, referencia si lo pensamos bien, me podéis contestar, ¿a qué se está refiriendo en este momento? 00:07:40
A el inobjet que has ubicado ahí vacío, ¿no? 00:07:54
No, tened en cuenta que yo he generado aquí una variable de tipo transform, y transform, si recordáis, es el primer componente que tiene las coordenadas de posición, rotación y escala de cualquier objeto, de casi cualquiera. 00:07:57
Todos suelen empezar teniendo ese componente, y luego muchos otros dependiendo de cuál sea la función. 00:08:10
Fijaos que yo en referencia, que es otra variable que he generado por medio de un campo serializado, no le he dado ninguna referencia. 00:08:16
Ahora mismo está vacía, es nula, no existe. Por eso la ha generado en el 000 y no es hija de nada, como pongo ahí que es. Si os fijáis, es exactamente el prefab, el 00, porque no tiene esa referencia. Es decir, ahora mismo esta línea está funcionando como esta primera, porque aquí lo que tiene es nada, no existe. 00:08:26
Para aprovechar esta sobrecarga y que tenga sentido meter dos variables aquí dentro, habría que decir cuál es esa referencia. Y ahora mismo pone ninguna y está esperando un objeto, un vínculo en este campo del tipo transform. 00:08:46
¿Eso qué significa lo de transform? Que si yo en este campo, igual que he hecho en este de aquí arriba, arrastro aquí la nave, vais a ver que pone esa nave prefab, es el mismo objeto, pero fijaos en dos cosas, primero cambia el icono y cambia, también da como una indicación de qué es lo que está cogiendo de esta referencia que hemos metido ahí. 00:09:05
Si os fijáis además, esto no sé si lo dije el otro día, este iconito es el mismo que el del componente transform, porque de esta variable solo está recogiendo lo relativo al transform del objeto. 00:09:27
De este, por ejemplo, no se va a poder decir, si este GameObject tiene un componente de otro tipo, haz tal. 00:09:39
No podremos hacer ningún tipo de operación en algo que no sea el componente transform de ese objeto. 00:09:46
Igual que aquí accedemos al objeto completo, que aquí lo hemos hecho para que se instancie completamente, aquí solo estamos cogiendo una parte de ese objeto, ese componente transform. 00:09:53
Esto me sirve, nuevamente el otro día, para introducir que las variables pueden ser de tipos casi ilimitados en relación con la cantidad de componentes que hay. 00:10:03
Es decir, aquí si yo busco, no hay un transform porque como ya viene aplicado no está preparado, pero también os dije el otro día que, por ejemplo, lo vais a ver en la lección 3, existe este RigidBody. 00:10:13
pues yo si por ejemplo 00:10:26
en este objeto que le he añadido un RigidBody 00:10:28
quisiera en algún momento 00:10:31
cambiar las propiedades del componente 00:10:32
RigidBody, esto ya lo iremos viendo 00:10:34
que es básicamente 00:10:36
lo que activa el motor de físicas de 00:10:38
Unity, siempre va a haber 00:10:40
la posibilidad de 00:10:42
imaginaos que yo también puedo hacer 00:10:44
una variable, fijaos que está aquí preparada 00:10:46
y RigidBody2D es otro tipo de variable 00:10:48
pues haremos una 00:10:50
variable de tipo 00:10:52
físicas, yo que sé, recordad que 00:10:54
esto es el tipo de variable y esto 00:10:56
es el nombre, que podemos poner el que queramos 00:10:58
que asignamos a esta 00:11:00
caja que recoge lo de variable 00:11:02
y ahora fijaos que si 00:11:04
bueno, si yo guardo lo primero 00:11:06
recordad la estrellita de aquí 00:11:08
si yo guardo y vuelvo 00:11:10
a ir al objeto en el que he puesto 00:11:12
el script, ahora hay otra 00:11:14
bueno, tiene que estar este rigidbody 00:11:16
para poder referenciarlo ahora, pero ahora está 00:11:17
esperando otro 00:11:20
o que introduzcamos algo en este campo 00:11:21
de tipo RigidBody 00:11:24
un poco del tipo de la caja que hemos creado 00:11:26
si yo aquí arrastro ahora la nave 00:11:28
veréis que 00:11:29
la nave prefab como no tiene 00:11:32
RigidBody 00:11:34
no lo va a coger porque si que tiene transform 00:11:34
si que se puede arrastrar como todos los 00:11:38
GameObjects un GameObject pero no 00:11:40
tiene un RigidBody por tanto 00:11:42
aunque yo intente, podéis hacer la prueba 00:11:43
arrastrar igual que si me deja 00:11:45
introducirlo en los otros dos campos 00:11:47
aquí no me deja 00:11:50
sí que podré, por ejemplo, meter el propio GameObject del script 00:11:51
fijaos que si yo lo arrastro, sí me deja, ¿por qué? 00:11:55
porque tiene un RigidBody al cual yo podré acceder luego para cambiar variables 00:11:58
y veis que además el iconito, en estos componentes que ya vienen generados directamente por Unity 00:12:03
pues les ponen estos iconitos para facilitar 00:12:08
veis que aunque la caja parece que es un poco lo mismo 00:12:11
esto ya profundizaremos más 00:12:14
luego al final cada variable tiene su tipo 00:12:19
aquí lo que estamos haciendo en esta línea 00:12:21
es crear sin pasar por el comienzo 00:12:23
de la clase, que es donde vamos generando 00:12:27
lo que se llama las variables miembro 00:12:31
que son variables que podréis usar en todo el código 00:12:33
porque su ámbito, esto si ya habéis visto 00:12:36
ahora vamos un poco a esto, pero si ya habéis leído el tema 0 00:12:38
cosa que deberíais haber hecho, al menos una pasada 00:12:41
hay un tipo de variables que si se ubican al comienzo 00:12:44
de la clase podrán ser luego empleadas 00:12:49
por cualquier método, en este caso start 00:12:52
lo que también se puede hacer es declarar 00:12:54
es decir, construir esta caja dentro ya de un método 00:12:58
no dentro de la clase en general, sino dentro de un método 00:13:01
de su propio bloque, entonces estamos generando 00:13:04
una caja de tipo GameObject 00:13:06
que estamos llamando instancia y a diferencia 00:13:09
de aquí, lo que estamos 00:13:13
haciendo es que en ningún momento hemos 00:13:15
creado un serialize que te 00:13:17
permita arrastrar y saber 00:13:19
que esta caja se llena con un objeto 00:13:21
que metes por el inspector, no 00:13:23
aquí lo que estamos haciendo es 00:13:25
rellenar la caja instancia 00:13:27
de tipo GameObject con la instancia 00:13:28
que generamos, es decir 00:13:31
que si yo en esta instancia 00:13:33
luego cambio alguno de sus 00:13:34
parámetros, ahora lo vemos 00:13:37
no está refiriéndose a 00:13:38
nada que hemos capturado por 00:13:41
el inspector, sino que hemos llenado la caja directamente con una instrucción 00:13:42
que hemos dado aquí. ¿Esto qué significa? 00:13:47
Un ejemplo rápido. Veremos que hay un montón de instrucciones y recordad 00:13:52
esto lo vimos el otro día, que había un operador al escribir 00:13:56
sentencias, que es el punto. 00:13:59
Esto lo indiqué, por ejemplo, cuando ponemos transform, podemos acceder a la 00:14:02
posición de un objeto si escribimos position, porque estamos 00:14:07
accediendo a las 00:14:11
propiedades del transform 00:14:14
lo único es que, como ya os dije 00:14:16
que como el transform es tan utilizado 00:14:18
porque es todo lo que se refiere a las coordenadas 00:14:19
de los GameObjects, pues han 00:14:21
generado, aparte de la clase transform 00:14:23
que siempre se describe en las clases con mayúscula 00:14:25
empezando por mayúscula 00:14:28
importante, esto también lo pone las buenas prácticas 00:14:29
en el tema cero, han generado 00:14:31
una propiedad 00:14:33
que se llama transform con minúscula 00:14:35
que es el nombre en el que se da 00:14:38
a las propiedades como por ejemplo 00:14:39
positian. No estamos aquí refiriéndonos 00:14:41
a la clase directamente, 00:14:44
sino que es una especie de... 00:14:45
Es un poco ambiguo porque al final es la misma 00:14:47
palabra, pero las mayúsculas 00:14:49
y las minúsculas tienen influencia al escribir 00:14:51
código. Entonces, una manera de simplificar 00:14:53
y, digamos, no tener que acceder 00:14:56
a una clase que es como una entidad superior, 00:14:57
sino de meter una operación 00:15:00
que se puede hacer de manera más simple, 00:15:01
podemos acceder a las propiedades 00:15:03
del transform con este transform en minúscula 00:15:05
y luego al ir poniendo el positian, pues podemos decir 00:15:07
Igual a 10, que va a dar fallo por más cuestiones. Pero veis que lo importante de esto ahora mismo es que cuando ponemos un punto, vamos abriendo opciones hijas de ese primer elemento que hemos puesto. 00:15:09
Como lo que el otro día os dije de país, comunidad autónoma o estado, si fuera Estados Unidos, ciudad, punto calle, punto número, ¿vale? Si estas propiedades existieran configuradas, pues sería esta la forma, la sintaxis para ir accediendo, digamos, de un elemento a otro. 00:15:23
Pero para poder acceder, por ejemplo, al elemento ciudad, si no lo hemos configurado de otra forma, siempre hay que ir accediendo de un padre, digamos que reconozca o que hemos guardado como variable, como punto de partida y luego podemos ir llegando a los hijos. 00:15:44
¿Esto qué quiere decir? Que si hemos generado, y les comento esto que tengo aquí, si hemos generado un GameObject que llamamos instancia, que será esa instancia que hemos generado, luego podremos acceder, esto también es ir sabiendo poco a poco más y más herramientas, podemos acceder, por ejemplo, al nombre de esa instancia. 00:16:00
¿Eso qué significa? Que si decimos, vale, aparte de guardar esta instancia con el nombre de instancia, yo quiero que esta instancia tenga el nombre, ¿vale? El nombre del objeto, del GameObject y que se llame hola, ¿vale? Voy a probar a ejecutarlo y ahora vemos su utilidad de esta línea. 00:16:20
Si yo arranco este juego, vais a ver, bueno, lo primero que algo se cae porque le puse el Rigipodi, ¿vale? 00:16:39
Ya veis que al meter un componente está haciendo algo. 00:16:49
Pero lo importante, la nave ahora no se llama clon como se llamaba antes, ahora se llama hola. 00:16:51
Y aquí está dentro todo lo de la nave, el prefab que habíamos ejecutado, ¿vale? 00:16:56
Fijaos, y esto me sirve para ir introduciendo que las variables se pueden ir creando en muchos sitios, 00:17:00
que aquí he puesto varias juntas 00:17:05
y si por ejemplo examináis 00:17:07
que esto también lo iremos viendo en el script 00:17:09
de la unidad 0 de la tarea que os he dejado 00:17:11
como referencia 00:17:13
habrá variables que se van generando al principio 00:17:15
para tenerlas todas, digamos, usables 00:17:17
a lo largo de todo el proyecto, pero también en momentos 00:17:19
nos puede interesar que esa variable 00:17:21
se cree al empezar el juego 00:17:23
en este momento se crea esta instancia 00:17:25
de tipo GameObject 00:17:27
y aquí hemos generado una instancia 00:17:28
que, ojo, todavía no hemos resuelto 00:17:31
qué diferencia hay entre esto y esto 00:17:33
Porque no hemos asignado nada de referencia 00:17:35
Bueno, está ahí preparado 00:17:37
Pero no lo hemos llegado a hacer 00:17:38
A ver, que detengo esto 00:17:40
Y aquí está esperando 00:17:43
A que sigamos trabajando 00:17:47
Ahora sí que está cogiendo una referencia 00:17:48
Ahora usamos a conveniencia 00:17:51
Lo que queramos, pero lo importante es 00:17:53
Que una vez guardamos 00:17:55
Una instancia de tipo GameObject 00:17:57
También podemos acceder a las propiedades de ese GameObject 00:17:58
Como acabamos de hacer aquí 00:18:01
Entonces, vamos a hacer un poco la lógica que pone aquí que tiene usar esta sobrecarga de Instanced, que es que crea una instancia a la posición del objeto de referencia, que es este segundo que tenemos aquí, y como hijo suyo, es decir, de esta referencia. 00:18:02
todo esto yo me lo sé, aparte de porque 00:18:20
ya lo he usado más veces, porque os vuelvo a repetir 00:18:23
que si vamos pasando por las 00:18:25
sobrecargas, que en este 00:18:27
caso 00:18:29
es esta la que estamos usando 00:18:29
nos pide un GameObject, aquí lo pone como 00:18:33
Object, cuando pone Object significa GameObject 00:18:35
es otra forma de llamarlo 00:18:37
y bueno, si luego 00:18:38
es que no quiero liar más la madeja 00:18:40
necesita un objeto que es el que 00:18:43
va a referenciar y luego 00:18:45
un transform que va a ser ese padre, pone 00:18:47
clona el objeto existente y retorna el clon. Si quisiéramos saber más, esto ya lo comenté el otro día, 00:18:49
saber más de qué hace cada método, la buena forma de hacerlo es meternos en el API, en el manual de uso, 00:18:55
del código, desde el propio Google se puede hacer. Si ponemos el método o la propiedad que queramos consultar 00:19:05
Y ponemos Unity después, lo primero que va a poner va a ser, digamos, el acceso a cómo se usa este elemento o este método. 00:19:15
Aquí veis que vienen ya varias sobrecargas. 00:19:29
Y si vamos pasando, aquí pone Object Original, que aquí es lo mismo que ponía en el IntelliSense, que hemos visto antes en el código. 00:19:32
Y aquí sí que podemos ir más con detalle, por si tenemos dudas, ir viendo qué significa cada cosa. 00:19:39
Pues oye, es algo de tipo objeto de GameObject, no podemos meterle otra cosa, quiere un GameObject aquí. Y en original es el nombre que le ha dado a esta variable, digamos, a este parámetro que está esperando que hagamos algo con él, ¿vale? Y aquí si bajamos en los parámetros nos dice, vale, lo que yo ponga como original, que es en todas estas, en esta posición de los parámetros, dice un objeto existente del que quieras hacer una copia, ¿vale? Pues ya sabemos que aquí habría que meter ese objeto que queremos copiar, ¿vale? 00:19:44
Cuando pone parent, pues podemos ir a parent. 00:20:13
Padre que será asignado al nuevo objeto, ¿vale? 00:20:15
Pues aquí meteremos un transform, ¿vale? 00:20:19
Y ese será padre en este caso. 00:20:22
Podemos hacer igual con más tipos. 00:20:24
Para que vayáis viendo cómo se usa, aquí os puedo ir diciendo más, pues más, digamos, 00:20:26
características de, en este caso, instantiate. 00:20:33
Y si vais bajando, incluso, podréis ir viendo ejemplos, ¿vale? 00:20:35
El problema de los ejemplos igual a estas alturas es que son siempre más avanzados, 00:20:38
pero a medida que vayáis teniendo más bagaje 00:20:42
iréis entendiendo más todos los ejemplos 00:20:45
fijaos que luego incluso instantiate 00:20:47
bueno, yo lo he hecho así un poco a las bravas 00:20:49
pero incluso fijaos que instantiate 00:20:53
si lo vuelvo a declarar aquí 00:20:55
tiene más tipos, ¿vale? 00:20:56
con estas llavecicas que se abren aquí 00:20:58
y si me pongo encima 00:21:00
pues no da muchas descripciones 00:21:01
y en ese caso para desambiguar 00:21:04
para saber qué significa 00:21:06
pues tendríamos que meternos nuevamente 00:21:07
en el manual o en la API 00:21:09
Aquí más abajo están las declaraciones de este estático, que es diferente. En vez de un objeto tiene una referencia de tipo. Esto ahora mismo nos da un poco igual, pero sí que me sirve para que vayáis viendo que las sobrecargas se pueden ir entendiendo mejor si vamos viendo este manual. 00:21:11
Y luego, importante, aquí arriba en la documentación de Unity, que es a donde os va a referenciar si ponéis la propiedad, el parámetro, la función seguida de Unity en Google, podéis acceder al API, que es donde os va a decir el uso, digamos, a nivel de programación, como estamos haciendo ahora mismo, y también al manual. 00:21:33
es el manual del programa 00:21:51
para acceder al manual de esta operación 00:21:55
en vez de hacerlo desde aquí 00:21:58
se puede cambiar a manual 00:21:59
que si tiene una sección en el manual 00:22:00
del propio programa 00:22:02
os puede contar una descripción 00:22:04
que no está tan basada en el código 00:22:06
sino del uso 00:22:07
esto lamentablemente no suele estar en español 00:22:08
igual que el software en sí 00:22:12
el Unity no está en español 00:22:14
pero bueno 00:22:15
con poco a poco en inglés 00:22:16
es bastante técnico 00:22:18
pero bueno, se puede ir traduciendo y veis que aquí un poco ya va explicando qué hace. Nuevamente, estas explicaciones a veces pueden pecar un poco de... muy técnicas en el momento que nos encontramos, pero sí que nos puede dar ciertas pistas, ¿vale? A lo mejor hay líneas que empieza a hablar de herencia, de, bueno, behavior. Bueno, pues esto no sé, si seguimos seguramente algo iremos pillando y poco a poco podremos seguir avanzando, ¿vale? 00:22:20
Que me importaba ver un poco qué significan estos nombres que aparecen bajo original, position, veis en la sobrecarga, pone object original. 00:22:43
Pues original es un nombre que sirve de referencia para luego ver en la API qué significa o qué te está pidiendo en cada momento, ¿vale? 00:22:54
Vuelvo aquí, ¿vale? 00:23:02
Si seguimos viendo esto, nos falta decirle cuál es la referencia de este prefab, ¿vale? 00:23:05
Y la referencia que nosotros queramos. Aquí la tenemos preparada, la variable, para usarla, pero todavía no lo estamos haciendo bien porque aquí os lo he puesto como ejemplo. La voy a quitar, ¿vale? Si dais a este circulito podéis decirle que no queréis ninguna, que es como estaba. 00:23:11
y claro, yo lo que voy a querer en cierto momento 00:23:27
es usar las capacidades 00:23:30
que me está dando 00:23:32
esa sobrecarga de Instantiate 00:23:32
para decirle yo el punto en el que quiero que se instancie 00:23:36
no quiero que se instancie a lo mejor en el 0, 0, 0 00:23:38
¿vale? 00:23:40
sino que yo quiero que se instancie donde 00:23:42
punto, ¿vale? estoy generando 00:23:44
un GameObject vacío, recordad 00:23:46
que igual que se pueden generar estos cubos 00:23:48
y estos elementos con los que habéis 00:23:50
hecho el prefab de la nave 00:23:51
puede generar un vacío, un empty 00:23:53
que es como los nulos en los softwares de 3D 00:23:56
que sirve simplemente para tener una referencia 00:23:58
en el espacio, no contiene nada más allá 00:24:00
de una referencia del espacio 00:24:02
y lo voy a llamar 00:24:04
borro este que he generado dos en el proceso 00:24:06
lo voy a llamar punto referencia 00:24:08
para saber bien que es ese 00:24:10
y ojo que cuando generamos un nuevo 00:24:12
empty object o cualquier elemento 00:24:14
puede no estar ubicado en el 0,0 00:24:16
que de partear no nos gustaría 00:24:19
nos lo pone en el centro del visor 00:24:20
donde estamos mirando, vale, ojo que suelen ir 00:24:22
ya a las posiciones 00:24:25
modificadas, si queremos 00:24:27
colocar algo en origen 00:24:29
en el 0,0, en los 3 00:24:31
puntos de ese componente, si le damos 00:24:33
a reset, se colocará ahí, ¿vale? 00:24:35
vale, esto lo he 00:24:38
hecho un poco para que veáis el punto de partida 00:24:39
pero, ahora lo que puedo hacer 00:24:41
es decir, no, yo quiero que este elemento, la nave 00:24:43
se instancie en el 00:24:45
y lo voy a meter a mano 00:24:47
menos 40 y en i 00:24:48
10, ¿vale? porque es donde 00:24:51
yo quiero que comience 00:24:53
y en Z incluso vamos a ponerle un 15 00:24:53
el punto que sea, da un poco igual 00:24:59
esto lo que nos va a permitir es que luego cuando nosotros digamos 00:25:01
que este GameObject, punto de referencia 00:25:05
y teniendo aquí abierta esta en el inspector 00:25:07
donde tenemos el código y las variables preparadas 00:25:11
arrastramos ese objeto 00:25:13
lo que va a hacer es coger el transform de este punto de referencia 00:25:16
que nosotros hemos ubicado donde queremos que esté 00:25:20
¿Vale? Entonces, ahora mismo ya tenemos preparada una referencia que se coge con esta variable referencia y que nosotros usamos aquí como segundo parámetro, ¿vale? Del instant shade. 00:25:22
si yo ahora ejecuto el juego 00:25:37
va a hacer dos cosas, como bien dice aquí 00:25:39
crea una estancia en la posición del objeto de referencia 00:25:41
en esta ubicación 00:25:44
que acabamos de poner 00:25:46
y como hijo suyo además, tiene una pequeña 00:25:47
sutileza 00:25:50
entonces, yo cuando ahora arranque el juego 00:25:51
vais a ver 00:25:54
que esa nave 00:25:54
primero se ha colocado, si recordáis 00:25:57
en este punto donde está 00:26:00
punto de referencia y además se ha hecho su hijo 00:26:01
¿vale? se llama hola 00:26:04
porque en el código hemos dicho 00:26:05
que la instancia 00:26:07
que el nombre de esa instancia sea 00:26:09
hola, vale 00:26:11
entonces ved que no es lo mismo 00:26:13
tener activo este 00:26:15
esta instanciación 00:26:17
bien referenciado todo 00:26:19
que simplemente generar el instant shade 00:26:21
a secas, vale, esto me sirve para que 00:26:24
poco a poco vayáis viendo que 00:26:25
lo que hay dentro de estos 00:26:27
paréntesis 00:26:29
en un método, vale 00:26:31
pues influye 00:26:33
un método o una función que son lo mismo 00:26:35
ya os comenté el otro día 00:26:38
que son digamos 00:26:40
operaciones de acción de algo que ocurre 00:26:42
en este caso vamos a instanciar 00:26:44
en este caso esto es otro método 00:26:46
que sirve para marcar 00:26:47
que va a ocurrir al empezar el juego 00:26:50
o al iniciarse este script 00:26:51
recordad que era cuando el objeto se iniciaba 00:26:53
y si veis cuando hay un método 00:26:55
tiene pues el nombre 00:26:58
de esa acción que va a hacer 00:27:00
y siempre va a ir a continuación 00:27:01
un paréntesis, ¿vale? A veces vacío, a veces lleno. 00:27:04
Pero cuando vemos una palabra que está escrita en mayúsculas, 00:27:08
la primera letra, y luego tiene paréntesis, 00:27:12
eso significa que estamos usando lo que se llama un método función. 00:27:15
Es decir, una acción que vamos a hacer. 00:27:18
¿Vale? Que no es lo mismo que si yo pongo 00:27:20
transform position igual a referencia. 00:27:22
Que esto básicamente, a ver, reference position, había que aprender. Esto ya os explicaré un poco más qué es, pero al final no es lo mismo decir, oye, instanciate aquí y tal cosa, que en esta línea que no vemos ni un solo paréntesis. 00:27:30
Esto significa que aquí no hay ningún método. Los paréntesis pueden indicar más cosas, pero en lo general son métodos o funciones, ¿vale? Ahora volveremos otra vez a los métodos. 00:27:49
Entonces, ya simplemente por terminar, esta explicación como de las sobrecargas que puede tener Instantiate, tenemos una tercera forma de instanciar, comento todo menos esta última, que yo sé que es, y borro todo lo relacionado con los comentarios, 00:28:00
que es que crea una instancia en el punto de referencia, pero sin rotación, ¿vale? 00:28:25
Vale, aquí si os fijáis tenemos tres elementos, y es igual que el anterior, en el sentido de que el primero de ellos es el prefab, ¿vale? 00:28:32
Y voy a ir a la API un segundo, de Instantiate, que la tenía por aquí abierta, si no me equivoco, aquí está, ¿vale? 00:28:41
Esta es la primera que hemos usado, esta es la segunda y ahora vamos a ir a esta tercera, ¿vale? Esta no la saltamos porque tampoco aporta mucho, pero aquí básicamente nos pide, ¿vale? Un objeto. Ahora, el segundo parámetro, aunque es parecido, es una posición, ¿vale? De tipo vector 3. Esto es verdad que todavía no lo hemos visto. 00:28:49
Y luego la rotación. Esto ahora mismo es un poco enrevesado y por eso no voy a meterme mucho. Volvemos a ello si queréis más adelante. Pero esta sobrecarga, al final, lo que me está pidiendo son otro tipo de valores. 00:29:12
Entonces, si os fijáis, incluso aquí, cuando vemos esta referencia, aquí no me está pidiendo un transform completo, como sí que hacía en la otra sobrecarga. Aquí me pedía el transform completo del objeto que iba a ser el padre. 00:29:26
Aquí me pide solo la posición. Entonces quiero que vayáis también teniendo en la cabeza que ciertos parámetros tienen más parámetros dentro, como hemos dicho antes, que podemos ir abriendo con punto. 00:29:44
Porque pensad una cosa, si me está pidiendo la posición de un elemento y yo tengo un transform en referencia, yo al final lo que estoy haciendo es, en este transform, estoy cogiendo todo lo que hay en este componente. 00:29:58
La posición, la rotación y la escala, que al final son tres valores de la posición, tres valores de la rotación y tres valores de la escala, ¿verdad? Entonces, cuando me piden solo la posición, vais a ver que al final lo que estoy haciendo aquí es decirle, vale, de este transform que yo he llamado reference, solo voy a coger la posición, porque si intento meter todo, esto me da fallo, porque dice, vale, no sé de todo lo que tiene dentro en la posición o en la rotación, 00:30:12
pues yo qué sé, si yo pongo aquí rotation, veis que puedo meter la rotación, ¿vale? 00:30:42
Me da fallo también por otras sutilezas, porque habría que ponerlo en ángulo Seuler, 00:30:50
básicamente, que es una cosa que ya veremos en este tema, ¿vale? 00:30:56
Pero veis que a medida que yo le voy dando la instrucción correcta, 00:30:59
esto me puede dar que algo se puede ejecutar o no, ¿vale? 00:31:03
Sutilezas, que a veces hay que ir pensando, ¿qué valores estoy guardando en este transform? 00:31:07
Bueno, pues estoy guardando los de posición, los de rotación, los de escala y aquí solo me pide posición, ¿vale? Y luego aquí, bueno, me pide la rotación, que esto sí que es verdad que es más avanzado, entonces no me voy a meter mucho, pero aquí básicamente con esta instrucción estoy diciéndole, cógeme la rotación que tenga por defecto el objeto, ¿vale? 00:31:11
Entonces yo cuando use este método de instanciación vais a ver que a diferencia de antes, cuando yo lo genero, me lo genera la posición, pero ahora no es hijo de nada, no es hijo del punto de referencia como ocurría antes, que lo usaba como padre. 00:31:31
E igualmente, como no estoy poniendo que esta instancia sea una caja a la que yo puedo cambiar el nombre, pues no se llama hola, se llama nave prefab clon, que es el nombre genérico que ha cogido del objeto. Cuando le hemos metido aquí el objeto, como se llama nave prefab, pues dice, vale, por de nave prefab he hecho un clon. 00:31:50
Hasta aquí un poco lo relacionado con Instantiate. Cuando ya vayáis entendiendo cómo se usan más métodos, pues Instantiate lo iréis entendiendo mucho mejor. Voy a otro archivo que tengo aquí preparado para ir al tema 0, que es el que me interesa en esta tutoría, si no tenéis más dudas de la tarea del tema 1. 00:32:08
vale, vamos al tema 00:32:27
cero, voy a guardar 00:32:31
vale, recordad esta esterilla 00:32:34
esta pequeña 00:32:35
estrella y voy a ello 00:32:38
vale, tengo 00:32:39
aquí otro script que simplemente 00:32:42
va a servir para 00:32:44
para 00:32:44
practicar ahora, no va a tener 00:32:46
como hemos hecho ahora en InstanceAid que se ve 00:32:49
un resultado claro en el visor 00:32:51
pero me sirve para que vayamos entendiendo mejor 00:32:53
qué tipos de variables existen 00:32:55
y usos y aplicaciones que se pueden hacer. 00:32:57
De momento quizá un poco abstractas en el sentido de, pues solo estamos viendo sumas y restas, 00:32:59
pero luego es que esas sumas y restas, como dije el otro día, 00:33:04
puede ser como sube y baja el número de puntos que tiene un contador, ¿vale? 00:33:07
Y se va a basar un poco en lo mismo. 00:33:12
Entonces, recordad, a ver, que creo que alguien se ha metido, perdonad, 00:33:14
o se ha salido, no lo sé, vale. 00:33:19
recordad cómo se generaba un script 00:33:22
que es, lo voy a hacer en esta 00:33:25
carpeta de script que tengo aquí preparada 00:33:27
durante la tutoría, pues yo hago 00:33:29
este script 00:33:31
recordad que en este cesar script 00:33:32
podemos generar un script que vamos 00:33:35
a llamar 00:33:37
durante, recordad 00:33:38
que el nombre que vayamos 00:33:41
asignando aquí, luego debe ser el mismo 00:33:43
de la clase de dentro del script, esto ya lo he 00:33:45
dicho como en dos tutorías previas, por tanto 00:33:47
entiendo que no habrá 00:33:49
problema y además en el tema cero va poniendo buenas prácticas de cómo 00:33:51
escribir las los nombres de los scripts los nombres de las 00:33:56
de los métodos de las variables vale y habla de una cosa que es el pascal case 00:34:03
y el camel case vale cuando generamos una clase o lo que es lo mismo generamos 00:34:08
dentro de Unity un script 00:34:15
siempre, lo digo porque luego nos va a ayudar a que todo sea más fácil 00:34:18
de ir siguiendo, siempre deberíamos empezar a escribir el nombre del script 00:34:23
con mayúscula. Y a diferencia de 00:34:27
nuestro lenguaje del día a día, los espacios no existen 00:34:31
o no se usan correctamente cuando estamos escribiendo órdenes. 00:34:35
Si os fijáis, todo lo que os he ido enseñando antes no había espacios 00:34:39
había muy pocos 00:34:42
hasta que no termine de escribir esto no quiero 00:34:43
volver a enseñaros en script 00:34:46
pero vais a ver que normalmente 00:34:48
se escriben las palabras juntas 00:34:50
¿y cómo se distingue que una palabra 00:34:52
pues hay un espacio 00:34:54
entre ellos? en vez de dar el típico espacio 00:34:59
que hacemos con la barra espaciadora 00:35:01
lo que hacemos es empezar la siguiente palabra 00:35:02
con mayúscula durante 00:35:04
la tutoría 00:35:06
importante, lo que son tildes 00:35:08
y eñes 00:35:10
no las uséis nunca en nada relacionado con 00:35:12
programación, me explico 00:35:15
incluso aunque esto sea el nombre de un script 00:35:17
recordad que, vale, guardo 00:35:19
y se genera, que cuando yo genero 00:35:21
este script al final estoy realizando 00:35:23
un código cuyo nombre 00:35:25
de clase también está dentro 00:35:27
del código, si yo empiezo a poner tildes 00:35:29
esto va a empezar a dar ciertos 00:35:31
problemas, vale, y aunque ahora 00:35:33
parezca a lo mejor que no lo da 00:35:35
tarde o temprano lo va a dar, igual 00:35:36
sucede si ponemos una ñ 00:35:39
O si ponemos un signo que no esté reconocido, que pueda haber algunos. Entonces, atención. Fijaos que siempre he escrito con la primera letra mayúscula en lo que se llama Pascal Case. Pascal fue un, si no recuerdo mal, un matemático. Y como es un nombre propio, por eso se llama así, con mayúscula. Pascal Case. 00:35:40
Que no es lo mismo si nos fijamos a lo que hemos estado... Bueno, y fijaos también que los métodos, los de los paréntesis, también van con mayúsculas. Es decir, instantiate existe con mayúsculas, ¿vale? Pero si yo me pongo a buscarlos con minúscula, no existe. 00:36:02
Es decir, sí que intenta ayudarme diciéndome que esto está en mayúsculas, pero vais a ver que yo cuando lo ponga, me lo ponen en mayúsculas. Los métodos, esas palabras que sirven para indicar que se ejecute una acción, que van con estos paréntesis, siempre empiezan a escribirse con mayúsculas. 00:36:16
Y lo mismo, si Instanciate tuviera otra palabra, sería InstanciateDouble, yo que sé. 00:36:32
Pues no se separa, no se separa así, porque esto significa hacer dos instrucciones distintas o otro tipo de orden. 00:36:38
Si es solo una orden llamada InstanciateDouble, no hay espacio en el medio. 00:36:47
Se van separando, digamos, marcando la separación de palabras con esta mayúscula, que va separando estas palabras. 00:36:52
Del mismo modo, si pongo el script que hemos estado viendo antes, si os fijáis, ojo, las clases, y os recuerdo que siempre digo que esto es una clase, el nombre que le ponemos al script es una clase. 00:36:59
Y estos son clases que os recuerdo que si le dais con la letra control os podéis meter, ¿vale? Esto es simplemente curiosidad. Y podéis ver todo el código que digamos ya alguien ha preparado para que nosotros podamos usarlo, ¿vale? Vuelvo aquí. Entonces, cuando generamos clases, fijaos cómo es la gramática de esta declaración del tipo de variable que es una clase, ¿no? Como hemos dicho antes. Una G mayúscula y para separar, mayúscula, ¿no? 00:37:23
Y luego aquí hay un espacio que si yo no pusiera significa que es todo la misma palabra, ¿vale? Y daría fallo porque significa otra cosa. Cuidado, los espacios se usan, se deben usar cuando se deben usar. 00:37:47
Y las variables, por convención, se escriben del mismo modo, pero empezando en minúscula. Igual que instant set va con mayúscula, fijaos que my prefab, cuando lo hemos declarado aquí al principio, va con minúscula. 00:37:58
igual cuando queramos 00:38:12
separar 00:38:14
veis que el my bien, porque es el nombre 00:38:17
que le hemos dado a GameObject, pero este prefab aquí 00:38:19
no pinta nada, para que lo interprete 00:38:21
como el nombre de la caja, aunque sean dos palabras 00:38:23
distintas, empieza con minúscula 00:38:24
y para separar las palabras 00:38:26
hay que poner una mayúscula aquí 00:38:28
y os lo dije el otro día, y si no os habéis dado cuenta 00:38:30
fijaos, si está preparado esto 00:38:32
que aunque no dejemos esos espacios 00:38:34
el propio 00:38:37
el propio Unity 00:38:37
ya va viendo donde meter los espacios 00:38:41
aquí nos ha metido un espacio en donde 00:38:43
en el nombre del script no lo había, recordad 00:38:45
o incluso en 00:38:47
el my prefab, que es el 00:38:49
nombre de la variable que hemos puesto, la m 00:38:51
si la ha puesto en mayúsculas y ha puesto 00:38:53
este espacio, fijaos 00:38:55
que el propio software 00:38:56
sabe interpretarlo, entonces nosotros 00:38:58
nos tenemos que hacer a la forma en la que tenemos 00:39:00
que escribir el código, importante 00:39:03
es decir, recapitulando, las clases 00:39:04
barra, porque es lo mismo, scripts 00:39:07
Entonces, siempre comenzando con mayúsculas, los métodos, a medida que vayamos sabiendo cómo llamarlos o cómo crearlos, también en mayúsculas, ¿vale? Y lo que son las variables en minúsculas, ¿vale? La diferencia de esto es que esto es PascalCase porque empieza en mayúscula y esto es lo que se llama CamelCase. 00:39:09
Lo de camel porque aparece como la joroba de un camello. Esto también viene en los apuntes. Si os sirve para acordaros, pues camel case es cuando empieza en minúscula. Pascal case cuando es un nombre propio. Vamos un poco con durante la tutoría que son operaciones más básicas para ir viendo el tema cero. 00:39:30
Vale, sobre las variables el otro día estuvimos ya hablando bastante, y de hecho aquí volvemos a hablar, de hecho lo de camel case está aquí puesto, que hay que darle un nombre a la variable, que cada uno puede tener un tipo de valor, que es lo que el otro día estuvimos hablando, que eran los ints, los floats, los strings, las cadenas. 00:39:51
¿Recordáis esto, verdad? Esto ya lo hemos visto 00:40:09
Entonces más o menos 00:40:11
Hasta aquí lo tenemos 00:40:13
Hemos visto incluso ya tipos de variables 00:40:14
De tipo clase, ¿no? Como este GameObject 00:40:17
O este Transform en el que guardábamos 00:40:19
La referencia que cogíamos por el inspector 00:40:21
En el SerializeField 00:40:23
¿Sí? 00:40:24
Por ejemplo 00:40:27
Imaginaos que yo en el código 00:40:28
¿Vale? Aquí justo dentro de la clase 00:40:30
Recordad que las llaves delimitan 00:40:33
¿Qué hay dentro de cada 00:40:35
uno de los apartados del código vale y las clases vale cuando empezamos una 00:40:37
clase vamos generando estas variables como he dicho antes que luego podrán ser 00:40:45
usadas dentro de todo este bloque vale cuando vamos trabajando en un lenguaje 00:40:50
como cesar vale al final existe un proceso bueno una lógica que es el 00:40:56
encapsulamiento vale el encapsulamiento significa que dentro de estas llaves 00:41:03
de cada uno de los bloques, de esta o de esta, que es otro bloque, o de este, que es otro bloque, 00:41:07
podemos ir usando variables que queremos, nos puede interesar, que solo existan dentro de este bloque 00:41:13
o que existan en este bloque y por defecto también existen los de dentro. 00:41:18
El encapsulamiento sirve para que, digamos, partes del código se puedan comunicar entre sí o no. 00:41:23
Esto también lo iremos viendo. 00:41:28
Pero este concepto de encapsulamiento, si a alguien le interesa, existe. 00:41:30
y ya me sirve para explicar eso, que cuando 00:41:33
tenemos una clase que es donde vamos generando 00:41:36
todas las instrucciones que hay dentro de este script 00:41:38
pues ya vamos a lo mejor haciendo variables 00:41:40
y esto es el script de 00:41:42
el movimiento del jugador 00:41:44
imaginaos que fuera esta la función de este 00:41:46
script, que luego meteremos como 00:41:48
componente al GameObject del jugador 00:41:50
pues ese jugador a lo mejor 00:41:53
vamos a querer que tenga una vida inicial 00:41:56
¿no? y quiero que 00:41:58
esa vida inicial sea de 100 puntos 00:42:00
imaginaos vale esto veis que yo por defecto si pongo un 100 no sirve para nada me da falla 100 00:42:02
que no sabe que es incluso cuando empieza el juego yo puedo decir aquí 100 y punto y coma vale pero 00:42:10
me va a decir 100 que no tenéis que ir entendiendo que es que los números y los datos no existen en 00:42:18
el código no no son operativos hasta que no se encierran en una variable que es lo que ya vimos 00:42:26
el otro día, si queremos 00:42:31
generar una variable de la vida del 00:42:33
personaje que guarde un valor 100 00:42:35
¿qué habría que generar? 00:42:37
¿o cómo sería? 00:42:40
que esto el otro día un poco vimos 00:42:42
una variable, ¿no? 00:42:43
vale, ¿y cómo? dime un poco 00:42:48
¿cómo la genero? 00:42:50
pues pones int 00:42:52
vale, int, ahora la vemos 00:42:53
espacio, vida 00:42:56
o vidas 00:42:58
igual a 100 00:43:00
vale, mira, que me digas 00:43:00
esto así, significa que ya has aprendido como se 00:43:04
declara una variable muy bien 00:43:06
aprendido, así que vamos a ello 00:43:07
¿por qué ha sido int y no float? 00:43:09
o string o otra cosa 00:43:12
porque es un número entero, ¿vale? 00:43:13
entonces, también 00:43:15
esto habría que ver el juego, pero la vida 00:43:17
normalmente si tiene un valor como 00:43:19
100 que es el máximo, acabo de decir 00:43:21
y vamos a decir ya por defecto 00:43:23
que la muerte es que llega al cero, ¿vale? 00:43:26
pues normalmente 00:43:29
en un contador de eso no va a ir tan fino como ir a decimales 00:43:29
Entonces, para no complicar al programa, pues no declaramos un float, que si no recordamos, para refrescar un float, era un parámetro, una variable, perdonad, con decimales, ¿vale? 00:43:32
Imaginaos que quisiera guardar una con decimales, y en ese caso, pues podríamos decir cosas como 5 con 5, ¿no? 00:43:45
¿Vale? Esto lo recordamos del otro día, que la f sirve para indicar que este punto al final es el separador de los decimales. 00:43:52
Y si no lo ponemos, o ponemos una coma, veis que ya empieza a dar errores, o si no ponemos el punto también, el F también empieza a dar errores, ¿vale? La sintaxis hay que aprenderla. 00:43:59
Entonces, tenemos aquí una variable que es vida 100, y esto significa que en este script ya podremos ir, en cualquier momento, ir diciendo que la vida, cuando arranca el juego, la vida del personaje es 100, ¿vale? 00:44:10
Y veis que yo tengo esta vida y es verdad que cuando declaramos una variable, que es darle una forma a la caja y un nombre, ¿vale? También la inicializamos o podemos decir, ¿vale? Que la vida, cuando arranque el juego dentro de esa caja al empezar, ¿vale? Tenga un 100, ¿no? Que esto lo vimos el otro día también. 00:44:24
Ahora es verdad que hemos guardado este dato, pero como el dato está declarado aquí arriba, todos los cambios que vayamos haciendo se estarán guardando en la caja que está aquí arriba. 00:44:46
¿Eso qué significa? Que antes os he hablado de que existían bloques para ir declarando las variables, incluso usándolas. 00:45:01
porque os he dicho también antes cuando hemos visto 00:45:10
lo de la instancia que guardamos 00:45:13
como variable, que se puede generar 00:45:15
incluso una instancia dentro de 00:45:17
un start, de un método 00:45:18
de un momento de acción, yo puedo decir 00:45:20
vale, esta variable vida se genera 00:45:23
aquí con un valor de 100 00:45:25
y luego decir vale 00:45:26
y en el update que vida 00:45:29
pase a llamarse, pase a valer 00:45:30
500, porque 00:45:33
cuando el primer frame queremos que sea 100 00:45:34
pero ya los siguientes 500, veis que 00:45:37
aquí vida da un fallo vale y esto es simple ya alguien me sabría decir el porqué a ver si eso 00:45:39
más o menos vamos se explica en el tema 0 pero oye vale os he dicho antes que existía este 00:45:46
encapsulamiento que servía para ir digamos generando bloques fijaos que cuando yo genero 00:45:52
la caja barra la variable le pongo el tipo de variable que es y yo he generado esta caja aquí 00:45:59
en el start. Y esto es un bloque, ¿vale? A diferencia de cuando lo generamos en la clase, que veis que comprende todo, aquí solo comprende esto. 00:46:04
Por tanto, cuando llamamos a esta variable en otro punto que no es de su bloque, pues no existe, ¿vale? Aquí podríamos incluso generar otra variable 00:46:12
llamada vida, que es una vida diferente a esta. Son dos variables distintas, ¿vale? Esto no es lo mismo que lo que habíamos hecho antes de decir, 00:46:22
Yo genero, declaro esta variable aquí arriba y ahora existe esta caja preparada en todo este ámbito. Y aquí es donde digo, vida 100. Y aquí el 100 se está guardando aquí arriba. Es decir, este 100 se está guardando en todo este tránsito. 00:46:30
Si yo aquí, por ejemplo, dijera, voy a enseñar por consola, esto ya lo vimos el otro día, que es el debug log, voy a querer que me vaya en cada fotograma enseñando lo que vale vida. Y veis que no me da ningún fallo. Me está enseñando vida, que está aquí creada la caja y la he cargado con un valor aquí. 00:46:48
Es verdad que este ámbito donde he dicho que vale 100, y vais a ver que lo que me va a mostrar es 100, que este valor de 100 lo he generado aquí y este 100 ya está fuera del bloque. 00:47:07
Pero es que la caja donde está guardando los valores sí está fuera y sí que está en la cápsula, digamos, en el bloque, que luego permite que se comunique con una inferior, que es el update. 00:47:21
Si yo ahora ejecuto esta instrucción, lo primero es que probablemente desfalle o pase algo raro. Yo voy a la consola y no veo ni 100, ni 0, ni nada. ¿Por qué? A ver quién me lo sabe responder. Esto si habéis hecho la tarea 1 deberíais saberlo. 00:47:30
No has asignado el código, ¿no? 00:47:52
Efectivamente. 00:47:55
No hay ningún objeto dentro del juego, 00:47:56
ni le hemos dicho de otra forma que se ejecute, 00:47:59
no hay ningún objeto en el juego que tenga este script. 00:48:02
Por tanto, el script no se está ejecutando. 00:48:03
Es decir, no hay ningún momento start de nada 00:48:06
en donde se ejecute esto, ¿no? 00:48:08
Entonces, pues en punto referencia, 00:48:10
me da igual porque solo van a ser números, ¿vale? 00:48:14
Voy a asignar este durante la tutoría como componente, ¿vale? 00:48:16
A ver, he guardado, recordad que hay que guardar el script, ahí está, y ahora lanzo el juego. A ver, y ahora sí que cada fotograma está generando un 100. Aquí se van sumando hasta que llegue a 1000, que ya no sea más, pero aquí se van 100, 100, 100, 100. 00:48:21
¿Vale? Entendéis que al final lo que estamos consiguiendo es cambiar las variables en distintos puntos del código. Esto es importante entenderlo porque es lo que os he dicho antes. Si yo genero aquí la caja y aquí no existiera y guardo la caja aquí, al final vida no existe para el update porque está fuera del ámbito donde se ha generado esta caja. 00:48:36
Esto también es por algo que se llama los ámbitos 00:48:56
Que voy algunos pasos más adelante 00:49:00
Dentro del tema cero, aquí se habla de los ámbitos de las variables 00:49:04
Y habla un poquito de estos bloques y de estos ámbitos 00:49:08
Y un poco también de lo que os estoy comentando aquí 00:49:13
Igual este código es un poco más avanzado 00:49:16
Por eso lo estoy simplificando 00:49:19
Pero básicamente de lo que habla es que están las variables globales 00:49:20
que se declaran al comienzo y están disponibles en todo el script, 00:49:25
incluso dentro de las funciones, como sería el start y el update y aquí saludar. 00:49:27
Y luego las locales, que se declaran dentro de una función. 00:49:32
Y por eso solo están disponibles dentro de ella. 00:49:36
Por tanto, cuando más adelante hablemos, aquí he declarado una variable local, 00:49:39
porque está en un bloque muy concreto, una función, 00:49:45
y aquí las que se generan dentro de la clase son las variables que se llaman global. 00:49:49
¿Vale? Es verdad que el otro día ya os dejé caer también que cuando, y voy a quitar esta variable global y vuelve a dar este fallo, ¿no? Os dije que por defecto si una variable, y bueno vuelvo al de instanciar, si una variable le ponemos serialize fill es cuando conseguimos que podamos referenciar o capturar cosas desde el inspector, ¿no? Que es lo que hemos hecho con el prefab que hemos arrastrado, ¿vale? 00:49:55
Y también os dije otra forma de hacerlo, que era poniendo delante la palabra public, pública, ¿vale? Vais a ver que yo cuando ponga public aquí, a ver si quiere, a ver, public, uy, va, espera, que algo he hecho y he abierto. 00:50:22
A ver qué está pasando... Vale, cuando también tengamos... No, está bien. A ver, un segundo. Vale. Cuando tengamos variables públicas, aunque ahora me esté dando fallo, ya veremos que esto no sucede cuando lo hagamos en otros momentos. 00:50:40
Voy a volver a declararla como variable global. Cuando es pública, significa que va a trascender su propia cápsula e incluso en otros scripts distintos, en otras clases que tengamos, podremos acceder a esta variable. 00:51:06
Esto es más avanzado, pero me sirve para entender que por defecto, si no pone nada aquí, como hemos tenido hasta ahora, como me ha dicho Elisa, las variables son privadas. Es lo mismo poner esto de private que no poner nada, porque se entiende que una variable que no declaramos su ámbito es privada. 00:51:25
Cuando es privada es cuando ocurre esto que os estoy diciendo de que se encierra en su cápsula y solo se puede referenciar a esta variable en su bloque. 00:51:44
Cuando la ponemos en pública, además Unity tiene la... aparte de permitir que en otros scripts podamos acceder, 00:51:54
Si yo ahora mismo, por ejemplo, pusiera... Bueno, es que es un poco avanzado esto, ya lo veremos. Si pusiera un acceso a esta clase, podría acceder a variable con decimales desde otro punto, desde otro código. 00:52:04
Pero aparte tiene la capacidad de que cuando guardamos y volvemos a Unity, vais a ver que ahora existe esa variable igual que con el serializeField, que lo podemos aquí modificar. 00:52:18
Venía por defecto el 5.5 que está declarado aquí, pero aquí lo podemos modificar, si os fijáis. Está preparada. Esto significa que no es lo mismo, para que veáis y leéis una cosa, que no es lo mismo poner serialize fill de tipo in, lo que sea, y variable serializada. 00:52:30
también me sirve para que veáis 00:52:54
como voy escribiendo las variables 00:52:56
es algo muy importante 00:52:57
y le asigno y le pongo un 00:52:59
5.8f 00:53:01
porque es un float 00:53:03
¿vale? vais a ver que yo cuando 00:53:05
bueno, ¿por qué da fallo? 00:53:08
porque he intentado guardar una variable float 00:53:10
en un int ¿vale? entonces 00:53:12
es importante los tipos 00:53:13
de variables como los vamos gestionando 00:53:16
cuando ahora vaya 00:53:17
al script tengo las dos variables 00:53:21
Veis que aquí en apariencia hacen lo mismo, pero si aterrizamos aquí, vemos que una es pública y eso será accesible desde otras clases. 00:53:23
De hecho, veis que la clase ya por defecto no la declara pública también, para que podamos comunicarnos con esta clase en otros puntos del juego, con esta script en otros puntos del juego, en otros códigos. 00:53:34
Pero esta, realmente, al no poner nada del ámbito, en realidad privada, no podremos acceder a esta variable desde otros puntos del script. De los scripts. De este sí, porque está dentro de su ámbito, pero no podremos ir a otros códigos que se llamen tal cual. De hecho, lo voy a hacer muy rápido, aunque no entendamos tampoco. 00:53:44
Tengo el script durante la tutoría y el script Instanced Prefab que he preparado antes. 00:54:06
Imaginaos que yo quiero cambiar desde Instanced Prefab la variable con decimales. 00:54:11
Lo primero que habrá que hacer, igual que hemos hecho aquí, es decir, durante la tutoría, 00:54:18
y veis que ahora voy a generar una variable que se llama igual que otro script. 00:54:23
Y es que recordad, al final las clases, como os he dicho aquí, se corresponden con el nombre de los componentes. 00:54:29
Y cuando arrastramos un script como componente, al final, igual que existe transform, pues existe el componente durante la tutoría. 00:54:36
Es una caja que podemos crear, ¿no? 00:54:44
Entonces, por eso existe aquí una caja, y no da ningún fallo, que se llama durante la tutoría. 00:54:47
Y aquí lo puedo llamar como otro, en minúscula, porque es una variable, ¿vale? 00:54:51
Otro script. 00:54:57
Y aquí está preparado. 00:54:59
Y yo en el transform puedo decirle, oye, quiero que otro script acceder a sus propiedades. 00:54:59
Y vais a ver que yo, a medida que me vaya metiendo en sus propiedades con el punto, 00:55:06
como estoy apelando aquí, hay una variable suya de durante la tutoría que se llama variable con decimales. 00:55:11
Pues vais a ver que, cuando yo doy ya el punto, aquí existe una variable llamada variable con decimales. 00:55:17
Y yo puedo decir, oye, pues esto quiero que valga 10. 00:55:24
Y aquí está cambiando el valor. Si yo guardo esto, desde otro código estoy cambiando el valor de este 5,5. Y de hecho vais a ver cuando empiece el juego que variable con decimales, que por defecto debería ser 5,5, ahora como lo he cambiado, pues está cambiado. 00:55:28
Ahora os explico otra cosa. Como lo he cambiado en el componente, pues se ha quedado con otro comportamiento. Pero yo cuando arranco el juego y pasa por ese start, vais a ver que vale. A ver, hazme caso. Claro, lo he cambiado aquí. Un segundito. Variable con decimales durante la tutoría. Instanced prefab. Y no se está ejecutando porque nuevamente este instanced prefab ahora no está en ninguno de los objetos. 00:55:49
Ah, pues sí, sí que está. A ver, está en script retainer. Entonces, bueno, vamos a hacer otra cosa porque no lo está cambiando en el editor, pero sí que lo está cambiando realmente. Si aquí decimos en el update, borro esto, que en vez de enseñarme la vida me enseña lo que vale variable con decimales, ¿vale? Vais a ver que lo que pone cada fotograma es 10 y no el 5,5 que está ahí. 00:56:16
entonces, vuelvo a ejecutar 00:56:42
me está enseñando 5.5 00:56:45
pero bueno, esto que está haciendo 00:56:49
a ver un segundito 00:56:50
5.5, bla bla bla, me enseña esto 00:56:51
bien 00:56:55
pues 00:56:56
vale 00:57:01
un segundo, solo por probar si es esto 00:57:10
hasta luego Jesús 00:57:21
a ver, vale 00:57:22
hay otro problema 00:57:26
¿vale? que es por lo que se usa 00:57:28
el serialize fill en ocasiones 00:57:30
Que es que cuando tenemos aquí un script que vamos cambiando el valor, lo que vamos escribiendo aquí se sobreimpone a todo lo que vayamos cambiando. 00:57:31
Entonces, si aquí dejamos un valor ya puesto, que es diferente al que venía por defecto, se sobreescribe ese. 00:57:41
De hecho, veis que yo aquí pongo 33,2 y el que sale es 33,2. 00:57:49
En ese caso, habrá que ir operando de distinto modo, porque como está haciendo público, lo está variando aquí. Pero bueno, no debería... Perdona, porque esto en realidad lo estoy haciendo, pero porque veáis una cosa que no es ni siquiera esto. 00:57:53
a ver, espera un segundo, que ya es por saber 00:58:16
que estoy haciendo yo 00:58:19
y va a poner 33.2 00:58:20
porque es el que está sobre escribiendo 00:58:22
vale, este es el 00:58:25
típico problema que pasa cuando tenemos 00:58:27
un public 00:58:29
y al final lo que estamos haciendo 00:58:29
es cambiar el valor, igual que hemos hecho 00:58:33
con los valores 00:58:34
de estos puntos 00:58:36
lo estamos cambiando en el 00:58:38
editor, que es que básicamente 00:58:41
en el editor estamos marcando que tiene que hacer 00:58:42
Unity y está sobreponiéndose a lo que hace el código. Lo que me importa de todo esto es simplemente que veáis, ¿vale? Esto suele tener otro uso, pero lo que me interesa es que veáis que variable serializada, como es private, si yo voy aquí durante la tutoría e intento acceder a, ¿cómo se llamaba? Igual que he podido acceder a variable con decimales, a variable serializada, otro script, ¿vale? No va a aparecer. 00:58:45
Es decir, no va a aparecer variable serializada e incluso aunque yo me ponga a intentar escribir que valga 20, yo que sé, me da fallo. ¿Por qué? Simplemente... Ah, y bueno, ya sé por qué no se está ejecutando, no estaba guardando creo. Vale, lo escribo bien. 00:59:12
durante la tutoría 00:59:29
yo aunque tengo esta variable aquí serializada 00:59:32
¿vale? no me la coge 00:59:35
¿por qué? porque es privada 00:59:36
hasta que yo no la haga pública 00:59:38
yo no voy a poder acceder 00:59:39
veis que ahora ya ha dejado de tener error 00:59:43
esto simplemente me sirve 00:59:44
lo mismo, todavía no sabemos aplicarlo 00:59:46
me sirve para que veáis que las variables 00:59:48
en ocasiones no se podrá acceder a ellas 00:59:50
o no se podrá ver en el editor 00:59:52
porque 00:59:55
no tienen el ámbito 00:59:55
el acceso al ámbito correcto, ¿vale? 00:59:58
Me estoy enrevesando mucho quizá con ciertas cosas 01:00:03
y vamos a volver a donde nos hemos quedado, 01:00:07
pero lo que me importa es que ya sabemos que cada bloque, 01:00:09
¿veis? 01:00:12
Irá dando fallo o no según el ámbito que tenga, 01:00:13
en dónde se declara esta caja, 01:00:17
que no es lo mismo declararla aquí al comienzo de la clase 01:00:19
que dentro del start, por ejemplo, ¿vale? 01:00:21
Luego, tenemos aquí un int 01:00:24
y hago aquí un float que es vida y power up, yo que sé, 01:00:26
que es como los puntos que va a dar a la vida el power up cuando lo recojamos. 01:00:37
Le voy a poner que 50, recupera media vida. 01:00:40
Lo suyo sería que si hubiera más de 100, pues el power up no te permitirá tener más de 100, 01:00:43
pero vamos a obviar eso de momento. 01:00:47
Lo que podemos hacer, el otro día dijimos, es que podemos hacer operaciones de vida más power up 01:00:49
y que esto signifique algo, pero lo mismo, hasta que no lo metemos dentro de un contexto, de una caja, 01:00:56
no va a dar ningún resultado. Voy a poner vida actual, que va a ser igual a la vida más power up. 01:01:03
Y esto da un problema ahora mismo. He generado dentro de start, porque digamos que solo lo voy a ejecutar en el start, 01:01:12
una variable llamada vida actual que me da error. ¿Y por qué pensáis que puede ser? 01:01:20
A ver si... Así rápido. Igual no caéis. 01:01:26
¿Pero por qué podría ser? ¿Qué error? 01:01:28
Porque realmente está bien configurado. 01:01:30
Hemos hecho las cajas, le hemos dado unos valores 01:01:32
y estamos guardando dentro de otra caja tipo int estos dos valores, 01:01:33
que el otro día ya vimos que se podía operar de este modo. 01:01:39
¿Por qué pensáis que da fallo? 01:01:42
A ver si lo podéis... 01:01:44
Simplemente también para que lo veáis. 01:01:48
Los tipos de cajas, cuando sumamos 100 más 50 da 150 y es un entero, ¿no? 01:01:49
Pero es verdad que aunque sea un entero, esto lo hemos generado como un float, es decir, está esperando decimales y una vez tenemos decimales en una operación, como sucede en PowerApp, ya no podemos meterlo en un float, en un int, perdón, hay que meterlo en un float. 01:01:57
¿Por qué? Porque será susceptible a meter decimales. Porque pensad que si yo hubiera puesto esto, ¿vale? ¿Qué podría ser? Aquí el int jamás va a saber qué meter en esta caja porque se sale de su rango. ¿Vale? Vais a ver que si yo pongo float, el fallo deja de suceder. ¿Vale? Importante. Hay, digamos, tipos de variables más restrictivas que otras. 01:02:12
Y esto, por lógica, en el caso de los números, por ejemplo, es el que más flexibilidad va a tener, pues es el que permite tanto tener números enteros como decimales. 01:02:32
Pero veis que el int no lo permite. 01:02:43
Hay formas de resolver esto, como hacer conversiones, pero bueno, esto sí que es más avanzado, lo usaremos más adelante, como es transformar un objeto en otro tipo de variable. 01:02:46
Con esto, poniendo entre paréntesis el tipo de variable al que queremos convertir otra, hemos dicho que el 50.5, bueno, pues que como vamos a operar y nos interesa por lo que sea que sea un int, pues que lo convierta en un int redondeando. 01:02:56
Siempre redondea la baja en este caso, pero estamos haciendo lo que se llama una conversión explícita. Estamos diciéndole cómo convertirlo. 01:03:09
Simplemente lo que me sirve es que veáis 01:03:18
Que a veces os pueden dar fallos que decís 01:03:20
¿De dónde me viene esto? 01:03:22
Y es simplemente por el tipo de caja 01:03:23
Porque es más restrictiva del otro 01:03:25
Facilidad para saber identificar eso 01:03:27
Si os ponéis encima de un fallo y lo dejáis quieto 01:03:30
Os va a poner en la segunda línea 01:03:32
En este caso 01:03:35
No se puede convertir implícitamente el tipo float en int 01:03:35
Ya existe conversión explícita 01:03:38
Compruebe si le falta una conversión 01:03:41
Básicamente aquí lo que está diciendo es 01:03:42
Que no se puede convertir si no lo hacemos de manera explícita 01:03:43
a nosotros, como he hecho antes con una orden que se puede ejecutar, no se puede convertir 01:03:46
un float en int porque es que no cabe en esa caja, ¿vale? Importante. Importante también 01:03:51
eso, que el tipo de variable puede determinar qué puede haber dentro. Luego, el otro día 01:03:57
vimos también que había otro tipo, entiendo que entre, con todos estos problemas que pueden 01:04:02
ir surgiendo, lo que es un int y es un float, ¿no? Y cómo se escribe un float para que 01:04:08
no de error hasta aquí entiendo que bien y bueno así de fácil si yo ahora quisiera ver este valor 01:04:11
en la consola como que lo está recibiendo lo está ejecutando si veo vida actual y guardo 01:04:21
pues ahora al empezar el juego vamos a ver qué valor 150 con 5 perfecto a ver que algo hay por 01:04:30
aquí que a ver lo mismo puede ser varias cosas algo de lo que toca por ahí con decimales 01:04:45
con decimales eso es que bueno os acordáis que yo había puesto varias esto es básicamente fijaos la 01:04:55
que salía aquí vale nuevamente por lo de los hacerlo público no y operar mal yo borra las 01:05:04
variables que eran públicas para acceder desde aquí no y ahora vale dice 01:05:10
durante la tutoría otro script pero ahora ya no existen estas variables el 01:05:14
error aunque ha sido que hemos borrado aquí cosas está afectando a estas 01:05:17
variables que ahora no sabe dónde existen vale como no las queremos lo voy 01:05:21
a borrar pero ver que cuando comunicamos scripts entre sí al igualdo pueden 01:05:25
venir los errores porque estamos hablando entre unos y otros y esto sirve 01:05:29
también para hablar del ámbito que estamos hablando de que salga del bloque 01:05:33
Porque cuando empezamos a hacer códigos muy grandes, si empezamos a hacer todo público, que se puede hacer de un lado a otro, que suele parecer muy conveniente, muy cómodo al principio, como estamos comunicando distintos scripts, surgen este tipo de problemas, que es que, vale, estamos cambiando aquí un script, pero también estamos afectando a otros scripts. 01:05:37
Entonces, si no tenemos un control claro de qué está afectando a qué, o no lo restringimos con cosas privadas o lo redirigimos de otras formas, que ya iremos viendo también, pues al final lo que sucede es que empiezan a surgir estos fallos y ahora es bastante pequeño el código, pero nos puede volver un poco la cabeza del revés. 01:05:55
Bueno, y va a dar 15,5 si no me equivoco, ¿no? 150,5, perdón, pues ahí está, 150,5 con su decimal, ¿vale? 01:06:12
Imaginaos que yo quiero hacer una variable que se va a llamar nombre, ¿vale? Y esto es de repaso del otro día, voy a pasar rápida. 01:06:22
Y yo quiero que ponga mi nombre, que ponga Daniel, ¿vale? He creado aquí una variable y como genero una variable que ponga Daniel, ¿qué tendría que poner? 01:06:29
¿De qué tipo tiene que ser? Una variable de texto. Esto lo vimos el otro día. A ver, vuelvo a la unidad 0, que la tengo por aquí. Aquí, ¿vale? En las variables, pues ponemos las numéricas, int y float, y luego lar de tipo string, ¿no? 01:06:38
Que además pone, podemos usar, su valor se introduce delimitado por comillas, ¿vale? Vale, sí, bueno, esto es otra cosa. Va delimitado por comillas, ¿no? Si os acordáis, existe otro tipo de variable que se llama string, en donde puedo llamarlo nombre, ¿vale? 01:06:57
dado que así es como se va a llamar 01:07:17
aquí abajo cuando la mentemos 01:07:19
y esto va a significar que se llama 01:07:21
que yo quiero que aquí se guarde 01:07:23
el valor Daniel, entre comillas 01:07:25
¿vale? ahora yo cuando lance 01:07:27
el juego, esto lo vimos el otro día, no sé 01:07:29
si tenemos dudas de esto 01:07:31
es muy importante que 01:07:32
entendamos bien cómo funcionan las variables 01:07:35
aquí tenemos a Daniel 01:07:37
¿vale? que esto nuevamente 01:07:38
yo puedo declarar aquí 01:07:41
la variable y aquí 01:07:43
como está dentro del ámbito 01:07:45
en donde se ha declarado la variable 01:07:47
pues aquí es donde puedo decirle, aquí quiero 01:07:49
que se llame Daniel 01:07:51
y ahora pues el resultado será 01:07:52
el mismo, se verá Daniel 01:07:55
¿vale? 01:07:56
si queremos por ejemplo 01:07:59
que en cierto momento del juego, cuando 01:08:01
vayamos metiendo datos en un menú 01:08:03
pues por ejemplo podamos meter 01:08:05
nuestra edad, la edad importante 01:08:07
pues siempre va a ser un entero 01:08:09
¿no? pues no ponemos decimales 01:08:11
25, este es el mismo ejemplo del otro día, lo doy 01:08:12
rápido recordad que como hemos visto antes dependiendo del tipo de variable 01:08:15
pues aquí se va a lanzar de una forma u otra eso que significa que si yo pongo 01:08:20
el nombre más recordad que esto es la concatenación de textos esto también 01:08:26
viene aquí explicado cuando vamos hilando strings con 01:08:32
números vale lo que va haciendo es concatenar ese texto es decir que no es 01:08:37
una soma como tal igual que el igual no es igual y sirve para asignar una 01:08:42
variable vale cuando hacemos nombre más edad vale que aquí no da ningún fallo al 01:08:45
final lo que está haciendo es poner un string daniel y luego un número vale 01:08:53
pero un número que en realidad no es un texto lo que pasa es que hay que 01:08:58
entender que cuando en una concatenación de elementos con este más cuando unimos 01:09:01
varios elementos unos de tipo texto el resto también se convierte en uno de 01:09:06
tipo texto, ¿vale? Pasan a ser 01:09:10
todo de tipo texto, igual que hemos hecho antes 01:09:12
con lo de convertir 01:09:14
el float en in, ¿vale? Daniel 25 01:09:16
no pone ningún espacio porque si 01:09:18
recordáis, también aquí dentro 01:09:20
podemos empezar con las comillas y las 01:09:21
comillas sirven siempre 01:09:24
para ir escribiendo nosotros 01:09:25
textos literales, no son cantidades que 01:09:28
se suman ni que se van a operar, son textos 01:09:30
literales, ahí pone la edad 01:09:32
de espacio, ¿vale? Porque 01:09:33
los espacios también son literales, concatenamos 01:09:36
Daniel, ¿no? 01:09:38
Y ahora concatenamos, es de 25, en este caso, años. 01:09:40
Esto cuando hagamos una UI para ir metiendo nuestro nombre al jugar, etc., es vital que vayamos conociendo cómo se declaran. 01:09:51
Yo ahora lo que voy a ver es la edad de, aquí hemos dejado una especie de variable que yo podría ir cambiando el valor, 01:10:02
incluso se puede ir cambiando durante el juego, o guardará el valor que introduzcamos nosotros en un menú, 01:10:07
en plan, ponerá nombre y ponemos Jesús, pues se guarda Jesús en esta caja y aquí sabe perfectamente 01:10:13
que lo que esté guardado en esta caja, que en ese caso será Jesús, y la edad pues la metemos también 01:10:20
y podrá ser 35, pues en ese momento cambiará para mostrar otro mensaje en otro punto del juego. 01:10:25
y la edad de Daniel es de 35 años. 01:10:31
Fijaos que aquí falta un espacio, básicamente porque 01:10:37
deberíamos decir que literalmente aquí haya un espacio 01:10:40
para que lo respete. 01:10:45
De hecho, es el mismo ejemplo de la semana pasada. 01:10:46
Hasta aquí más o menos vais pillando cómo funcionan los strings. 01:10:50
Quedarse con que se escriben con estas comillas 01:10:53
y es importante que lo interpreta como una cadena de textos literal. 01:10:56
Luego, por otro lado, existe un nuevo tipo de caja que el otro día no hablamos, que son las booleanas. 01:11:02
Y una booleana solo puede guardar dos valores, verdadero y falso. 01:11:09
Una booleana, cuando generamos una variable, será de tipo bool en este caso, para decir que es una booleana. 01:11:14
Y aquí voy a poner semáforo encendido, ¿vale? Y voy a decir por defecto que sea true o false, ¿vale? Tiene dos variables, es decir, que estas booleanas, las booleanas, se escribe así, pueden ser true o false, ¿vale? 01:11:20
Igualmente que siempre, cuando sabemos que algo es booleano, si yo pongo un 5, no es la caja que corresponde y da fallo. 01:11:42
Si yo hasta ahora pongo José, ¿vale? Entre comillas, como haría un string, da fallo, porque en esta caja booleana, llamada semáforo encendido, solo puede estar. 01:11:48
O lo que suele significar true, que está encendido, ¿vale? Que es verdadero esto que ocurre o es falso, ¿vale? 01:11:58
Lo mismo, esto en el tema, cuando hablamos de las variables, lo siguiente que pone aquí es booleanos. 01:12:05
Pueden adoptar solo dos valores predefinidos, muy útiles para crear lo que se llaman interruptores o para indicar que algo está ocurriendo o no. 01:12:12
Estas booleanas se usan mucho y por eso he puesto lo de semáforo, sirven para decir si algo está ocurriendo o no. 01:12:21
Y cuando hagamos condicional es decir, como he dicho antes, si la vida del personaje ya es 100, no se le puede cargar el power up, porque está superando la cifra máxima que damos. 01:12:27
A veces podemos decir, oye, mientras el personaje tenga, y voy a poner indicador, en vez de semáforo, indicador máximo, vida. 01:12:39
¿vale? si yo empiezo 01:12:50
el juego con la vida llena 01:12:52
pues aquí estará true 01:12:53
y entonces mientras esto sea true, pues el power up 01:12:55
no se va a poder coger, porque no nos 01:12:58
interesa, ¿vale? ahora ya iremos 01:13:00
viendo con las, y esto está aquí 01:13:02
introducido, ¿vale? para que lo tengáis, con las estructuras 01:13:04
de control, con los ifs principalmente 01:13:06
pero hay más, ¿vale? iremos 01:13:08
diciendo, dando condiciones para que una cosa 01:13:10
se ocurra 01:13:12
o no ocurra, ¿no? entonces 01:13:14
en el momento que le demos un golpe 01:13:16
a este y baje a 25, cuando pongamos una condición, va a decir, vale, pues como baja de 25 y está 01:13:18
comprobando que ya no es 100, esto va a decir, pues ya no es, es falso, no está con el indicador 01:13:24
al máximo de vida. Y entonces en ese caso sí que le permitirá que cuando cojamos un 01:13:29
power up de suma de la vida para que pase de 25 hasta 75,5, ¿vale? Son como, ahí pone 01:13:33
pues eso, conmutadores, interruptores, semáforos, ¿vale? Pues un semáforo puede estar encendido 01:13:40
o apagado. Entonces las booleanas van a ser sobre todo muy útiles en el momento de ir 01:13:45
planteando ejecuciones e ir viendo si ciertas condiciones se están cumpliendo o no. Ya 01:13:54
veremos ejemplos de esto. También importante, en un debug log, si decimos que enseñe lo 01:14:00
que guarda indicador máximo vida, vais a ver que lo que enseña, en este caso es falso, 01:14:06
pues cuando ejecute el juego 01:14:11
pues falso, ¿vale? 01:14:13
lo pone, no es una cadena de texto, es 01:14:17
que no, está cumpliendo la condición 01:14:19
de hecho internamente el código 01:14:22
lo que está leyendo es que este valor vale 01:14:23
o 0 o 1, es verdad que lo traduce en 01:14:25
falso o verdadero, pero falso es 0 01:14:27
y verdadero es 1 01:14:29
de hecho el otro día os dije que si 01:14:30
una caja, una variable 01:14:33
no se inicializaba 01:14:35
es decir, no se le daba un valor, por defecto 01:14:37
valía 0, o en el caso de los textos 01:14:39
vale nulo, no tiene contenido. Entonces, si yo ahora ejecuto este debug log, como no tiene 01:14:42
nada en su interior, lo que va a mostrar es falso. En realidad es un cero, pero digamos 01:14:50
que la condición es falsa, que no es lo mismo, simplemente por ver que existe también. Si 01:15:00
ponemos true, lo que va a enseñar es true. A ver, espera, ahí está, true. Al final 01:15:05
lo que queremos conseguir es, y voy a abrir el código, que lo tenéis también, y así lo podéis revisar más adelante, 01:15:25
pero lo pongo aquí, era conseguir que una nave espacial en la que van impactando meteoritos vaya quitándole escudo, 01:15:31
vida, por decirlo de otra forma, hasta que muere. Y este es el código, hay más formas de plantearlo, 01:15:41
pero es un código que resuelve el enunciado. 01:15:48
Tenemos esta clase que se llama diagrama, 01:15:52
como se podría llamar un juego nave, porque es descriptivo, 01:15:54
y al final lo que estamos haciendo es generar un float con la energía del escudo, 01:15:59
que empezará al máximo, ahora mismo vale cero, 01:16:04
porque no lo hemos declarado solo. 01:16:08
Un número de vidas, porque el juego, aparte de que muera la nave, 01:16:10
va a haber varias vidas, pierdes una vez y te resta una vida, 01:16:14
Es decir, va a haber la vida del 100 a 0, por ejemplo, y luego tres vidas. Luego, la fuerza del impacto que va a ir restando dos vidas cuando se choquen estos meteoritos. Luego va a haber un booleano, un interruptor, como estábamos diciendo, que nos va a decir si estamos vivos o no. 01:16:17
que este interruptor básicamente lo que va a hacer es 01:16:35
que mientras estamos vivos va a ser 01:16:37
true, porque sí, estamos vivos 01:16:39
pero cuando nos muramos 01:16:41
va a decir que es falso, que estamos 01:16:42
muertos básicamente, si lo traducimos 01:16:45
a nuestro lenguaje, y en el momento en el que 01:16:47
este interruptor pasa a ser falso, es decir 01:16:49
que estamos muertos, pues el juego 01:16:51
va a saber decir, va a entender ya el código 01:16:53
que, pues oye, que el juego se ha acabado 01:16:55
porque no estamos vivos, hemos perdido toda la 01:16:57
energía y también todas las vidas 01:16:59
y luego aquí pues bueno, hay un mensaje 01:17:01
que vamos a ir dando como avisos en pantalla. 01:17:03
Si os fijáis, ya para ir viendo una especie de ejecución 01:17:08
o de puesta en algo menos abstracto, 01:17:12
¿qué es esto? 01:17:17
Cuando iniciamos el juego, cuando iniciamos el script, 01:17:18
lo que vamos a hacer es, en ese momento, 01:17:20
arranca el juego, arranca este script 01:17:22
y vamos a llenar las cajas que nos interesan en este momento 01:17:23
para darle un sentido también al juego. 01:17:27
Hasta este momento solo hemos generado espacios que rellenar. 01:17:29
Pero al empezar el juego nos decimos, oye, quiero que el escudo de la nave sea de 100. Y como se va a jugar con decimales, lo hemos planteado como un float. Esto hay que tenerlo en cuenta, como hemos visto después, para ir teniendo en cuenta problemas que puedan surgir. 01:17:32
que suelen ser fáciles de corregir, pero oye, que nos pueden traer de cabeza, pues tiende vida, ¿vale? 01:17:52
Y aunque no ponga decimales, como es un decimal, es decir, es un float, mejor dicho, ya pongo la F, ¿vale? 01:17:59
Si no la pongo, puede no dar problema, pero veis que ser correcto tampoco conlleva ningún castigo. 01:18:04
Luego, al comenzar el juego, ojo, estamos arrancando el juego y evidentemente arrancamos vivos. 01:18:13
Si empezamos muertos, pues ya sería mal asunto, ¿vale? 01:18:18
Luego, las vidas con las que arrancamos, ¿vale? 01:18:22
Igual que está la energía, pues tendremos tres vidas, ¿vale? 01:18:25
Y luego veis que hay en el start, al arrancar, una operación aquí que ¿qué es? 01:18:27
Por como os he dicho antes, bueno, en realidad lo pone aquí. 01:18:33
Pero veis que se escribe igual que el instant seed de antes. 01:18:37
Es verdad que no hay nada dentro del paréntesis, pero esto es un método o una función, ¿vale? 01:18:40
Los métodos y funciones, ¿vale? 01:18:45
de arrancar el juego pone quiero que haya un impacto e impacto si yo voy a cualquier otro 01:18:47
script vale si yo voy a leer durante la tutoría que estaba haciendo ahora y en estar yo pongo 01:18:53
esto de impacto veis que no existe no sale vale no existe no es como instancia instancia siempre 01:18:58
existe yo pongo instancia y ahí está esperando hay que poner sus paréntesis y ahora que está 01:19:08
y sí que obliga a que haya aquí unos parámetros, ¿no? 01:19:14
¿Vale? Como yo que sé, vamos a poner aquí, aunque dé fallo, 01:19:19
pues vamos a poner, bueno, no tenemos ninguno de tipo objeto, ¿vale? 01:19:22
No puedo poner ningún parámetro aquí porque va a dar fallo 01:19:25
porque nuevamente lo que nos está pidiendo es un GameObject, ¿vale? 01:19:29
Lo que hemos visto antes, que la primera sobrecarga, 01:19:33
su tipo tiene que ser de objeto, ¿vale? 01:19:36
Pero no sale el impacto que os estaba diciendo antes, 01:19:38
ni bien ni mal, no puedo hacer nada, 01:19:41
porque los métodos, lo que vamos a empezar a hacer también es que los creamos nosotros. 01:19:43
Es decir, bajo un nombre que nosotros ponemos, podremos ir, y veis que está aquí, 01:19:48
meter nosotros nuestras operaciones dentro de un bloque, en este caso, fijaos que es largo. 01:19:55
Y este bloque lo que va a hacer, que llega hasta aquí, el bloque impacto, hasta aquí, 01:19:59
todo esto es impacto, cuando yo ponga esta palabra, se va a ejecutar lo que hay aquí dentro. 01:20:04
entonces vais a ver 01:20:11
y esto también es importante, que por primera vez 01:20:13
cuando llegamos a un punto 01:20:15
aquí, saltamos 01:20:17
de aquí a aquí 01:20:19
en la ejecución, luego irá el update 01:20:21
que también tiene su impacto 01:20:23
pero primero 01:20:24
estamos llamando a este impacto 01:20:26
salta aquí y se va a reproducir lo que hay aquí 01:20:29
dentro 01:20:31
¿por qué instantiate 01:20:31
si existe y aquí 01:20:35
existe por ejemplo 01:20:37
si pongo el método instantiate 01:20:39
Como os he dicho antes, impacto no existía en el otro lado, porque como os he dicho en varias ocasiones, cuando empezamos cualquier script tiene unas librerías y también hereda ciertos comportamientos, que es esto del Mono Behavior, que os suene, que ya nos da operaciones prehechas. 01:20:40
Es decir, para que leemos más, cuando, a ver, un segundico, a ver si lo pone claramente aquí. Bueno, existe la clase objeto, ¿vale? Que cuando yo me meto en Instanciate, vais a ver, a ver, me meto en esta, con el control volvemos a meternos, ¿vale? 01:20:58
Pone objeto instantiate, es una de las que ha cargado ya en la librería, ¿vale? Hay otra clase en otro sitio que está guardada en la librería Unity Engine, que cuando empezamos cualquier juego está aquí. 01:21:21
Si yo, por ejemplo, intentara poner Instantiate, como siempre ocurre y cualquier cosa, bueno, en esta como no lo voy a rellenar, me va a dar fallo siempre. Pero fijaos que este Instantiate funciona sin problema hasta que yo me cargo el, o lo comento mejor aún, comento el Unity Engine. 01:21:33
Y veis que Instantiate junto a otras muchas cosas, fijaos en las clases, dejan de funcionar, ¿vale? Entonces tenéis que ir entendiendo que existen las clases y los métodos que ya existen y luego los métodos que nosotros podemos ir haciendo para ir recopilando distintas acciones y que cada vez que pongamos esta frase, pues oye, haga todo esto. 01:21:53
Si yo quiero poner impacto varias veces en mi código, pues no tengo que escribir todas estas líneas, ya está recogido dentro de su propio bloque, ¿vale? Hasta aquí, ¿qué tal? 01:22:12
bueno 01:22:22
te has quedado en lo de impacto, entiendo, hasta aquí bien 01:22:24
sí, a ver, es que yo he estado 01:22:29
intentando hacerlo sin mirar esto que habías 01:22:31
puesto, conseguí no hallar ningún 01:22:33
error hasta lo de que me quedo sin escudo 01:22:35
que ya ahí colapsé 01:22:37
pero cuando meto el impacto 01:22:38
no me lo reconoce, me dice que no puede hacer un 01:22:40
buen impacto 01:22:43
ya he entrado ahí 01:22:44
me doy la tutoría tranquilamente y supongo que 01:22:46
lo sacaréis y no te pregunto 01:22:49
realmente todavía no hemos explicado 01:22:50
cómo se crea esto 01:22:53
Es decir, todavía no he explicado cómo se crea esto, es decir, que va más avanzada de lo que hemos explicado entonces, ¿vale? Así que bien. 01:22:55
Te quiero decir, solamente estoy como dejando caer muchas veces que cuando veamos una orden de este tipo con mayúscula y paréntesis, estamos llamando a un método y que hay métodos que ya vienen prehechos, ¿vale? 01:23:04
Por estas librerías y otros que no, que los hacemos nosotros. Ahora tenemos que aprender a hacerlo nosotros, ¿vale? 01:23:16
Pero hasta, aunque aquí llegamos y lo que pone aquí, invocamos a la función que realiza el impacto, es decir, que al empezar el juego estamos metiendo dentro de esta palabra impacto, pues que haya un impacto, que es lo que vamos a hacer aquí, ¿vale? 01:23:22
Vale, da igual ponerlo antes del void start o después. 01:23:37
¿El impacto te refieres esto? 01:23:41
Todo, o sea, las declaraciones de las variables. 01:23:43
Vale, las variables cuando son globales, ¿no? Como hemos dicho antes, pueden ir aquí o pueden ir al final. Y vais a ver que cuando las pongo al final, ¿vale? Dentro de la clase, pero al final todo funciona. ¿Por qué? Porque está dentro de la clase. 01:23:46
entonces todo lo que se va 01:24:02
metiendo en bloques inferiores 01:24:05
pues puede acceder a estas clases 01:24:07
pero sí que es verdad que es mucho 01:24:09
más intuitivo y es la convención 01:24:11
aparte, que esto vive mucho de convenciones 01:24:13
de que todas las, incluso 01:24:15
aunque luego sigamos picando código aquí abajo 01:24:17
y queramos crear una nueva variable 01:24:19
si queremos que sea global de toda la clase 01:24:21
subimos y la ponemos aquí 01:24:23
porque así de un vistazo rápido 01:24:25
tenemos todas las que son 01:24:27
globales ya englobadas 01:24:29
se puede mientras esté 01:24:30
dentro del bloque correspondiente 01:24:32
a donde queremos que funcione, que por eso he explicado 01:24:34
lo del encapsulamiento 01:24:36
funcionaría, pero la convención dice 01:24:37
que lo hagamos aquí 01:24:40
de hecho hay más convenciones 01:24:41
porque ahora mismo todas son private 01:24:43
y a veces iréis incluso viendo 01:24:45
o que 01:24:48
hay gente que dirá, siempre que creo una 01:24:50
variable private empiezo con una barra baja 01:24:52
para que así al ir cambiándolo 01:24:54
en el código 01:24:56
saber que es una variable privada 01:24:57
que no la voy a declarar mediante el inspector, sino que la voy a ir declarando yo siempre a mano en el código, 01:25:00
porque no se puede ir al editor de Unity y cambiarlo si es privada. 01:25:05
Luego hay gente, lo digo por si encontráis, que siempre que haga una variable global le pone m barra baja, 01:25:08
vamos, habría que ponerlo en todas, y todas las que va generando dentro de métodos o de niveles inferiores, 01:25:16
como este int, por ejemplo, pues va sin la barra baja. 01:25:21
Y esto sirve para saber cuáles son variables globales y distinguirlas de las que no. 01:25:24
pero esto ya son convenciones que van más adelante 01:25:27
es decir, que vamos primero a lo básico 01:25:30
vale, gracias 01:25:32
nada, perdona que 01:25:34
sé que me preguntas una cosa y te correspondo 01:25:35
con tres, no, no, no, no pasa nada 01:25:38
pero es que así van sonando las cosas 01:25:40
vale, entonces se puede 01:25:41
declarar incluso, fíjate, vale 01:25:44
la quito 01:25:46
de aquí, pero aquí dentro 01:25:48
vale, digamos que aquí hay un bloque que se cierra 01:25:50
aquí y aquí empieza otro 01:25:52
es decir, si lo declarara aquí en medio 01:25:53
también lo estoy declarando dentro de la clase y no da problema 01:25:55
pero claro, tú cuando luego quieras 01:25:58
descubrir dónde están las variables de toda 01:26:00
la clase, como empieces a 01:26:02
no organizarlo bien, te vuelves loco 01:26:04
por eso, justo debajo de clase 01:26:05
las que son variables globales se declaran 01:26:08
y además si trabajas 01:26:10
en un equipo, pues todos saben dónde están las variables 01:26:12
globales y todos están contentos de encontrarlos 01:26:14
rápido, ¿vale? 01:26:16
Hay gente que lo pone al final por lo mismo 01:26:18
porque saben que están al final 01:26:20
de la clase y lo encuentran antes, pero 01:26:22
como luego dentro de un mismo script 01:26:24
se pueden crear varias clases, que esta es otra cosa 01:26:27
se crea 01:26:29
la clase a continuación y si lo pones 01:26:31
justo debajo de donde se declara, pues más claro 01:26:33
el mejor sitio, vaya 01:26:35
vale 01:26:37
en el 01:26:38
en las variables 01:26:39
también habla de arrays 01:26:43
esto es más avanzado, vale 01:26:45
pero es simplemente para que también os suene 01:26:46
un array, que a veces se puede llamar matriz o arreglo 01:26:48
vale 01:26:51
Se pueden, dentro de una sola caja, meter muchos tipos de datos. Y de hecho, un array, para que os hagáis cuenta, cuando metemos, aunque no está declarado específicamente, a ver por qué no me está abriendo esto, aquí, cuando generamos una variable, por ejemplo, de transform, no estamos metiendo un dato como los números que metemos, un 10 o Daniel o 5. 01:26:52
Como os he dicho antes, se están guardando un montón de valores, ¿vale? 01:27:18
Al final esto, si habéis estudiado matrices en matemáticas, esto es un poco parecido a una matriz. 01:27:21
Es decir, que hay muchas posiciones de esa variable, ¿vale? 01:27:26
Que os suene. 01:27:29
Esto es más avanzada, así que me lo salto ahora mismo, ¿vale? 01:27:31
Ya tendrá más sentido más adelante. 01:27:33
En esta sección, voy un poco en el orden ahora para ir resolviendo dudas. 01:27:36
Aquí veis lo que acabamos de hablar, de cómo se declaran las variables, 01:27:40
un poco pues inconvenientes que se pueden encontrar etcétera y hay otro otras digamos 01:27:43
instrucciones importantes otros operadores también vale que son estos que tenemos aquí 01:27:52
estos son bastante importantes porque se usan de vez en cuando y si no pues de pronto saltáis esto 01:27:57
porque no parece importante pero si lo es vale poner trucos de programador como un extra pero 01:28:04
No es una extra, es importante, ¿vale? 01:28:08
Es los operadores más más, los operadores menos menos, más igual y menos igual. 01:28:10
Me quedo en estos, ¿vale? 01:28:15
Hoy no voy a avanzar más de aquí, de las variables. 01:28:17
Y bueno, lo que hemos ido viendo de otras cosas. 01:28:22
En las variables acabamos de decir que existen estos operadores. 01:28:26
Lo dejo aquí, ¿vale? 01:28:29
El más más y el menos menos. 01:28:30
A ver, me voy al de durante la tutoría. 01:28:33
Y voy a simplificar un poco esto, ¿vale? 01:28:37
en indicador máximo de vida era un booleano, me voy a cargar todo lo que ya no me interese y me voy a quedar con un int, por ejemplo, ¿vale? Para hacerlo más simple. 01:28:38
Cuando estamos en cualquier punto del código, puede haber momentos en los que queremos que una variable vaya sumando progresivamente de uno en uno su valor, ¿vale? 01:28:48
¿Eso qué significa? Que a veces hacemos lo que se llaman bucles, ¿vale? Si vais más adelante se habla del for, del while, del while do, bueno, hay varios, más avanzado también, pero que lo que van haciendo esos bucles es ir recorriendo varios elementos y esos elementos van, digamos, siendo posiciones, ¿no? 01:29:00
Por ejemplo, imaginaos, por decirlo así, vemos el típico ranking de una recreativa antigua, ¿vale? Lo pongo aquí, ranking recreativa, a ver si sale lo que yo quiero que salga, que no lo sé, imágenes, ¿vale? Lo típico, los mejores cinco resultados, ¿vale? Y esta va a ser la primera posición, la segunda, la tercera, la cuarta, la quinta y ya no existen más. 01:29:22
entonces habrá un momento que nos va a ir interesando 01:29:44
que vaya, pues eso, muestra la 1 01:29:47
cuando muestra la 1, muestra la 2 01:29:49
cuando muestra la 2, muestra la 3 01:29:51
veis que va sumando progresivamente 01:29:53
en ese momento se usa este operador 01:29:54
más más, ¿vale? 01:29:57
que es una forma de simplificar 01:29:58
que sumamos 01:30:00
a la variable 01:30:05
¿vale? 01:30:07
¿esto qué significa? 01:30:09
que si yo ahora mismo pongo aquí vida 01:30:10
¿Qué me va a mostrar en consola? 01:30:13
No, 26 01:30:22
Vale, 25, le sumo 1 01:30:23
Y 26, vale, vamos a ello 01:30:26
26, perfecto 01:30:29
¿Vale? Esto luego habrá otras operaciones 01:30:33
Que puede sumar más más 01:30:35
5 veces, porque digamos que 5 veces 01:30:36
Pues irá pasando por las 5 posiciones 01:30:38
Para mostrar ese ranking 01:30:40
¿Vale? Es un operador muy importante 01:30:42
Si pones 4 más eso más 2 01:30:44
No, no 01:30:46
pregunto 01:30:47
no, no, no, es decir, si voy poniendo más 01:30:49
se vuelve loco 01:30:50
vale, esto es lo mismo 01:30:52
y esto es otra sintaxis que suele 01:30:55
dar problema al principio 01:30:57
¿vale? que es, que esto mismo 01:30:59
es la forma resumida de escribir esto 01:31:01
¿vale? y vais a decir, esto no tiene mucho 01:31:03
sentido, bueno, hasta que 01:31:05
lo tenga, ¿vale? 01:31:06
esto y esto 01:31:09
es exactamente lo mismo 01:31:11
¿vale? y vais a decir, ¿cómo vida 01:31:12
es igual a vida más uno? ¿no? 01:31:15
Si lo pensamos en álgebra humana, esto no tiene sentido porque estamos pensando como pensarían las matemáticas, ¿no? Las ecuaciones. 01:31:17
Pero recordad que aquí lo que estamos haciendo es, esta caja, esta variable, ¿vale? Es igual, ¿vale? Se le asigna lo que ya vale ahora mismo más 1. 01:31:25
Entonces, esto significa que lo que hay en esta caja, ¿vale? Es igual a lo que guarde la caja, ¿vale? Aquí está refiriéndose a abrir la caja y aquí se está refiriendo al contenido de la caja, ¿vale? 01:31:36
Aquí siempre hablamos de declarar la variable o llamar a una variable e inicializarla o cambiar el valor. El igual no es igual, no es un igual de matemáticas, es un asignador. 01:31:47
Entonces, vida es igual a vida más uno. Es decir, en esta caja vamos a guardar lo que valga vida más uno. 01:31:57
Y si volviéramos a poner aquí vida, pongo otra vez esta línea, cuando yo muestre otra vez la misma instrucción, no son lo mismo. 01:32:03
¿Vale? ¿Qué pensáis que va a poner ahora 01:32:14
en la consola? 01:32:16
Lo mismo, 26 01:32:18
Aquí 26, ¿vale? 01:32:20
Pero estoy diciéndole otra vez, recordad 01:32:22
Pero porque te coge 01:32:24
la segunda 01:32:26
orden que estás dando el resultado 01:32:28
de la primera y no el resultado 01:32:30
del que has declarado 01:32:32
Ahora lo explico, simplemente lo voy a enseñar para que me creáis 01:32:33
y luego os lo explico 01:32:36
Esto es 01:32:38
bastante simple y a la vez 01:32:40
bastante complicado veis que pone 26 y 27 volvemos a lo del encapsulamiento y 01:32:42
cuando se declaran las variables vale tenemos una variable global aquí arriba 01:32:47
vale con su caja y la inicial izamos con 25 como podría ser con cualquier valor 01:32:51
vale y vamos aquí y decimos vale en vida igual que en vez de antes decíamos ahora 01:32:57
vale 70 y lo decíamos así a las bravas entonces aquí enseña 70 no esto lo 01:33:02
vimos el otro día y lo hemos visto antes también quiero que sea lo que vale vida 01:33:06
más 1. Y aquí lo que está haciendo es 01:33:11
coger, todavía no lo hemos 01:33:13
asignado, está abierta la caja y aquí 01:33:15
hacemos la asignación. Está volviendo 01:33:17
a donde se declaró la variable, 01:33:19
coge este valor, 01:33:22
le suma 1 y lo guarda en vida. 01:33:24
Vale, y lo lee de arriba a abajo 01:33:26
y por eso suma 2. Y aquí lo aguarda como vida. 01:33:27
Pero es que cuando volvemos a esta caja, 01:33:30
vuelve a abrir la caja y aquí ya no vale 01:33:32
25 a estas alturas, vale a 26. 01:33:33
Vale. Y le sumamos 01:33:35
1. Y así progresivamente. Es decir, 01:33:37
si yo empezar a hacer esto, 01:33:39
Pues, sería 26, 27, 28, 29, ¿vale? Que es lo mismo, ¿vale? Os lo vuelvo a decir, en vez de escribir todo esto, es lo mismo que decir esto. Es a la caja, súmale 1, ¿vale? Es exactamente lo mismo. 01:33:41
Vale, pero si lo quisiera mencionar en otra caja que se vinculara con los 26, sí que le tendría que asignar como otro nombre a vida para que la otra cápsula te lo reconociera por 26 en vez de por 25, ¿o no? 01:33:56
No, aquí lo que va haciendo 01:34:07
claro, tú me estás hablando de abrir 01:34:09
otra variable distinta 01:34:11
claro, si tú abres otra variable pues 01:34:13
esto se llamará 01:34:15
muerte, no sé, y esto tendrá 01:34:16
otro valor, es decir, vida y muerte 01:34:19
son distintos 01:34:21
es decir, si yo 01:34:22
aquí digo muerte y le pongo 01:34:25
800 por poner un valor 01:34:27
muy distinto, aquí es que 01:34:29
muerte no está cambiando en ningún momento 01:34:31
es verdad que yo puedo ir aquí y decir muerte 01:34:33
¿vale? 01:34:35
Y aquí me va a enseñar vida 25 más 1, 26. 01:34:37
Ha guardado 26 en la caja en este momento. 01:34:42
Ahora vuelvo aquí, que ya vale 26, estoy llamando a la caja. 01:34:45
26 más 1, 27. 01:34:48
En este momento va a enseñar 27, ¿vale? 01:34:50
Vuelvo a llamar a la caja vida. 01:34:52
He guardado 27 aquí antes, ¿vale? 01:34:55
27 más 1, 28. 01:34:57
En este momento la caja vale 28 y aquí enseñará 28. 01:34:59
Y aquí valdrá 29. 01:35:01
Pero aquí no va a enseñar 29, 01:35:04
porque es que lo que le estoy diciendo que enseñe no es vida 01:35:05
no es lo que hay en la caja vida, es la caja muerte 01:35:08
entonces va a enseñar 26, 27, 28 01:35:10
y 800 01:35:12
vale, pero si yo lo pusiera fuera de esas 01:35:13
llaves 01:35:16
sí que tendría que declarar 01:35:17
de otra manera la vida más uno 01:35:20
para que me lo reconociera porque estaría 01:35:22
fuera de todas estas llaves 01:35:24
no sé si me explico 01:35:26
claro, pero tú donde has declarado la variable es 01:35:27
a comienzo, es global 01:35:30
entonces se va a poder usar en toda la clase 01:35:31
sin problema 01:35:34
El problema viene de que yo la declaro aquí, como está en el ámbito, aquí sí que funciona, ¿no? Pero si yo luego en el update pongo vida, pues es lo de antes. Aunque yo ponga vida más uno, es que no sabe que es vida porque está fuera de su ámbito, ¿vale? 01:35:35
Sin embargo, muerte sí, porque aquí muerte se va a poder poner. Muerte es igual a 55. ¿Vale? O mejor aún, mira. ¿Sí? ¿Me vas siguiendo? 01:35:55
Sí. 01:36:10
Vale, o mejor aún, voy a comentar esto para que en el Star no haga nada y no salgan muchos numerajos, pero imagínate que en el update, que recuerda que se va planteando en cada fotograma, quito lo de muerte 55, digo que cada fotograma me enseñe lo que vale muerte. 01:36:10
que esto por ejemplo puede servir para un contador 01:36:28
aquí 01:36:31
muerte 01:36:33
¿qué crees que va a pasar? 01:36:35
como la he declarado arriba 01:36:37
la puedo, como es global 01:36:39
la puedo hablar de muerte de esta variable 01:36:41
en cualquier lado, ¿qué va a ir pasando? 01:36:43
que va a sumar 801 01:36:46
802, 803 porque la has puesto 01:36:47
en el que se va cargando 01:36:50
por fotograma 01:36:52
exacto, empieza valiendo 800 01:36:53
en el fotograma siguiente le digo, ojo 01:36:55
súmale uno y me lo enseñas 01:36:57
y aquí guarda 801, porque está fuera del update 01:36:58
en el siguiente 01:37:01
801, súmale uno 01:37:03
pues enseñará 802 01:37:05
y guarda 802, y ahora vas a ver que tenemos 01:37:06
como una especie de contador 01:37:09
muy poco refinado, pero 01:37:10
vas a ver que cada fotograma 01:37:13
espera, perdón 01:37:15
vale, ahí 01:37:16
pues va a ir sumando 01:37:18
cada fotograma, que por segundo se ejecuta mucho fotograma 01:37:20
por eso va como a saltos 01:37:23
Pero sí que se están planteando, ¿vale? 01:37:25
¿Ves que van sumándose? 01:37:28
Sí. 01:37:30
¿Vale? Que no va de uno en uno. 01:37:30
Bueno, si vas parando sí van de uno en uno, 01:37:32
pero se juzguta más rápido del uno en uno. 01:37:34
¿Vale? 01:37:37
Entonces, pues mira, por ejemplo, 01:37:37
una aplicación práctica para hacer un contador. 01:37:39
Pues mira, el más más puede servir. 01:37:41
Y lo mismo, esto es igual a muerte más uno. 01:37:43
Es exactamente lo mismo. 01:37:46
Va a dar el mismo resultado. 01:37:48
Si quieres lo comprobamos, pero te lo digo yo. 01:37:49
Sí, sí, lo da. 01:37:51
Vale. 01:37:52
Y, vale, muerte más uno, vuelvo aquí a los apuntes, ¿vale? Este operador, importante que sepáis, bueno, esto lo apago, que ya está aquí usado, cuántas cosas, ¿vale? Y esto también, esto que estoy poniendo de vida igual vida más uno, también se puede poner con otra forma resumida que son estas, ¿vale? 01:37:52
Bueno, ojo, no he puesto el menos menos, pero el menos menos lo que va haciendo es restar uno, ¿vale? Cada vez que se invoque. Igual. Si queréis hacemos las pruebas, pero por no perder tiempo. Pero existe el más igual y el menos igual, ¿vale? 01:38:14
Si yo voy al más igual, lo que se puede hacer es, para no tener que repetir, que incluso es la confusión que nos viene siempre, en vez de poner muerte igual a muerte más uno, cuando se va a hacer una operación sobre la misma variable, sobre la propia variable, se puede hacer igual más uno. 01:38:26
¿Y esto qué significa? Que muerte pasa a valer lo que valga más 1 o más 7 en este caso, ¿vale? Ahora se van a ir sumando de 7 en 7, va a ir 807, 814, ¿vale? Y cada fotograma va a ir enseñándolo, ¿vale? ¿Por qué no lo está haciendo bien? Pues por una cosa muy simple, que es que he puesto igual más, no más igual, ¿vale? Importante. 01:38:44
¿no? he puesto igual más 01:39:10
y la operación es más igual 01:39:13
¿vale? ahora mismo 01:39:15
esta línea como no tiene sentido 01:39:17
¿vale? le estaba diciendo que era un 7 positivo 01:39:19
básicamente, entonces siempre vale 7 01:39:22
que no es lo mismo que 01:39:24
cada vez que dé una vuelta en este caso 01:39:25
vaya sumándole 7 01:39:27
ahora sí que va a ir 800, 800 01:39:28
7, va a ir 01:39:31
lo paro porque si no esto 01:39:33
se vuelve loco, ¿vale? 01:39:34
807, va sumando 7 en cada ocasión 01:39:37
que es la cifra que hemos puesto 01:39:39
si aquí lo pusiéramos 01:39:41
con el menos 01:39:44
aquí lo bueno es que podemos determinar que sean saltos más allá del 1 01:39:45
¿vale? porque en el más más sí que es 1 01:39:48
por ejemplo, aquí también podríamos poner 7 01:39:50
por ejemplo 01:39:52
si aquí ponemos que vaya restando 1 en cada fotograma 01:39:53
pues será 01:40:01
lo paro y voy para arriba 01:40:02
para ver lo que ha hecho 01:40:04
va restando 1 en cada vuelta 01:40:04
¿vale? 01:40:09
eso es importante, ¿qué tal hasta aquí? 01:40:11
bien 01:40:13
Sí, ¿no? Más o menos, ahí va. Hay una última cosa que quiero que sepáis, que es, que antes lo hemos visto, que es, por un lado, que cuando tenemos algún, a ver, que lo voy a tener que crear porque no lo tengo, cuando tenemos algún valor público o con serialized fill, como aquí, a ver, serialized fill, es decir, que lo asignamos, lo podemos asignar por el editor, ¿no? Como hemos hecho, pero en este caso es un número, ¿vale? 01:40:14
Yo aquí le he asignado 800 y esto lo voy a comentar para no complicarlo más. Yo aquí le estoy diciendo que esto vale 800 y yo voy al script durante la tutoría y pone 800. Y yo digo, bueno, no, 800 no, 950. 01:40:42
vale, es verdad que aunque 01:41:00
bueno, espera, y en el start 01:41:02
voy a decir que me enseñé que está 01:41:05
guardando muerte, porque si no 01:41:06
no sabemos que está interpretando internamente 01:41:08
programa, vale, cuando 01:41:11
empiece el juego enséame lo que vale muerte 01:41:14
y aquí yo he inicializado muerte 01:41:16
y pone 800, lo lógico 01:41:18
sería que pusiera 800, que era 01:41:21
el problema que estaba dando antes 01:41:22
yo cuando voy y arranco el juego 01:41:24
¿qué es lo que me pone? 01:41:26
950, vale 01:41:28
Quiero que entendáis que los códigos, igual que si aquí pongo 800 y al arrancar el juego, aunque aquí la haya declarado, luego ponga muerte igual a 1000. Aquí si no lo tuviera serializado y lo cambiara, lo que me va a enseñar es 1000. 01:41:30
Porque aunque aquí esté de comienzo inicializado como 800, luego al arrancar el juego, digamos que hay una operación posterior, que es que al arrancar el juego, pues oye, me dice que vale 1000. 01:41:48
Entonces lo que me va a enseñar es 1000. 01:41:59
Pero hay algo más allá incluso que es que todo lo que hagamos en el inspector, más allá del código, más cercano digamos a la ejecución, sobrescribe a lo que vamos haciendo en el código. 01:42:01
Por tanto, podremos ir variando, ¿veis? Verás que vuelve a salir, aquí ha salido el 1000, porque es verdad que cuando arranca el juego, aunque yo haya cambiado esto, ¿vale? Como yo he cambiado el juego y le he dicho al arrancar la ejecución, ponmelo en 1000, ¿vale? 01:42:10
sobrescribe al empezar el juego 01:42:29
en un momento de ejecución lo que yo ya he hecho 01:42:31
tanto en la declaración inicial 01:42:34
¿vale? como en la sobrescriptura 01:42:35
que tenemos aquí, que sí que es verdad 01:42:38
que si no hiciera nada más 01:42:40
¿vale? como no hay un momento de ejecución 01:42:41
no hay un momento en el que lo vuelve a cambiar 01:42:43
pero tened ojo con que a veces 01:42:45
poner aquí las instrucciones puede dar 01:42:47
este tipo de problemas, que hay un orden de ejecución 01:42:49
¿vale? ya os iréis pegando con ello 01:42:51
no sé si me vais siguiendo pero eso 01:42:53
aquí al inicializar 01:42:56
aportamos un valor, pero luego hay momentos de ejecución, 01:42:57
como el start y el update, que pueden ir sobreescribiendo 01:43:00
valores. 01:43:03
Pero este sería el ice field. 01:43:04
Y el public también se puede variar dentro del propio script. 01:43:06
Y, de hecho, para que os hagáis una idea, 01:43:14
yo aquí pongo serializar el campo, ¿vale? 01:43:16
Lo inicializo como 800. 01:43:22
al empezar lo pongo en 1000 01:43:23
y quiero que la muerte 01:43:26
me lo vaya enseñando en el update 01:43:28
que cada fotograma me vaya enseñando esta cifra 01:43:29
y guardo, y vais a ver que pasa una cosa 01:43:31
que mezcla todo esto 01:43:34
que acabo de decir 01:43:36
yo arrancaré el juego, al arrancar 01:43:36
se me pone en 1000, sobre escribiendo 01:43:40
esto que está en 1132 01:43:41
a ver, placa 01:43:43
se pone 1000 01:43:45
y vale, pues 1000, me lo ha puesto 1000 incluso aquí 01:43:46
pero cuando yo ya he arrancado el juego 01:43:49
como digamos que esta orden ya se ha ejecutado 01:43:52
y no lo va a sobreescribir 01:43:55
al final lo que va a importar es 01:43:56
lo que yo vaya poniendo aquí 01:43:58
y veis que va cambiando el valor 01:44:00
y podría ir cambiando desde el editor a mano 01:44:01
ciertos valores 01:44:04
¿vale? que os suene 01:44:05
¿pero para qué? 01:44:07
pues por ejemplo imagínate que quieres probar 01:44:10
hacia donde se mueve una nave 01:44:12
de una forma intuitiva 01:44:14
porque tú cuando arrancas el juego 01:44:15
no puedes cambiar el código 01:44:18
el código, digamos que una vez arranca 01:44:19
no se puede cambiar, pero nos puede 01:44:21
interesar probar cosas que 01:44:23
sí que se ejecutan durante el juego, como esto 01:44:25
pero luego lo tendrías que cambiar 01:44:28
en el código, ¿no? es que estoy cambiando el código 01:44:29
aunque no lo parezca, o sea, aunque no salga 01:44:32
en el CESAR, es como si 01:44:34
estuviera cambiando, ¿no? claro, yo con este serial 01:44:35
I feel, estoy accediendo a esta 01:44:38
variable en todo momento 01:44:39
y siempre y cuando sea en un momento de 01:44:40
ejecución que se pueda ver 01:44:43
cómo voy cambiando el valor de muerte 01:44:45
yo en todo momento tengo abierta esta caja 01:44:47
en vez de cambiarlo como aquí, lo estoy cambiando 01:44:49
pero por el editor, en vivo 01:44:51
¿vale? 01:44:53
yo lo que vale muerte lo estoy cambiando 01:44:55
ahora mismo, en este mismo instante 01:44:57
muerte no vale ni 800 ni 1000 01:44:59
vale 1657 01:45:01
ya lo iréis viendo 01:45:02
sobre todo, mira, en el siguiente tema ya de hecho 01:45:05
tiene aplicaciones, así que ya lo veréis 01:45:07
¿vale? e importante, si en algún 01:45:08
momento queréis ir viendo como va 01:45:11
pues por ejemplo lo del más uno 01:45:13
que va cada fotograma, aquí vais 01:45:15
yendo fotograma a fotograma, aquí da igual 01:45:17
porque, mira, como está parado 01:45:19
el juego, si yo ahora cambio a 1896 01:45:21
al ir al siguiente 01:45:23
fotograma, pues 1896 01:45:25
¿vale? que en ocasiones 01:45:27
puede que queramos ir viendo 01:45:29
qué va pasando cada fotograma, en vez de aquí 01:45:30
una sucesión de 01:45:32
elementos, pues, continua 01:45:34
¿vale? que se puede detener el juego y se para ahí 01:45:37
y podemos ir fotograma a fotograma 01:45:39
ejecutándolo, ¿vale? 01:45:40
Hay una última cosa 01:45:43
muy importante que es 01:45:44
que cuando vayamos cambiando cosas en vivo 01:45:47
yo puedo decir, ay, yo arranco 01:45:49
el juego y se me ponen 1000 siempre 01:45:51
¿vale? y aquí empiezo a guardar 01:45:53
y vais a ver que yo cuando detengo 01:45:55
el juego me vuelve al otro valor que estaba 01:45:57
guardando antes de empezar, ¿no? por ejemplo 01:45:59
500, ¿no? arranco el juego 01:46:01
se va a sobreescribir a 1000, que es lo que 01:46:03
hace al arrancar el juego y me pongo 01:46:05
a cambiar esto a 192 01:46:07
y por lo que sea yo quiero que en 192 01:46:09
Se deja aquí, digamos, sobrescrito el valor. Veréis que cuando yo detenga la ejecución del juego, vuelve a 500, que es el que yo había metido a mano. Esto significa que hay cambios que podemos ir haciendo en el... o más fácil, mirad, si me estoy yendo por las ramas. 01:46:13
tengo aquí colocada la nave y quiero que se mueva 01:46:28
y lo voy a ir cambiando en tiempo real en estas coordenadas 01:46:32
quiero cambiarlo en estas coordenadas 01:46:34
todos estos cambios que yo voy haciendo 01:46:36
imaginaos que yo hay un momento que voy a decir 01:46:38
quiero que la nave se quede aquí, que la haya ajustado 01:46:44
pero como estoy en ejecución, durante la ejecución 01:46:46
los cambios que vayamos haciendo solo funcionan durante la ejecución 01:46:49
cuando yo pare, vuelve a los valores que tenía antes de la ejecución 01:46:52
Por tanto, cambios que hagamos en vivo, que es el siguiente tema que vamos a hacer, cuidado que se hacen y no se guardan. Por eso veréis que cuando yo le doy al play se oscurece un poco el área, se oscurece un poco el entorno, indicando que estamos dentro de la ejecución y un poco advirtiendo que el cambio que hagamos en los parámetros no se guardan. 01:46:57
¿Vale? Último consejo. Para cambiar este color y que sea aún más obvio cuándo podemos o no cambiar los elementos sin que se guarden, ¿vale? Dentro de Edits hay una pestaña de Preferencias. Creo que siempre confundo estas dos. En Preferencias, Edit Preferencias, están los colores del sistema. 01:47:18
Ya hay uno bastante interesante de modificar, que yo ya lo haría, 01:47:40
y esto se guarda siempre que no instaléis otra versión de Unity o vayáis a otro ordenador, etc. 01:47:46
Es decir, entre distintos juegos incluso que uséis la misma versión de Unity se va a mantener. 01:47:52
En vez de decirle que sea el tintado de este gris tan sutil que tenemos, 01:47:57
lo podemos exagerar a yo que sea un rojo de warning. 01:48:01
Cuando lo tengamos ahí configurado, el Play Mode Tint, el tinte de modo de juego, 01:48:04
ahora cuando ejecutemos el juego vais a ver que se tiñe de otro color 01:48:09
lo podéis poner más o menos llamativo 01:48:12
ahora todo cambio que vayamos haciendo mientras estemos en este modo 01:48:15
sabemos que cuando detengamos la ejecución del juego 01:48:18
placa, no ha servido para nada 01:48:23
excepto a lo mejor para tener clara la referencia 01:48:25
de donde queremos ubicar algo en este caso, etc. 01:48:27
entonces es importante que a lo mejor 01:48:31
cambiéis ya, en edit 01:48:33
Preferencias, este color 01:48:36
Ponerlo en algo intermedio 01:48:38
No tan rojo saturado 01:48:40
Porque al final este color se añade al que tiene ya la interfaz 01:48:42
Pues yo que sé, algo así rosadito 01:48:45
Y cuando le deis pues ya 01:48:46
Os marca que estáis como en 01:48:48
En momento warning 01:48:50
Materias:
Imagen y Sonido
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Segundo Curso
Subido por:
Daniel M.
Licencia:
Todos los derechos reservados
Visualizaciones:
21
Fecha:
2 de octubre de 2025 - 0:36
Visibilidad:
Clave
Centro:
IES CIFP a Distancia Ignacio Ellacuría
Duración:
1h′ 48′ 58″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
1.09

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid