Saltar navegación

Tutoría 3 - DEIM - UT1 y 0 - Curso 24·25 - 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 15 de octubre de 2024 por Daniel M.

98 visualizaciones

Grabación de tutoría de DEIM en la que se continúa ahondando en la lógica de programación y se resuelve dudas referentes a la práctica de la UT1.

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 instancy 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. Por tanto, esta línea, por ejemplo, este primer instant shade, ya tiene lo que necesita para hacer la instancia. 00:03:26
Cuando solo se usa uno de los parámetros, que además es la primera sobrecarga, ¿vale? Hacemos el instant shade solo dando un objeto que es el original que se va a clonar, 00:03:34
que es lo que acabamos de hacer aquí, ¿vale? Cuando yo ahora, no olvidéis de guardar siempre que hagáis algún cambio en el código para que se ejecute, 00:03:47
¿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? Se han generado dos naves y las dos, si nos damos cuenta, están, deshago y marco una en el 000, ¿vale? 00:03:54
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:22
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 ese instant sheet, está ahí preparado 00:05:30
Vamos a ver qué pasa con el resto 00:05:34
Es decir, voy a comentar el resto y voy a ver 00:05:36
Esta línea, según empieza, es verdad que aquí está generando como una variable 00:05:40
Si os fijáis, que le está poniendo un nombre que se llama instancia 00:05:46
Que si no vemos mal, aquí pone GameObjectMyPrefab 00:05:48
Está generando una variable de un tipo de variable que es GameObject 00:05:54
Es decir, 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 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:40
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:52
Si yo ahora guardo y digo, a ver qué ocurre cuando yo ahora lanzo el juego, ¿no? 00:06:58
Que solo se va a ejecutar esta línea en el start 00:07:03
Vamos a ver 00:07:05
Me voy a poner aquí a mi lado 00:07:06
Vale, acabo de lanzar el juego y hay una nave en el 15, bueno, perdón, en el 000, igual 00:07:10
¿vale? pues eso significa 00:07:21
que crea una instancia 00:07:24
en la posición, aquí os lo he comentado 00:07:26
y está ya indicado, crea una instancia en la posición 00:07:28
del objeto de referencia y como 00:07:30
hijo suyo, pero es verdad que 00:07:32
está ocurriendo algo, si os dais cuenta 00:07:34
que es que, aunque aquí he puesto 00:07:36
dos parámetros 00:07:38
¿vale? my prefab y referencia 00:07:39
referencia, si lo pensamos bien 00:07:42
me podéis contestar 00:07:44
a qué se está refiriendo en este momento 00:07:45
a la línea de objeciones que has ubicado 00:07:47
hay vacío, ¿no? 00:07:55
No, tened en cuenta que yo he generado aquí una variable 00:07:57
de tipo transform, y transform, si recordáis, 00:08:00
es el primer componente que tiene las coordenadas 00:08:04
de posición, rotación y escala de cualquier objeto, 00:08:06
de casi cualquiera. 00:08:09
Todos suelen empezar teniendo ese componente, 00:08:10
y luego muchos otros dependiendo de cuál sea la función. 00:08:13
Fijaos que yo en referencia, que es otra variable 00:08:16
que he generado por medio de un campo serializado, 00:08:20
no le he dado ninguna referencia, ahora mismo está vacía 00:08:24
es nula, no existe 00:08:27
por eso la ha generado 00:08:28
en el 0.0.0 y no es hija de nada 00:08:31
como pongo ahí que es 00:08:33
si os fijáis es exactamente el prefab 00:08:34
el 0.0 00:08:37
porque no tiene esa referencia, es decir, ahora mismo 00:08:38
esta línea está funcionando como esta 00:08:41
primera, porque aquí lo que tiene 00:08:42
es nada, no le existe 00:08:45
para aprovechar esta sobrecarga y que tenga 00:08:46
sentido meter 00:08:48
dos variables aquí dentro 00:08:49
Pues habría que decir cuál es esa referencia 00:08:52
Y ahora mismo pone ninguna y está esperando un objeto, un vínculo, digamos, en este campo del tipo transform 00:08:57
¿Eso qué significa lo de transform? 00:09:05
Que si yo en este campo, igual que he hecho en este de aquí arriba, arrastro aquí la nave 00:09:08
Vais a ver que pone esa nave prefab, es el mismo objeto 00:09:12
Pero fijaos en dos cosas 00:09:16
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:18
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, 00:09:27
porque de esta variable solo está recogiendo lo relativo al transform del objeto. 00:09:32
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, 00:09:53
aquí solo estamos cogiendo una parte de ese objeto, ese componente transform. 00:09:58
Esto me sirve, nuevamente el otro día, para introducir que las variables pueden ser de tipos casi ilimitados 00:10:03
en relación con la cantidad de componentes que hay. 00:10:10
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
que introduzcamos algo en este campo 00:11:21
de tipo RigidBody, un poco del tipo 00:11:24
de la caja que hemos creado 00:11:27
si yo aquí arrastro ahora la nave 00:11:28
veréis que la nave prefab 00:11:29
como no tiene RigidBody 00:11:33
no lo va a coger 00:11:34
porque sí que tiene transform, sí que se puede 00:11:36
arrastrar como todos los GameObjects 00:11:39
un GameObject, pero no tiene un RigidBody 00:11:40
por tanto, aunque yo intente 00:11:43
podéis hacer la prueba, arrastrar 00:11:45
igual que si me deja introducirlo en los otros 00:11:46
dos campos, aquí no me deja 00:11:49
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í 00:14:41
refiriéndonos a la clase directamente, 00:14:43
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 porque por más cuestiones pero veis que lo 00:15:09
importante de esto ahora mismo es que cuando ponemos un punto 00:15:15
vamos abriendo opciones hijas de ese primer elemento que hemos puesto como lo 00:15:19
que el otro día os dije de país comunidad autónoma vale o estado si fuera 00:15:24
eeuu ciudad punto calle punto número vale si estas propiedades existieran 00:15:30
configuradas vale pues sería esta la forma la sintaxis para ir accediendo 00:15:37
digamos de un elemento a otro pero para poder acceder por ejemplo al elemento 00:15:41
ciudad si no lo hemos configurado de otra forma siempre que hay que ir 00:15:47
accediendo de un padre digamos que reconozca o que hemos guardado como 00:15:51
variable como punto de partida y luego podemos ir 00:15:55
llegando a los hijos esto qué quiere decir que si hemos generado y les 00:15:59
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:04
¿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 00:17:17
usables a lo largo de todo el proyecto 00:17:18
pero también en momentos nos puede interesar 00:17:20
que esa variable se cree al empezar el juego 00:17:23
¿vale? 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
que 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 instancia 00:18:02
Que es que crea una instancia a la posición del objeto de referencia 00:18:11
Que es este segundo que tenemos aquí 00:18:14
Y como hijo suyo, es decir, de esta referencia 00:18:16
Todo esto yo me lo sé, aparte de porque ya lo he usado más veces 00:18:20
Porque, os vuelvo a repetir, que si vamos pasando por las sobrecargas 00:18:24
que en este caso 00:18:29
es esta, la que estamos usando 00:18:29
nos pide un GameObject, aquí lo pone 00:18:33
como Object, cuando pone Object significa GameObject 00:18:35
es otra forma de llamarlo 00:18:37
y bueno, si luego 00:18:38
bueno, es que no quiero liar más 00:18:40
la madeja, necesita un objeto 00:18:43
que es el que va a referenciar y luego 00:18:45
un transform que va a ser ese padre 00:18:47
y pone, clona el objeto existente y retorna 00:18:48
el clon, si quisiéramos 00:18:51
saber más, esto ya lo comenté el otro 00:18:53
día, saber más de 00:18:55
que hace cada método 00:18:57
la buena forma de hacerlo es 00:18:59
meternos en el API 00:19:01
en el manual de uso 00:19:02
del código 00:19:05
en el propio 00:19:06
desde el propio Google se puede hacer 00:19:08
si ponemos el método 00:19:11
o la propiedad que queramos consultar 00:19:13
y ponemos Unity después 00:19:15
lo primero que va a poner 00:19:16
va a ser 00:19:18
el acceso 00:19:19
a cómo se 00:19:23
usa este elemento 00:19:25
o este método, aquí veis que vienen 00:19:28
ya varias sobrecargas 00:19:30
y si vamos pasando, aquí pone 00:19:31
object original 00:19:34
que aquí es lo mismo que ponía en el IntelliSense 00:19:35
que hemos visto antes en el código, y aquí sí que 00:19:38
podemos ir más con detalle, por si 00:19:40
tenemos dudas, ir viendo qué significa 00:19:42
cada cosa, pues oye, es algo de tipo objeto 00:19:44
de GameObject, no podemos meterle otra cosa 00:19:46
quiere un GameObject, aquí 00:19:47
y en original es el nombre que le ha dado 00:19:49
a esta variable, digamos 00:19:52
a este parámetro que está esperando que hagamos algo con él, ¿vale? 00:19:54
Y aquí si bajamos en los parámetros nos dice, vale, lo que yo ponga como original, 00:19:57
que es en todas estas, en esta posición de los parámetros, dice un objeto existente 00:20:01
del que quieras hacer una copia, ¿vale? Pues ya sabemos que aquí habría que meter 00:20:05
ese objeto que queremos copiar, ¿vale? Cuando pone parent, pues podemos ir a parent. 00:20:10
Padre que será asignado al nuevo objeto, ¿vale? Pues aquí meteremos un transform, ¿vale? 00:20:16
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, características de, en este caso, Instance 8. 00:20:26
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 iréis entendiendo más todos los ejemplos. 00:20:42
Fijaos que luego incluso Instantiate, bueno, yo lo he hecho así un poco a las bravas, pero incluso fijaos que Instantiate, si lo vuelvo a declarar aquí, tiene más tipos, ¿vale? Con estas llavecicas que se abren aquí y si me pongo encima, pues no da muchas descripciones y en ese caso, para desambiguar, para saber qué significa, pues tendríamos que meternos nuevamente en el manual o en la API, ¿vale? 00:20:47
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:12
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
al manual, bueno, 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í, se puede cambiar a manual 00:21:58
que si tiene una sección en el manual del propio programa 00:22:00
pues os puede contar una descripción que no está tan basada 00:22:04
en el código, sino del uso 00:22:07
esto lamentablemente no suele estar en español 00:22:08
igual que el software en sí, el Unity no está en español 00:22:12
pero bueno, con poco a poco en inglés 00:22:15
Es bastante técnico, 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. 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. 00:22:18
Que me importaba ver un poco qué significan estos nombres que aparecen bajo original, position, ¿veis? En la sobrecarga pone object original. 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. 00:22:42
¿Vale? Vuelvo aquí 00:23:01
¿Vale? ¿Qué tal hasta aquí? 00:23:03
Más o menos me vais siguiendo 00:23:06
Doy vueltas que poco a poco 00:23:07
Se irán completando ¿Vale? 00:23:10
Que de primera es muy complicado explicar todo 00:23:11
Vale 00:23:14
Vamos a quedarnos con lo más mundano 00:23:16
De todo esto ¿Vale? 00:23:18
Que es que estamos generando una variable de tipo GameObject 00:23:20
Y dentro de esa caja 00:23:23
¿Vale? Llamada instancia 00:23:24
Si esto 00:23:26
Claro 00:23:28
Bueno me está diciendo un compañero 00:23:30
que es un poco complicado acordarse de todo 00:23:32
esto, lo dije el primer día 00:23:34
va a ser una constante iteración 00:23:36
va a haber que ir volviendo todo el rato 00:23:38
a lo mismo e ir machacándolo 00:23:40
es importante 00:23:41
no sé si lo estáis haciendo, leer bien los temas 00:23:43
e ir intentando hacer las tareas, poco a poco 00:23:45
pues 00:23:48
acordarse es ir teniendo 00:23:49
conciencia de cómo era 00:23:52
pero una vez vamos usando las cosas 00:23:53
varias veces, y ya os digo, con el uso de la app 00:23:55
y del IntelliSense, por eso soy tan 00:23:58
pesado con ir entendiendo 00:24:00
Cuando escribimos algo aquí, ¿qué significa? Si ponemos invoke, yo a lo mejor no sé qué es invoke, pero me suena que algo se usaba y aquí podemos ir sabiendo, cuando es un método, podemos ir sabiendo qué cosas son, deduciéndolo o metiéndonos en la API. 00:24:02
Y poco a poco iremos salvando todo, ya veréis. Si seguimos viendo esto, nos falta decirle cuál es la referencia de este prefab. Y la referencia que nosotros queramos. Aquí la tenemos preparada, la variable, para usarla, pero todavía no lo estamos haciendo bien. 00:24:18
Porque aquí os lo he puesto como ejemplo 00:24:35
La voy a quitar, ¿vale? 00:24:38
Si dais a este circulito podéis decirle 00:24:41
Que no queréis ninguna, que es como estaba 00:24:43
Y claro, yo lo que voy a querer en cierto momento 00:24:45
Es usar las capacidades 00:24:47
Que me está dando 00:24:49
Esa sobrecarga de Instanciate 00:24:50
Para decirle yo el punto en el que quiero que se instancie 00:24:53
No quiero que se instancie a lo mejor en el 0, 0, 0 00:24:55
¿Vale? 00:24:58
Sino que yo quiero que se instancie donde 00:24:59
Punto, ¿vale? 00:25:01
Estoy generando un GameObject vacío 00:25:03
recordad que igual que se puede generar estos cubos y estos elementos con los que habéis hecho el prefab de la nave 00:25:05
puede generar un vacío, un empty, que es como los nulos en los software de 3D 00:25:11
que sirve simplemente para tener una referencia en el espacio 00:25:15
no contiene nada más allá de una referencia del espacio 00:25:18
y lo voy a llamar, borro este que he generado dos en el proceso 00:25:21
lo voy a llamar punto referencia para saber bien que es ese 00:25:25
y ojo que cuando generamos un nuevo empty object o cualquier elemento 00:25:29
puede no estar ubicado en el 00 que de partida no nos gustaría. 00:25:34
Nos lo pone en el centro del visor donde estamos mirando. 00:25:38
Ojo que suelen ir ya a las posiciones modificadas. 00:25:41
Si queremos colocar algo en origen en el 00, en los tres puntos de ese componente, 00:25:46
si le damos a Reset, se colocará ahí. 00:25:52
Esto lo he hecho un poco para que veáis el punto de partida. 00:25:56
Pero ahora lo que puedo hacer es decir, no, yo quiero que este elemento, la nave, 00:25:58
se instancie en el 00:26:02
y lo voy a meter a mano 00:26:04
menos 40 y en i 00:26:06
10, ¿vale? porque es donde 00:26:08
yo quiero que comience 00:26:10
si, y en z incluso 00:26:11
vamos a ponerle un 15 00:26:14
el punto que sea, da un poco 00:26:16
igual, esto lo que nos va a 00:26:18
permitir es que luego cuando nosotros 00:26:20
digamos que este GameObject 00:26:22
punto de referencia, ¿vale? 00:26:24
y teniendo aquí abierta 00:26:25
en el inspector donde tenemos el código 00:26:28
y las variables preparadas 00:26:30
arrastramos ese objeto, lo que va a hacer es coger el transform de este punto de referencia 00:26:31
que nosotros hemos ubicado donde queremos que esté. 00:26:37
Entonces, ahora mismo ya tenemos preparada una referencia que se coge con esta variable referencia 00:26:41
y que nosotros usamos aquí como segundo parámetro del InstanceAid. 00:26:47
Si yo ahora ejecuto el juego, va a hacer dos cosas, como bien dice aquí. 00:26:55
crea una instancia en la posición del objeto de referencia 00:26:59
en esta ubicación 00:27:01
que acabamos de poner 00:27:04
y como hijo suyo además, tiene una pequeña 00:27:04
sutileza 00:27:07
entonces, yo cuando ahora arranque el juego 00:27:08
vais a ver 00:27:11
que esa nave 00:27:12
primero se ha colocado, si recordáis 00:27:15
en este punto donde está 00:27:17
punto de referencia y además se ha hecho su hijo 00:27:18
¿vale? se llama hola 00:27:21
porque en el código hemos dicho 00:27:23
que la instancia 00:27:25
que el nombre de esa instancia sea hola vale entonces ver que no es lo mismo tener activo 00:27:26
este esta instancia acción bien referenciado todo que simplemente generar el instante a secas vale 00:27:34
esto me sirve para que poco a poco vayáis viendo que lo que hay dentro de estos paréntesis en un 00:27:42
método vale pues influye un método o una función que son lo mismo ya os comenté el otro día que 00:27:50
son digamos operaciones de acción de algo que ocurre en este caso vamos a instanciar en este 00:27:58
caso esto es otro método que sirve para marcar qué va a ocurrir al empezar el juego o al iniciarse 00:28:04
este script no recordad que era cuando el objeto se iniciaba y si veis cuando hay un método tiene 00:28:10
el nombre de esa acción que va a hacer 00:28:16
y siempre va a ir a continuación 00:28:18
un paréntesis. 00:28:21
A veces vacío, a veces lleno. 00:28:23
Pero cuando vemos 00:28:26
una palabra que está escrita en mayúsculas 00:28:27
la primera letra 00:28:29
y luego tiene paréntesis, eso significa 00:28:31
que estamos usando lo que se llama un método función. 00:28:33
Es decir, una acción que vamos a hacer. 00:28:35
Que no es lo mismo que si yo pongo 00:28:38
transform 00:28:39
position 00:28:41
igual a 00:28:42
referencia, ¿vale? 00:28:44
Que esto, básicamente, a ver, reference position, había que 00:28:49
aprender, ¿vale? 00:28:53
Esto ya os explicaré un poco más qué es, ¿vale? 00:28:57
Pero al final no es lo mismo decir, oye, instanciate aquí y 00:28:59
tal cosa, que en esta línea que no vemos ni un solo paréntesis. 00:29:04
Esto significa que aquí no hay ningún método. 00:29:07
Los paréntesis pueden indicar más cosas, pero en lo general son 00:29:09
métodos o funciones 00:29:12
¿vale? ahora volveremos otra vez 00:29:15
a los métodos 00:29:17
entonces, ya simplemente por terminar 00:29:18
esta 00:29:21
explicación como de las sobrecargas 00:29:23
de las sobrecargas que puede tener Instantiate 00:29:25
ya a ver un segundo que esto 00:29:27
este, vale 00:29:29
tenemos una tercera 00:29:30
forma de instanciar, vale, comento todo 00:29:32
menos esta última, que yo sé 00:29:35
que es, y borro 00:29:37
todo lo relacionado con 00:29:38
con los comentarios 00:29:40
que es que crea una instancia en el punto de referencia 00:29:43
pero sin rotación 00:29:46
¿vale? 00:29:47
vale, aquí si os fijáis tenemos 00:29:49
tres elementos y es igual que 00:29:51
el anterior en el sentido de que 00:29:53
primero, el primero de ellos es 00:29:55
el prefab ¿vale? y voy a ir a la API un segundo 00:29:57
Instantiate, la tenía por aquí 00:30:01
abierta si no me equivoco, aquí está 00:30:04
¿vale? esta es la primera que hemos usado 00:30:06
esta es la segunda y ahora 00:30:08
vamos a ir a esta tercera, ¿vale? Esta no la saltamos porque tampoco aporta mucho, pero 00:30:09
aquí básicamente nos pide, ¿vale? Un objeto. Ahora, el segundo parámetro, aunque es parecido, 00:30:16
es una posición, ¿vale? De tipo vector 3. Esto es verdad que todavía no lo hemos visto. 00:30:24
Y luego la rotación. Esto ahora mismo es un poco enrevesado y por eso no voy a meterme 00:30:30
mucho volvemos a ello si queréis más adelante pero esta sobrecarga al final lo que me está 00:30:35
pidiendo son otro tipo de valores entonces si os fijáis incluso aquí cuando vemos esta referencia 00:30:40
aquí no me está pidiendo un transform un transform completo como como si que hacía en la otra 00:30:50
sobrecarga vale aquí me pedía el transform completo del objeto que iba a ser el padre aquí me pide 00:30:56
solo la posición. Entonces quiero que vayáis también teniendo en la cabeza que ciertos 00:31:02
parámetros tienen más parámetros dentro, como hemos dicho antes, que podemos ir abriendo 00:31:10
con punto. Porque pensad una cosa, si me está pidiendo la posición de un elemento y yo 00:31:15
tengo un transform en referencia, yo al final lo que estoy haciendo es, en este transform 00:31:20
estoy cogiendo todo lo que hay en este componente, la posición, la rotación y la escala, que 00:31:26
Al final son tres valores de la posición, tres valores de la rotación y tres valores de la escala, ¿verdad? 00:31:32
Entonces, cuando me piden solo la posición, vais a ver que al final lo que estoy haciendo aquí es decirle, 00:31:38
vale, de este transform que yo he llamado reference, solo voy a coger la posición. 00:31:45
Porque si intento meter todo, esto me da fallo porque dice, vale, no sé que de todo lo que tiene dentro en la posición o en la rotación, 00:31:50
Pues yo que sé, si yo pongo aquí rotation, veis que puedo meter la rotación. Me da fallo también por otras sutilezas, porque habría que ponerlo en ángulo Seuler, básicamente, que es una cosa que ya veremos en este tema. 00:31:59
Pero veis que a medida que yo le voy dando la instrucción correcta, esto me puede dar que algo se puede ejecutar o no. 00:32:15
Sutilezas. Que a veces hay que ir pensando, ¿qué valores estoy guardando en este transform? 00:32:25
Pues estoy guardando los de posición, los de rotación, los de escala, y aquí solo me pide posición. 00:32:29
Y luego aquí me pide la rotación, que esto sí que es verdad que es más avanzado, entonces no me voy a meter mucho. 00:32:35
Pero aquí básicamente con esta instrucción estoy diciéndole, cógeme la rotación que tenga por defecto. 00:32:40
el objeto. Entonces yo cuando use esta forma de 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:32:45
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:33:07
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:33:26
Vale, vamos al tema cero. Voy a guardar, ¿vale? Recordad esta estrella, esta pequeña estrella y voy a ello. 00:33:44
Vale, tengo aquí otro script que simplemente va a servir para practicar ahora. 00:33:56
No va a tener, como hemos hecho ahora en InstanceAid, que se vea un resultado claro en el visor, 00:34:05
Pero me sirve para que vayamos entendiendo mejor qué tipos de variables existen y usos y aplicaciones que se pueden hacer. De momento quizá un poco abstractas en el sentido de, pues solo estamos viendo sumas y restas, pero luego es que esas sumas y restas, como dije el otro día, puede ser como sube y baja el número de puntos que tiene un contador. 00:34:09
Y se va a basar un poco en lo mismo. Recordad cómo se generaba un script. Lo voy a hacer en esta carpeta de script que tengo aquí preparada durante la tutoría. 00:34:28
Pues yo hago este script. 00:34:46
Recordad que en este Cesar script podemos generar un script que vamos a llamar durante. 00:34:49
Recordad que el nombre que vayamos asignando aquí luego debe ser el mismo de la clase de dentro del script. 00:34:56
Esto ya lo he dicho como en dos tutorías previas, por tanto entiendo que no habrá problema. 00:35:03
Y además en el tema cero va poniendo buenas prácticas de cómo escribir los nombres de los scripts, los nombres de los métodos, de las variables, ¿vale? Y habla de una cosa que es el Pascal case y el Camel case, ¿vale? 00:35:08
Cuando generamos una clase o lo que es lo mismo, generamos dentro de Unity un script, siempre, ¿vale? Lo digo porque luego nos va a ayudar a que todo sea más fácil de ir siguiendo, siempre deberíamos empezar a escribir el nombre del script con mayúscula, ¿vale? 00:35:27
Y, a diferencia de nuestro lenguaje del día a día, los espacios no existen o no se usan correctamente cuando estamos escribiendo órdenes. Si os fijáis, todo lo que os he ido enseñando antes no había espacios. Había muy pocos. Hasta que no termine de escribir esto no quiero volver a enseñaros un script. 00:35:45
Pero vais a ver que normalmente se escriben las palabras juntas. ¿Y cómo se distingue que una palabra, pues hay un espacio entre ellos? En vez de dar el típico espacio que hacemos con la barra espaciadora, lo que hacemos es empezar la siguiente palabra con mayúscula durante la tutoría. 00:36:05
importante, lo que son 00:36:24
tildes y eñes 00:36:26
no las uséis nunca 00:36:28
en nada relacionado con programación 00:36:30
me explico, incluso 00:36:32
aunque esto sea el nombre de un script, recordad 00:36:34
que, vale, guardo y se genera 00:36:36
que cuando yo genero este script, al final 00:36:38
estoy realizando un código 00:36:40
cuyo nombre de clase 00:36:42
también está dentro del código 00:36:44
si yo empiezo a poner tildes, esto va a 00:36:45
empezar a dar ciertos problemas, vale 00:36:48
y aunque ahora parezca a lo mejor 00:36:50
que no lo da, tarde o temprano 00:36:52
no lo va a dar. Igual sucede si ponemos una ñ o si ponemos un signo que no esté reconocido, 00:36:54
que puede haber algunos. Entonces, atención, fijaos que siempre he escrito con la primera 00:37:02
letra mayúscula en lo que se llama Pascal Case. Pascal fue un, si no recuerdo mal, un 00:37:08
matemático y como es un nombre propio, por eso se llama así, con mayúscula, Pascal 00:37:13
Case, que no es lo mismo si nos fijamos a lo que hemos estado... Bueno, y fijaos también 00:37:18
que los métodos, los de los paréntesis, también van con mayúsculas. 00:37:22
Es decir, instantiate existe con mayúsculas, ¿vale? 00:37:25
Pero si yo me pongo a buscarlos con minúscula, no existe. 00:37:29
Es decir, sí que intenta ayudarme diciéndome que esto está en mayúsculas, 00:37:33
pero vais a ver que yo cuando lo ponga, me lo ponen en mayúsculas, ¿vale? 00:37:36
Los métodos, esas palabras que sirven para indicar que se ejecute una acción, 00:37:39
que van con estos paréntesis, siempre empiezan a escribirse con mayúsculas. 00:37:46
Y lo mismo, si instantiate tuviera otra palabra, sería instantiate double, yo que sé. 00:37:49
Pues no se separa, no se separa así, porque esto significa hacer dos instrucciones distintas o otro tipo de orden. 00:37:54
Si es solo una orden llamada instantiate double, no hay espacio en el medio. 00:38:03
Se van separando, digamos, marcando la separación de palabras con esta mayúscula, que va separando estas palabras. 00:38:08
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:38:15
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:38:39
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. Y las variables, ¿vale? Por convención se escriben del mismo modo pero empezando en minúscula, ¿vale? 00:39:03
Igual que instant set va con mayúscula, fijaos que my prefab, cuando lo hemos declarado aquí al principio, va con minúscula, ¿vale? Igual cuando queramos separar, veis que el my bien, porque es el nombre que le hemos dado a GameObject, pero este prefab aquí no pinta nada para que lo interprete como el nombre de la caja. 00:39:22
Aunque sean dos palabras distintas, empieza con minúscula y para separar las palabras hay que poner una mayúscula aquí. 00:39:40
Y os lo dije el otro día, y si no os habéis dado cuenta, fijaos si está preparado esto, que aunque no dejemos esos espacios, 00:39:47
el propio Unity ya va viendo dónde meter los espacios. 00:39:53
Aquí nos ha metido un espacio en donde en el nombre del script no lo había, recordad. 00:39:59
o incluso en el MyPrefab, que es el nombre de la variable que hemos puesto, 00:40:03
la MSI la ha puesto en mayúsculas y ha puesto este espacio. 00:40:09
Fijaos que el propio software sabe interpretarlo. 00:40:12
Entonces nosotros nos tenemos que hacer a la forma en la que tenemos que escribir el código. 00:40:16
Importante. 00:40:20
Es decir, recapitulando, las clases, barra, porque es lo mismo, scripts, 00:40:22
siempre comenzando con mayúsculas, 00:40:26
los métodos, a medida que vayamos sabiendo cómo llamarlos 00:40:29
o cómo crearlos. También en mayúsculas, ¿vale? Y lo que son las variables en minúsculas, ¿vale? 00:40:32
La diferencia de esto es que esto es PascalCase porque empieza en mayúscula y esto es lo que se llama CamelCase. 00:40:41
Lo de camel porque aparece como la joroba de un camello, ¿vale? Esto también viene en los apuntes. 00:40:47
Si os sirve para acordaros, pues CamelCase es cuando empieza en minúscula. PascalCase cuando es un nombre propio, ¿vale? 00:40:52
vamos un poco con 00:40:57
durante la tutoría 00:41:00
que son digamos operaciones 00:41:02
más básicas para ir viendo el tema 00:41:04
cero, vale, sobre las variables 00:41:06
el otro día estuvimos ya hablando 00:41:08
bastante y de hecho aquí volvemos a hablar 00:41:10
de hecho lo de camel case está aquí puesto 00:41:12
que hay que darle un nombre 00:41:14
a la variable, que cada uno puede tener 00:41:16
un tipo de valor, que es lo que el otro 00:41:18
día estuvimos hablando que eran los 00:41:20
ints, los floats, los strings 00:41:22
las cadenas, recordáis esto, ¿verdad? 00:41:24
Esto ya lo hemos visto. Más o menos hasta aquí lo tenemos. Hemos visto incluso ya tipos de variables de tipo clase, como este GameObject o este Transform en el que guardábamos la referencia que cogíamos por el inspector en el SerializeField. 00:41:26
¿Sí? Por ejemplo, imaginaos que yo en el código, ¿vale? Aquí, justo dentro de la clase, recordad que las llaves delimitan qué hay dentro de cada uno de los apartados del código, ¿vale? 00:41:41
Y las clases, ¿vale? Cuando empezamos una clase, vamos generando estas variables, como he dicho antes, que luego podrán ser usadas dentro de todo este bloque. 00:41:58
Cuando vamos trabajando en un lenguaje como C-SARP, al final existe un proceso, una lógica, que es el encapsulamiento. 00:42:08
El encapsulamiento significa que dentro de estas llaves, de cada uno de los bloques, de esta o de esta, que es otro bloque, o de este, que es otro bloque, 00:42:21
podemos ir usando variables que queremos, nos puede interesar, que solo existan dentro de este bloque o que existan en este bloque 00:42:29
y por defecto también existen los de dentro. 00:42:36
El encapsulamiento sirve para que, digamos, partes del código se puedan comunicar entre sí o no. 00:42:39
Esto también lo iremos viendo. 00:42:45
Pero este concepto de encapsulamiento, si a alguien le interesa, existe. 00:42:46
Y ya me sirve para explicar eso, que cuando tenemos una clase, 00:42:51
que es donde vamos generando todas las instrucciones que hay dentro de este script, 00:42:53
pues ya vamos, a lo mejor, haciendo variables. 00:42:57
Si esto es el script del movimiento del jugador, 00:42:59
imaginaos que fuera esta la función de este script, 00:43:03
que luego meteremos como componente 00:43:05
al GameObject del jugador 00:43:07
pues ese jugador 00:43:09
a lo mejor vamos a querer que 00:43:12
tenga una vida inicial 00:43:13
y quiero que esa vida inicial 00:43:14
sea de 100 puntos, imaginaos 00:43:17
vale, esto 00:43:19
veis que yo por defecto si pongo 00:43:21
un 100 no sirve para nada, me da 00:43:23
falla, 100 que no sabe 00:43:25
que es, incluso cuando empieza el juego 00:43:27
yo puedo 00:43:29
decir aquí 100 y punto 00:43:31
y coma, ¿vale? Pero me va a decir 100 que 00:43:33
¿no? Tenéis que ir 00:43:35
entendiendo que es que 00:43:37
los números y los datos 00:43:38
no existen en el 00:43:41
código, no son operativos 00:43:43
hasta que no se encierran en una variable 00:43:45
que es lo que ya vimos el otro día 00:43:47
Si queremos generar una variable 00:43:48
de la vida del personaje que guarde 00:43:51
un valor 100 00:43:53
¿qué habría que generar? 00:43:54
¿Cómo sería? Que esto el otro día 00:43:57
un poco vimos 00:43:59
Una variable, ¿no? 00:44:00
vale, y como, dime un poco 00:44:04
que, como la genero 00:44:06
pues pones int 00:44:08
vale, int, ahora la vemos 00:44:09
espacio, vale 00:44:12
vida, muy bien 00:44:13
igualación, y punto y coma 00:44:15
vale, mira, que me digas esto 00:44:18
así, significa que ya has aprendido como se declara 00:44:20
una variable, muy bien, ha aprendido 00:44:22
así que vamos a ello 00:44:24
¿por qué ha sido int y no float? 00:44:25
o string o otra cosa, porque es un 00:44:28
número entero, vale, entonces 00:44:30
Entonces también esto habría que ver el juego, pero la vida normalmente si tiene un valor como 100 que es el máximo acabo de decir y vamos a decir ya por defecto que la muerte es que llega al cero, pues normalmente en un contador de eso no va a ir tan fino como ir a decimales. 00:44:32
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:44:48
Imaginaos que quisiera guardar una con decimales, y en ese caso, pues podríamos decir cosas como 5 con 5, ¿no? 00:45:01
¿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:45:08
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:45:15
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:45:26
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:45:40
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:46:02
¿Eso qué significa? Que antes os he hablado de que existían bloques para ir declarando las variables, incluso usándolas. 00:46:18
porque os he dicho también antes cuando hemos visto 00:46:26
lo de la instancia que guardamos 00:46:29
como variable, que se puede generar 00:46:31
incluso una instancia dentro de 00:46:33
un start, de un método 00:46:35
de un momento de acción, yo puedo decir 00:46:36
vale, esta variable vida se genera 00:46:39
aquí con un valor de 100 00:46:41
y luego decir vale 00:46:42
y en el update que vida 00:46:45
pase a llamarse, pase a valer 00:46:47
500, porque 00:46:49
cuando el primer frame queremos que sea 100 00:46:51
pero ya los siguientes 500, veis que aquí 00:46:53
vida da un fallo. Y esto es simple. ¿Alguien me sabría decir el por qué? A ver si eso más o menos, vamos, se explica en el tema cero, pero oye. 00:46:55
Vale, os he dicho antes que existía este encapsulamiento que servía para ir, digamos, generando bloques. Fijaos que cuando yo genero la caja, barra la variable, 00:47:07
le pongo el tipo de variable que es. Y yo he generado esta caja aquí, en el start. Y esto es un bloque. A diferencia de cuando lo generamos en la clase, que veis que comprende todo, aquí solo comprende esto. 00:47:17
Por tanto, cuando llamamos a esta variable en otro punto que no es de su bloque, pues no existe. Aquí podríamos incluso generar otra variable llamada vida, que es una vida diferente a esta. 00:47:29
Son dos variables distintas. Esto no es lo mismo que lo que habíamos hecho antes de decir, 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. 00:47:40
Es decir, este 100 se está guardando en todo este tránsito. 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. 00:48:01
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í. 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:48:16
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:48:37
Si yo ahora ejecuto esta instrucción, lo primero es que probablemente desfalle o pase algo raro. 00:48:47
Yo voy a la consola y no veo ni 100, ni 0, ni nada. ¿Por qué? A ver quién me lo sabe responder. 00:48:55
Esto si habéis hecho la tarea 1 deberíais saberlo. 00:49:07
No has asignado el código, ¿no? 00:49:09
efectivamente, no hay ningún objeto 00:49:11
dentro del juego, ni le hemos 00:49:14
dicho de otra forma que se ejecute 00:49:16
no hay ningún objeto en el juego que tenga este script 00:49:17
por tanto el script no se está ejecutando 00:49:20
es decir, no hay ningún momento start 00:49:22
de nada en donde se ejecute 00:49:24
esto, ¿no? entonces 00:49:26
pues en punto 00:49:27
referencia, me da igual porque solo van a ser números 00:49:29
¿vale? voy a asignar 00:49:32
este durante la tutoría como 00:49:33
componente, ¿vale? 00:49:35
a ver, he guardado 00:49:38
recordad que hay que guardar el script 00:49:39
ahí está, y ahora lanzo el juego 00:49:41
a ver, y ahora sí que 00:49:43
cada fotograma está generando 00:49:45
un 100, aquí se van sumando hasta que llega a 1000 00:49:47
que ya no sea más, pero aquí 00:49:49
se van 100, 100, 100, 100, vale 00:49:51
entendéis que al final lo que estamos 00:49:53
consiguiendo es cambiar las variables 00:49:55
en distintos puntos del 00:49:57
código, esto es importante entenderlo 00:49:59
porque es lo que os he dicho antes 00:50:01
si yo genero aquí la caja y aquí no existiera 00:50:03
y guardo la caja aquí 00:50:06
al final vida no existe para el update 00:50:07
Porque está fuera del ámbito donde se ha generado esta caja. Esto también es por algo que se llama los ámbitos, que voy algunos pasos más adelante. Dentro del tema cero, aquí se habla de los ámbitos de las variables. 00:50:09
Y habla un poquito de estos bloques y de estos ámbitos y un poco también de lo que os estoy comentando aquí, ¿vale? Igual este código es un poco más avanzado, por eso lo estoy simplificando, pero básicamente de lo que habla es que están las variables globales que se declaran al comienzo y están disponibles en todo el script, incluso dentro de las funciones, como sería el start y el update y aquí saludar, ¿vale? 00:50:24
Y luego las locales, que se declaran dentro de una función, y por eso solo están disponibles dentro de ella, ¿vale? Por tanto, cuando más adelante hablemos, aquí he declarado una variable local, porque está en un bloque muy concreto, una función, y aquí las que se generan dentro de la clase son las variables que se llaman globales, ¿vale? 00:50:48
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, 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, que es lo que hemos hecho con el prefab que hemos arrastrado. 00:51:12
¿Vale? 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:51:38
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:51:56
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:52:22
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:52:42
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:53:00
Cuando la ponemos en pública, además Unity tiene la, aparte de permitir que en otros scripts podamos acceder, 00:53:11
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:53:20
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:53:34
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:53:47
también me sirve para que veáis 00:54:10
como voy escribiendo las variables 00:54:12
es algo muy importante 00:54:14
y le asigno y le pongo un 00:54:15
5.8f 00:54:17
porque es un float 00:54:20
¿vale? vais a ver que yo cuando 00:54:21
bueno, ¿por qué da fallo? 00:54:24
porque he intentado guardar una variable float 00:54:26
en un int ¿vale? entonces 00:54:28
es importante los tipos 00:54:30
de variables como los vamos gestionando 00:54:32
cuando ahora vaya 00:54:34
al script tengo las dos variables 00:54:37
Veis que aquí en apariencia hacen lo mismo, pero si aterrizamos aquí, vemos que una es pública, ¿vale? Y eso será accesible desde otras clases. De hecho, veis que la clase ya por defecto nos 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:54:40
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. 00:55:01
De hecho, lo voy a hacer muy rápido, ¿vale? Aunque no entendamos tampoco. Tengo el script durante la tutoría y el script Instanced Prefab que he preparado antes. Imaginaos que yo quiero cambiar desde Instanced Prefab la variable con decimales. 00:55:18
Pues lo primero que habrá que hacer, igual que hemos hecho aquí, es decir, durante la tutoría, y veis que ahora voy a generar una variable que se llama igual que otro script. 00:55:33
Y es que recordad, al final las clases, como os he dicho aquí, se corresponden con el nombre de los componentes. 00:55:45
Y cuando arrastramos un script como componente, al final, igual que existe transform, pues existe el componente durante la tutoría. 00:55:52
Es una caja que podemos crear, ¿no? Entonces por eso existe aquí una caja y no da ningún fallo que se llama durante la tutoría y aquí lo puedo llamar como otro, en minúscula porque es una variable, ¿vale? Otro script. 00:56:00
Y aquí está preparado. Y yo en el transform puedo decirle, oye, quiero que otro script acceder a sus propiedades. Y vais a ver que yo a medida que me vaya metiendo en sus propiedades con el punto, como estoy apelando aquí, hay una variable suya de durante la tutoría que se llama variable con decimales. 00:56:14
Pues vais a ver que, cuando yo doy el punto, aquí existe una variable llamada variable con decimales. Y yo puedo decir, oye, pues esto quiero que valga 10. Y aquí está cambiando el valor, ¿vale? 00:56:32
Si yo guardo esto desde otro código, estoy cambiando el valor de este 5,5, ¿vale? 00:56:47
Y de hecho vais a ver cuando empiece el juego, ¿vale? 00:56:54
Que variable con decimales, que por defecto debería ser 5,5, ahora como lo he cambiado, pues está cambiado. 00:56:58
Ahora os explico otra cosa. 00:57:06
Como lo he cambiado en el componente, pues se ha quedado con otro comportamiento. 00:57:07
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:57:12
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:57:33
Vale, entonces, vuelvo a ejecutar, me está enseñando 5.5, pero bueno, ¿esto qué está haciendo? A ver, un segundito, ¿eh? 5.5, bla, bla, bla, me enseña esto, bien, pues, vale, un segundo, solo por probar si es esto, hasta luego, Jesús. 00:57:58
hay otro problema 00:58:38
que es por lo que se usa 00:58:44
el serialize fill en ocasiones 00:58:46
que es que cuando tenemos aquí 00:58:48
un script que vamos cambiando 00:58:50
el valor, lo que vamos escribiendo 00:58:52
aquí se sobre impone 00:58:54
a todo lo que vayamos cambiando 00:58:55
entonces, si aquí dejamos 00:58:57
un valor ya puesto 00:58:59
que es diferente al que venía por defecto 00:59:01
se sobre escribe ese 00:59:03
de hecho veis que yo aquí pongo 33.2 00:59:04
y el que sale es 33.2 00:59:07
En ese caso, habrá que ir operando de distinto modo, porque como está haciendo público, lo está variando aquí. 00:59:09
Pero bueno, no debería... Perdona, porque esto en realidad lo estoy haciendo, pero por que veáis una cosa que no es ni siquiera esto. A ver, espera un segundo, que ya es por saber qué estoy haciendo yo. 00:59:19
A ver, papá, iba a ponerte entre 3 con 2, claro, porque es el que está sobreescribiendo. 00:59:36
Vale, este es el típico problema que pasa cuando tenemos un public, ¿vale? 00:59:42
Y al final lo que estamos haciendo es cambiar el valor, igual que hemos hecho con los valores de estos puntos, ¿vale? 00:59:47
Lo estamos cambiando en el editor, que es que básicamente en el editor estamos marcando qué tiene que hacer Unity y está sobreponiéndose a lo que hace el código. 00:59:55
Lo que me importa de todo esto es simplemente que veáis, 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 variable con decimales, a variable serializada, otro script, no va a aparecer. 01:00:04
Es decir, no va a aparecer variable serializada e incluso aunque yo me ponga a intentar escribir que valga 20, yo qué sé, me da fallo. ¿Por qué? Simplemente... 01:00:29
Ah, y bueno, ya sé por qué no se está ejecutando, no estaba guardando, creo. Vale, lo escribo bien. 01:00:41
Durante la tutoría, yo aunque tengo esta variable aquí serializada, no me la coge. ¿Por qué? Porque es privada. 01:00:47
Hasta que yo no la haga pública, yo no voy a poder acceder. 01:00:54
Veis que ahora ya ha dejado de tener error. 01:00:59
Esto simplemente me sirve, que lo mismo, todavía no sabemos aplicarlo, 01:01:01
me sirve para que veáis que las variables en ocasiones no se podrá acceder a ellas 01:01:05
o no se podrá ver en el editor porque no tienen el ámbito, el acceso al ámbito correcto. 01:01:09
Perfecto. Voy, me estoy enrevesando mucho quizá con ciertas cosas y vamos a volver a donde nos hemos quedado con el ISA. Pero lo que me importa es que ya sabemos que cada bloque, ¿veis? Irá dando fallo o no según el ámbito que tenga, en donde se declara esta caja. Que no es lo mismo declararla aquí al comienzo de la clase que dentro del start, por ejemplo. 01:01:17
¿vale? Luego 01:01:40
tenemos aquí un int 01:01:41
y hago aquí un float que es 01:01:43
vida 01:01:45
power 01:01:49
up, yo que sé 01:01:52
que es como los puntos que va a dar a la vida 01:01:53
el power up cuando lo recojamos, le voy a poner 01:01:56
que 50, recupera media vida ¿no? 01:01:58
Lo suyo sería que si hubiera 01:02:00
más de 100, pues el power up no te permitirá 01:02:02
tener más de 100, pero vamos a obviar eso de momento 01:02:04
¿vale? Lo que podemos 01:02:06
hacer el otro día dijimos es que podemos hacer operaciones de vida más power up 01:02:08
vale y que esto pues signifique algo no pero lo mismo hasta que no lo metemos 01:02:13
dentro de un contexto de una caja vale no va a dar ningún resultado voy a poner 01:02:18
vida actual y de actual que va a ser igual a la vida 01:02:23
más power up vale y esto da un problema ahora mismo he generado dentro de estar 01:02:28
Porque digamos que solo lo voy a ejecutar en el start 01:02:33
Una variable llamada vida actual que deneda error 01:02:36
¿Y por qué pensáis que puede ser? 01:02:40
A ver, así rápido, igual no caéis 01:02:43
Pero ¿por qué podría ser que dé error? 01:02:45
Porque realmente está bien configurado 01:02:47
Hemos hecho las cajas, le hemos dado unos valores 01:02:49
Y estamos guardando dentro de otra caja tipo int 01:02:51
Estos dos valores 01:02:54
Que el otro día ya vimos que se podía operar de este modo 01:02:56
¿Por qué pensáis que da fallo? 01:02:58
A ver si lo podéis 01:03:01
por los paréntesis 01:03:02
¿qué paréntesis? 01:03:09
entre, o sea, tendrías que poner 01:03:12
entre paréntesis vida más power up 01:03:13
vale, lo hago, esto en matemática 01:03:15
los paréntesis es para dar el orden de ejecución 01:03:18
de las operaciones 01:03:20
pero aquí sería, es indistinto 01:03:21
hacer esto que esto, ¿vale? 01:03:24
me digo que ese no es el problema, vaya, pero vaya 01:03:25
que buen intento, me encanta que participéis, por favor 01:03:27
vale, simplemente también para que 01:03:30
lo veáis, los tipos de cajas 01:03:32
cuando 01:03:33
Cuando sumamos 100 más 50 da 150 y es un entero, ¿no? 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:03:36
¿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:03:55
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:04:15
Pero veis que el int no lo permite. 01:04:26
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:04:29
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:04:39
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:04:52
simplemente lo que me sirve es que veáis 01:05:01
que a veces os pueden dar fallos que decís 01:05:03
¿de dónde me viene esto? 01:05:05
y es simplemente por el tipo de caja 01:05:07
porque es más restrictiva del otro 01:05:08
facilidad para saber identificar eso 01:05:10
si os ponéis encima de un fallo y lo dejáis quieto 01:05:13
os va a poner en la segunda línea en este caso 01:05:15
no se puede convertir implícitamente el tipo float en int 01:05:18
ya existe conversión explícita 01:05:22
compruebe si le falta una conversión 01:05:24
básicamente aquí lo que está diciendo es 01:05:25
que no se puede convertir 01:05:26
si no lo hacemos de manera explícita nosotros 01:05:28
Como he hecho antes con una orden que se puede ejecutar 01:05:30
No se puede convertir un float en int 01:05:33
Porque es que no cabe en esa caja 01:05:35
¿Vale? 01:05:37
Importante 01:05:38
Importante también 01:05:38
Eso 01:05:40
Que el tipo de variable puede determinar 01:05:41
Qué puede haber dentro 01:05:43
Luego, el otro día vimos también 01:05:44
Que había otro tipo 01:05:46
Entiendo que entre 01:05:47
Con todos estos problemas que pueden ir surgiendo 01:05:48
Lo que es un int y es un float, ¿no? 01:05:51
Y cómo se escribe un float 01:05:53
Para que no dé error 01:05:54
Hasta aquí entiendo que bien, ¿no? 01:05:55
Y bueno, así de fácil 01:06:00
Si yo ahora quisiera ver este valor en la consola, como que lo está recibiendo, lo está ejecutando. 01:06:02
Si veo vida actual y guardo, pues ahora al empezar el juego vamos a ver qué valor. 01:06:11
150,5. 01:06:22
Perfecto. 01:06:24
Vale. 01:06:25
A ver que algo hay por aquí. 01:06:26
A ver, lo mismo. 01:06:29
Pueden ser varias cosas, algo de lo que he tocado por ahí. 01:06:31
variable con decimales 01:06:33
variable con decimales, eso es que 01:06:36
ah bueno, os acordáis que yo había puesto 01:06:39
varias 01:06:42
esto es básicamente, fijaos 01:06:43
la que salía aquí, nuevamente por lo de los 01:06:59
hacerlo público o no y operar mal, yo he borrado las variables 01:07:03
que eran públicas para acceder desde aquí 01:07:06
y ahora, dice durante la tutoría otro script 01:07:07
pero ahora ya no existen estas variables, el error 01:07:11
aunque ha sido que hemos borrado aquí cosas 01:07:13
está afectando a estas variables que ahora 01:07:16
no saben dónde existen, ¿vale? 01:07:18
como no las queremos, lo voy a borrar, pero ved 01:07:19
que cuando comunicamos scripts entre sí 01:07:21
¿vale? y guardo, pueden venir los errores 01:07:24
porque estamos hablando entre unos y otros 01:07:26
y esto sirve también 01:07:28
para hablar del ámbito que estamos hablando 01:07:29
de que salga del bloque, porque cuando empezamos a hacer 01:07:32
códigos muy grandes, si 01:07:34
empezamos a hacer todo público, que se puede 01:07:36
hacer desde un lado a otro, que suele 01:07:38
parecer muy conveniente, muy 01:07:40
cómodo al principio, como estamos 01:07:42
comunicando distintos scripts, surgen este tipo 01:07:44
de problemas, que es que, vale, estamos cambiando aquí un script 01:07:46
pero también estamos afectando a otros 01:07:48
scripts. Entonces, si no tenemos un control 01:07:50
claro de qué está afectando a qué 01:07:52
o no lo restringimos con cosas privadas 01:07:53
o lo redirigimos de otras formas 01:07:56
que ya iremos viendo también, pues 01:07:57
al final lo que sucede es que 01:08:00
empiezan a surgir estos fallos y ahora es 01:08:01
bastante pequeño el código, pero nos puede 01:08:03
volver un poco la cabeza del revés. 01:08:06
Bueno, iba a dar 15,5 01:08:08
si no me equivoco, ¿no? 01:08:10
150 con 5, perdón, pues ahí está 01:08:11
150 con 5, con su decimal 01:08:13
¿vale? 01:08:15
imaginaos que yo quiero hacer una variable 01:08:18
que se va a llamar 01:08:19
nombre, ¿vale? y esto es de repaso del otro día 01:08:21
voy a pasar rápido 01:08:23
y yo quiero que ponga mi nombre 01:08:24
que ponga Daniel, ¿vale? 01:08:27
he creado aquí una variable y como 01:08:30
genero una variable que ponga Daniel 01:08:31
¿qué tendría que poner? 01:08:33
¿de qué tipo tiene que ser? una variable de texto 01:08:35
esto lo vimos el otro día 01:08:37
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? ¿Qué más pone? Podemos usar, su valor se introduce delimitado por comillas, ¿vale? Vale, sí, bueno, esto es otra cosa. 01:08:46
va delimitado por comillas, ¿no? 01:09:08
Si os acordáis, existe otro tipo de variable que se llama string, 01:09:11
en donde puedo llamarlo nombre, ¿vale? 01:09:15
Dado que así es como se va a llamar aquí abajo cuando la mentemos. 01:09:17
Y esto va a significar que se llama, 01:09:22
que yo quiero que aquí se guarde el valor Daniel, entre comillas, ¿vale? 01:09:24
Ahora yo cuando lance el juego, esto lo vimos el otro día. 01:09:28
No sé si tenemos dudas de esto. 01:09:31
Es muy importante que entendamos bien cómo funcionan las variables. 01:09:34
Aquí tenemos a Daniel, ¿vale? Que esto nuevamente yo puedo declarar aquí la variable y aquí, como está dentro del ámbito en donde se ha declarado la variable, pues aquí es donde puedo decirle, aquí quiero que se llame Daniel, ¿vale? Y ahora el resultado será el mismo, se verá Daniel, ¿vale? 01:09:37
si queremos por ejemplo 01:09:57
que en cierto momento del juego 01:10:01
cuando vayamos metiendo datos en un menú 01:10:02
pues por ejemplo podamos meter 01:10:05
nuestra edad, la edad importante 01:10:07
pues siempre va a ser un entero 01:10:09
pues no ponemos decimales 01:10:11
25, este es el mismo ejemplo del otro día 01:10:12
lo doy rápido, recordad que 01:10:15
como hemos visto antes 01:10:17
dependiendo del tipo de variable 01:10:19
pues aquí se va a lanzar de una forma 01:10:20
u otra, eso que significa 01:10:23
que si yo pongo 01:10:24
nombre, más, recordad que esto es la concatenación 01:10:26
de textos, esto también viene aquí explicado 01:10:31
declarando variables, aquí se va hablando un poco 01:10:34
de lo que vamos hablando, ahora vamos a hablar de booleano, pero vais a ver 01:10:39
que en Unity, a ver si no me equivoco 01:10:43
viene por aquí 01:10:46
vale, empezar 01:10:48
bueno, todo lo que os estoy comentando está más o menos recogido por aquí 01:10:54
y aquí se habla de cómo se van 01:10:58
bueno, aquí lo de que se ignoran los espacios en blanco, las líneas, que también lo hemos visto 01:11:03
que cuando vamos sumando distintos, aquí están los operadores 01:11:08
de hecho seguro que está aquí, cuando vamos hilando strings con 01:11:12
números, lo que va haciendo es concatenar ese texto 01:11:16
Es decir, que no es una soma como tal, igual que el igual no es igual y sirve para asignar una variable, cuando hacemos nombre más edad, que aquí no da ningún fallo, al final lo que está haciendo es poner un string Daniel y luego un número, pero un número que en realidad no es un texto. 01:11:20
Lo que pasa es que hay que entender que cuando en una concatenación de elementos, con este más, cuando unimos varios elementos, unos de tipo texto, el resto también se convierte en uno de tipo texto, ¿vale? Pasan a ser todo de tipo texto, igual que hemos hecho antes con lo de convertir el floating in, ¿vale? 01:11:39
Daniel 25, no pone ningún espacio porque si recordáis también aquí dentro podemos empezar con las comillas y las comillas sirven siempre para ir escribiendo nosotros textos literales, no son cantidades que se suman ni que se van a operar, son textos literales. 01:11:56
A mí poner la edad de espacio, ¿vale? Porque los espacios también son literales. Concatenamos Daniel, ¿no? Y ahora concatenamos es de 25, en este caso, años. ¿Vale? Esto cuando hagamos una UI para ir metiendo nuestro nombre al jugar, etc., es vital que vayamos conociendo cómo se declaran. 01:12:12
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, incluso se puede ir cambiando durante el juego, o guardará el valor que introduzcamos nosotros en un menú, en plan, ponerá la nombre y ponemos Jesús, pues se guarda Jesús en esta caja y aquí sabe perfectamente que lo que esté guardado en esta caja, que en ese caso será Jesús, y la edad pues la metemos también y podrá ser 35, pues en ese momento cambiará para mostrar otro mensaje en otro punto del juego. 01:12:41
y la edad de Daniel es de 35 años 01:13:11
fijaos que aquí falta un espacio 01:13:16
básicamente porque 01:13:17
deberíamos 01:13:19
decir que literalmente aquí haya 01:13:21
un espacio para que lo respete 01:13:23
vale, hasta aquí, de hecho es el mismo 01:13:25
ejemplo de la semana pasada, hasta aquí más o menos 01:13:27
vais pillando cómo funcionan los strings 01:13:30
quedarse con que se 01:13:31
escriben con estos 01:13:33
ah, mira, alguien me lo había escrito 01:13:35
antes con estas comillas vale y es importante que lo interpreta como una 01:13:39
cadena de textos literal luego por otro lado existe un nuevo tipo 01:13:45
de caja que el otro día no hablamos que son las booleanas vale y una booleana 01:13:51
sólo puede guardar dos valores verdadero y falso vale una booleana cuando 01:13:54
generamos una variable pues será de tipo pool en este caso para que decir que es 01:14:01
una booleana, y aquí voy a poner semáforo encendido, ¿vale? 01:14:05
Y voy a decir por defecto que sea true o false, ¿vale? 01:14:12
Tiene dos variables, es decir, que estas booleanas, las booleanas, 01:14:18
se escribe así, pueden ser true o false, ¿vale? 01:14:23
Igualmente que siempre, cuando sabemos que algo es booleano, 01:14:27
si yo pongo un 5, no es la caja que corresponde y da fallo. 01:14:30
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, o lo que suele significar true, que está encendido, ¿vale? Que es verdadero esto que ocurre o es falso, ¿vale? 01:14:33
Lo mismo, esto en el tema, cuando hablamos de las variables, lo siguiente que pone aquí es booleanos. 01:14:50
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:14:57
Estas booleanas se usan mucho y por eso he puesto lo de semáforo, sirven para decir si algo está ocurriendo o no. 01:15:06
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:15:12
A veces podemos decir, oye, mientras el personaje tenga, y voy a poner indicador, en vez de semáforo, indicador máximo, vida. 01:15:24
¿vale? si yo empiezo 01:15:35
el juego con la vida llena 01:15:37
pues aquí estará true 01:15:38
y entonces mientras esto sea true, pues el power up 01:15:40
no se va a poder coger, porque no nos 01:15:43
interesa, ¿vale? ahora ya iremos 01:15:45
viendo con las, y esto está aquí 01:15:47
introducido, ¿vale? para que lo tengáis, con las estructuras 01:15:49
de control, con los ifs principalmente 01:15:51
pero hay más, ¿vale? iremos 01:15:53
diciendo, dando condiciones para que una cosa 01:15:55
se ocurra 01:15:57
o no ocurra, ¿no? entonces 01:15:59
en el momento que le demos un golpe 01:16:01
a este y baje a 25 01:16:03
cuando pongamos una condición 01:16:05
va a decir, vale, pues como baja de 25 01:16:07
y está comprobando que ya no es 100 01:16:09
esto va a decir, pues ya no es falso 01:16:10
no está con el indicador al máximo de vida 01:16:13
y entonces en ese caso sí que le permitirá 01:16:14
que cuando cojamos un power up de suma de la vida 01:16:17
para que pase de 25 01:16:19
hasta 75,5 01:16:21
¿vale? son como 01:16:23
ahí pone pues eso, conmutadores 01:16:24
interruptores, semáforos, ¿vale? 01:16:26
pues un semáforo puede estar encendido o apagado 01:16:29
¿vale? entonces 01:16:31
las booleanas van a ser sobre todo muy útiles en el momento de 01:16:33
pues de ir planteando ejecuciones e ir viendo si ciertas condiciones se van se 01:16:38
están cumpliendo no vale ya veremos ejemplos de esto también importante vale 01:16:44
en un de backlog si decimos que enseñe lo que guarda indicador máximo vida vais 01:16:49
a ver que lo que enseña vale en este caso es falso pues cuando ejecute el 01:16:53
juego, pues falso. Lo pone. No es una cadena de texto, es que no está cumpliendo la condición. 01:16:58
De hecho, internamente el código lo que está leyendo es que este valor vale o 0 o 1. Es verdad 01:17:07
que lo traduce en falso o verdadero, pero falso es 0 y verdadero es 1. De hecho, el otro día os dije 01:17:12
que si una caja, una variable, no se inicializaba, es decir, no se le daba un valor, por defecto valía 01:17:17
cero, o en el caso de los textos 01:17:25
vale nulo, no tiene contenido 01:17:27
entonces, si yo ahora 01:17:28
ejecuto este 01:17:31
debug log, como no tiene 01:17:33
nada en su interior 01:17:35
lo que va a mostrar es 01:17:36
falso, ¿vale? en realidad 01:17:38
es un cero, pero digamos 01:17:43
que la condición es falsa, que no es lo mismo 01:17:45
simplemente por ver que existe también 01:17:47
si ponemos true, ¿vale? pues lo que 01:17:49
va a enseñar es true 01:17:51
a ver, espera, ahí está 01:17:57
true, ¿vale? todos sabéis 01:17:59
leído aunque no lo hayáis empezado a hacer el enunciado de la tarea 0 y lo 01:18:01
que se quiere conseguir vale si no leerlo vale y lo entenderéis mejor lo 01:18:05
que voy a decir ahora pero como doy por supuesto que sí que lo habéis leído 01:18:12
porque es una de las cosas que os pedía para la tutoría de hoy vale 01:18:15
al final lo que queremos conseguir es y voy a abrir el código que lo tenéis 01:18:20
también y así lo podéis revisar más adelante pero lo pongo aquí vale era 01:18:23
conseguir que una nave espacial en la que van impactando meteoritos vaya quitándole escudo, 01:18:29
vida, por decirlo de otra forma, hasta que muere. Y este es el código, hay más formas de plantearlo, 01:18:36
pero es un código que resuelve el enunciado. Tenemos esta clase que se llama diagrama, 01:18:44
como se podría llamar juego nave, porque es descriptivo, y al final lo que estamos haciendo 01:18:49
es generar 01:18:55
un float con la energía del escudo 01:18:57
que empezará al máximo 01:18:59
ahora mismo vale 0 01:19:00
porque no lo hemos declarado solo 01:19:03
un número de vidas 01:19:05
porque el juego aparte de que muera la nave 01:19:07
va a haber varias vidas 01:19:09
pierdes una vez y te resta una vida 01:19:11
va a haber la vida de 100 a 0 01:19:13
por ejemplo y luego 3 vidas 01:19:15
luego la fuerza 01:19:17
del impacto que va a ir restando 2 vidas 01:19:19
cuando se choquen estos meteoritos 01:19:21
luego va a haber un booleano 01:19:23
un interruptor 01:19:25
como estábamos diciendo, que nos va a decir 01:19:27
si estamos vivos o no, que este interruptor 01:19:29
básicamente lo que va a hacer es 01:19:31
que mientras estamos vivos va a ser true 01:19:33
porque sí, estamos vivos, pero cuando 01:19:35
nos muramos va a decir 01:19:37
que es falso, que estamos muertos 01:19:39
básicamente, si lo traducimos a nuestro lenguaje 01:19:41
y en el momento en el que este interruptor 01:19:43
pasa a ser falso, es decir, que estamos muertos 01:19:45
pues el juego va a saber decir 01:19:47
va a entender ya el código que 01:19:49
pues oye, que el juego se ha acabado porque no estamos 01:19:51
vivos. Hemos perdido toda la energía y 01:19:53
también todas las vidas. Y luego aquí 01:19:55
hay un mensaje 01:19:57
que vamos a ir dando como 01:19:59
avisos en pantalla. 01:20:01
Si os fijáis, ya para ir 01:20:03
viendo una especie de ejecución 01:20:05
o de puesta en 01:20:07
algo menos 01:20:09
abstracto, ¿qué es esto? 01:20:11
Cuando iniciamos el juego, cuando iniciamos 01:20:13
el script, lo que vamos a hacer es, en ese momento 01:20:15
arranca el juego, arranca este script 01:20:17
y vamos a llenar las cajas que nos 01:20:19
interesan en este momento para darle un sentido 01:20:21
también al juego, hasta este momento 01:20:23
solo hemos generado espacios que rellenar 01:20:25
pero al empezar el juego nos decimos 01:20:27
oye, quiero que el escudo 01:20:29
de la nave sea de 100 01:20:31
¿vale? y como se va 01:20:33
a jugar con decimales 01:20:35
¿vale? pues lo hemos 01:20:36
planteado como un float ¿vale? 01:20:39
esto hay que tenerlo en cuenta como hemos visto después para 01:20:41
pues para ir 01:20:43
teniendo en cuenta problemas que puedan 01:20:45
surgir ¿vale? que suelen ser fáciles de corregir 01:20:47
pero oye, que nos pueden 01:20:49
traer de cabeza, pues tiende 01:20:51
vida, ¿vale? y aunque no ponga decimales 01:20:53
como es un decimal, es decir, es un float 01:20:55
mejor dicho, ya pongo la F, ¿vale? 01:20:57
si no la pongo 01:20:59
puede no dar problema, pero veis que 01:21:00
ser correcto tampoco 01:21:03
conlleva ningún 01:21:05
castigo, ¿vale? luego 01:21:07
al comenzar el juego, ojo, estamos 01:21:09
arrancando el juego y evidentemente 01:21:11
pues arrancamos vivos, si empezáramos muertos 01:21:13
pues ya sería mal asunto, ¿vale? 01:21:15
luego, las vidas 01:21:17
con las que arrancamos, ¿vale? igual que está la energía 01:21:19
pues tendremos tres vidas vale y luego veis que hay en el estar al arrancar una operación aquí 01:21:21
que es por como os he dicho antes como bueno en realidad lo pone aquí pero veis que se escribe 01:21:27
igual que el instante de antes es verdad que no hay nada dentro del paréntesis pero esto es un 01:21:34
método o una función vale los métodos y funciones vale al arrancar el juego pone quiero que haya un 01:21:38
impacto e impacto si yo voy a cualquier otro script vale si yo voy a leer 01:21:46
durante la tutoría que estaba haciendo ahora y en start yo pongo esto de 01:21:51
impacto veis que no existe no sale vale no 01:21:54
existe no es como instancia instancia siempre 01:21:59
existe yo pongo instancia y ahí está esperando 01:22:03
hay que poner su paréntesis y ahora que está y sí que obliga a que haya aquí 01:22:07
unos parámetros 01:22:11
como yo que sé 01:22:14
vamos a poner aquí, aunque dé fallo 01:22:16
pues vamos a poner, bueno no tenemos ninguno de tipo 01:22:18
objeto, no puedo poner ningún 01:22:20
parámetro aquí 01:22:22
porque va a dar fallo, porque nuevamente lo que nos 01:22:23
está pidiendo es un GameObject 01:22:26
lo que hemos visto antes 01:22:28
que la primera sobrecarga, su tipo 01:22:29
tiene que ser objeto 01:22:32
pero no sale el impacto, que os estaba diciendo 01:22:33
antes, ni bien ni mal 01:22:36
no puedo hacer nada, porque los métodos 01:22:38
Lo que vamos a empezar a hacer también es que los creamos nosotros, es decir, bajo un nombre que nosotros ponemos, ¿vale? Podremos ir, y veis que está aquí, meter nosotros nuestras operaciones dentro de un bloque, en este caso, fijaos que es largo. 01:22:40
Y este bloque lo que va a hacer, que llega hasta aquí, el bloque impacto, hasta aquí, todo esto es impacto, cuando yo ponga esta palabra, ¿vale? Se va a ejecutar lo que hay aquí dentro. 01:22:55
Entonces, vais a ver, y esto también es importante, que por primera vez, cuando llegamos a un punto aquí, ¿vale? Saltamos de aquí a aquí en la ejecución. 01:23:07
Luego irá el update, que también tiene su impacto. Pero primero estamos llamando a este impacto, salta aquí y se va a reproducir lo que hay aquí dentro. 01:23:17
¿Por qué instantiate sí existe? Y aquí existe, por ejemplo, si pongo el método instantiate, como os he dicho antes, impacto no existía en el otro lado. 01:23:28
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 MonoBehaviour, que os suene, que ya nos da operaciones prehechas. 01:23:39
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 Instantiate, vais a ver, a ver, me meto en esta, con el control volvemos a meternos, ¿vale? 01:23:54
pone objeto instancia es una de las que ha cargado ya en la librería vale hay otra clase en otro 01:24:17
sitio que está guardada en la librería unity engine que cuando empezamos cualquier juego 01:24:22
está aquí si yo por ejemplo intentará poner instancia como siempre ocurre y cualquier cosa 01:24:28
bueno en esta como no como no lo voy a rellenar no me va a dar fallo siempre pero fijaos que 01:24:35
Este instantiate funciona sin problema hasta que yo me cargo el, o lo comento mejor aún, comento el Unity Engine. 01:24:40
Y veis que instantiate junto a otras muchas cosas, fijaos en las clases, dejan de funcionar, ¿vale? 01:24:48
Entonces, tenéis que ir entendiendo que existen las clases y los métodos que ya existen 01:24:55
y luego los métodos que nosotros podemos ir haciendo para ir recopilando distintas acciones 01:25:00
y que cada vez que pongamos esta frase, pues, oye, haga todo esto. 01:25:04
si yo quiero poner impacto varias veces 01:25:07
en mi código, pues no tengo que escribir 01:25:10
todas estas líneas, ya está recogido 01:25:12
dentro de su propio bloque 01:25:13
¿hasta aquí qué tal? 01:25:15
bueno 01:25:20
te has quedado en lo de impacto, hasta aquí bien 01:25:20
sí, a ver, es que yo he estado 01:25:24
intentando hacerlo sin mirar esto que habías puesto 01:25:26
conseguí no dar ningún error 01:25:29
hasta lo de que me quedo sin escudo 01:25:31
que ya ahí colapsé 01:25:33
pero cuando meto el impacto no me lo 01:25:34
reconoce, me dice que no puedo hacer un boite 01:25:37
impacto, ya he entrado 01:25:39
ahí, me doy la tutoría 01:25:41
tranquilamente y supongo que 01:25:43
lo sacareis y no te pregunto 01:25:45
realmente todavía no hemos explicado 01:25:46
cómo se crea esto, es decir 01:25:49
todavía no he explicado cómo se crea esto 01:25:51
es decir, que estoy 01:25:53
más avanzada de lo que hemos explicado 01:25:53
entonces, ¿vale? así que bien 01:25:56
te quiero decir, solamente estoy 01:25:59
como dejando caer muchas veces que 01:26:01
cuando veamos una 01:26:03
orden de este tipo con mayúscula 01:26:04
y paréntesis, estamos llamando 01:26:06
un método y que hay métodos que ya vienen 01:26:08
prehechos, ¿vale? Por estas librerías 01:26:10
y otros que no, que los hacemos nosotros. 01:26:12
Ahora tenemos que aprender a hacerlos nosotros. 01:26:15
¿Vale? Pero hasta... 01:26:17
Aunque... 01:26:19
Aquí llegamos y lo que pone aquí, invocamos a la función 01:26:20
que realiza el impacto. Es decir, 01:26:23
que al empezar el juego, 01:26:24
estamos metiendo dentro de esta palabra impacto 01:26:26
pues que haya un impacto, 01:26:28
que es lo que vamos a hacer aquí. ¿Vale? 01:26:30
Vale. ¿Da igual ponerlo 01:26:33
antes del Void Start o después? 01:26:34
¿El impacto te refieres a esto? 01:26:37
Todo. O sea, las declaraciones de las variables. 01:26:38
Vale. Las variables, cuando son globales, ¿no? Como hemos dicho antes, pueden ir aquí o pueden ir al final. 01:26:42
Y vais a ver que cuando las pongo al final, ¿vale? Dentro de la clase, pero al final todo funciona. 01:26:50
¿Por qué? Porque está dentro de la clase. 01:26:56
Entonces, todo lo que se va metiendo en bloques inferiores, pues puede acceder a estas clases. 01:26:59
pero sí que es verdad que es mucho más intuitivo 01:27:04
y es la convención aparte 01:27:07
que esto vive mucho de convenciones 01:27:09
de que todas las, incluso aunque luego 01:27:11
sigamos picando código aquí abajo y queramos 01:27:13
crear una nueva variable, si queremos 01:27:15
que sea global de toda la clase, subimos 01:27:17
y la ponemos aquí, porque así 01:27:19
de un vistazo rápido 01:27:21
tenemos todas las que son globales ya 01:27:22
englobadas, se puede mientras 01:27:25
esté dentro del bloque 01:27:27
correspondiente a donde queremos que funcione 01:27:29
que por eso he explicado lo del encapsulamiento 01:27:31
funcionaría, pero la convención dice que 01:27:33
lo hagamos aquí, ¿vale? De hecho hay 01:27:36
más convenciones, ¿vale? Porque ahora mismo 01:27:38
todas son private y a 01:27:40
veces iréis incluso viendo 01:27:42
o que 01:27:43
hay gente que dirá, siempre que creo una variable 01:27:45
private empiezo con una barra baja 01:27:48
para que así al ir cambiándolo 01:27:50
en el código, ¿vale? Saber 01:27:52
que es una variable privada, que no 01:27:54
la voy a declarar mediante el inspector, sino 01:27:56
que la voy a ir declarando yo siempre a mano 01:27:58
en el código, porque no se puede ir al 01:28:00
editorio Unity y cambiarlo si es privada, ¿no? 01:28:02
Luego hay gente, lo digo 01:28:04
por si encontráis, que siempre que haga 01:28:05
una variable global, le pone 01:28:07
m barra baja, vamos, habría 01:28:09
que ponerlo en todas, y todas las que va generando 01:28:12
dentro de métodos 01:28:13
o de niveles inferiores, como este int, por ejemplo, 01:28:16
pues va sin la barra baja. 01:28:18
Y esto sirve para saber cuáles son variables globales 01:28:20
y distinguirlas de las que no. Pero esto 01:28:22
ya son convenciones que van más adelante, 01:28:23
es decir, que vamos primero a lo básico. 01:28:26
Vale. Gracias. 01:28:28
Nada, perdona, que sé 01:28:30
Que me preguntas una cosa y te correspondo con tres. 01:28:31
No, no, no, no pasa nada. 01:28:34
Pero es que así van sonando las cosas. 01:28:35
Vale. 01:28:37
Entonces, se puede declarar incluso, fíjate, ¿vale? 01:28:38
La quito de aquí, pero aquí dentro, ¿vale? 01:28:43
Digamos que aquí hay un bloque que se cierra aquí y aquí empieza otro. 01:28:46
Es decir, si lo declarara aquí en medio, también lo estoy declarando dentro de la clase y no da problema. 01:28:49
Pero claro, tú cuando luego quieras descubrir dónde están las variables de toda la clase, 01:28:54
como empieces a no organizarlo bien, te vuelves loco. 01:28:58
Por eso, justo debajo de clase, las que son variables globales se declaran y además si trabajas en un equipo, pues todos saben dónde está la variable globales y todos están contentos de encontrarlo rápido. 01:29:01
Hay gente que lo pone al final por lo mismo, porque saben que están al final de la clase y lo encuentran antes. 01:29:13
Pero como luego dentro de un mismo script se pueden crear varias clases, que esta es otra cosa, se crea la clase a continuación y si lo pones justo debajo de donde se declara, pues más claro, el mejor sitio, vaya. 01:29:19
Vale, hasta aquí más o menos me vais siguiendo, ¿no? Más o menos. Vale, voy a seguir unos 10 minutillos más o 20, ¿vale? Pero voy a ver porque a veces me escriben las dudas aquí y necesito verlo por mi cuenta. 01:29:32
Vale, en las variables también habla de arrays, esto es más avanzado, pero es simplemente para que también os suene un array, que a veces se puede llamar matriz o arreglo, se pueden dentro de una sola caja meter muchos tipos de datos. 01:29:54
Y de hecho, un array, para que os hagáis cuenta, cuando metemos, aunque no está declarado específicamente, 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:30:13
Como os he dicho antes, se están guardando un montón de valores, ¿vale? 01:30:36
Al final esto, si habéis estudiado matrices en matemáticas, esto es un poco parecido a una matriz. 01:30:39
Es decir, que hay muchas posiciones de esa variable, ¿vale? 01:30:44
Que os suene. 01:30:47
Esto es más avanzada, así que me lo salto ahora mismo, ¿vale? 01:30:49
Ya tendrá más sentido más adelante. 01:30:51
En esta sección, voy un poco en el orden ahora para ir resolviendo dudas. 01:30:54
Aquí veis lo que acabamos de hablar, de cómo se declaran las variables, 01:30:58
un poco inconvenientes que se pueden encontrar, etc. 01:31:01
Y hay otras, digamos, instrucciones importantes, 01:31:07
otros operadores también, que son estos que tenemos aquí. 01:31:12
Estos son bastante importantes porque se usan de vez en cuando 01:31:15
y si no, pues de pronto saltáis esto porque no parece importante, 01:31:18
pero sí lo es. 01:31:23
Pone el truco de programador como un extra, 01:31:24
pero no es un extra, es importante. 01:31:26
Es los operadores más más, los operadores menos menos, más igual y menos igual. Me quedo en estos. Hoy no voy a avanzar más de aquí, de las variables y lo que hemos ido viendo de otras cosas. 01:31:27
En las variables acabamos de decir que existen estos operadores. Lo dejo aquí. El más más y el menos menos. A ver, me voy al de durante la tutoría. 01:31:44
Y voy a simplificar un poco esto. 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, para hacerlo más simple. 01:31:54
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. 01:32:06
vale eso qué significa que a veces hacemos lo que se llaman bucles vale si vais más adelante se habla 01:32:17
del ford del wild del wild bueno hay varios más avanzado también pero que lo que van haciendo esos 01:32:23
bucles es ir recorriendo varios elementos y esos elementos van digamos siendo posiciones pues por 01:32:32
ejemplo imaginaos por decirlo así vemos el típico ranking de una recreativa antigua vale lo pongo 01:32:41
aquí ranking recreativa a ver si sale lo que yo quiero que salga que no lo sé imágenes vale lo 01:32:47
típico lo mejor es 5 resultados vale y esta va a ser la primera posición la segunda tercera cuarta 01:32:55
la quinta y ya no existen más entonces habrá un momento que nos va a ir interesando que vaya pues 01:33:00
eso muestra la 1 cuando muestra la 1 muestra la 2 cuando muestra la 2 muestra la 3 veis que va 01:33:06
sumando progresivamente. En ese momento se usa este operador 01:33:11
más más, ¿vale? Que es una forma de simplificar 01:33:15
que sumamos 1 01:33:18
a la variable, ¿vale? 01:33:23
¿Esto qué significa? Que si yo ahora mismo pongo aquí vida, 01:33:27
¿vale? ¿Qué me va a mostrar en consola? 01:33:31
27, no, 26. A ver, lo pongo, vale 25, 01:33:40
le sumo 1 y 26 01:33:43
vale, vamos a ello 01:33:46
26, perfecto, vale 01:33:46
esto luego habrá otras operaciones que puede sumar 01:33:51
más más 5 veces, porque digamos 01:33:54
que 5 veces, pues irá pasando 01:33:56
por las 5 posiciones para mostrar ese ranking 01:33:57
vale, es un operador muy importante 01:34:00
si pones 4 más eso 01:34:02
más 2, no, no 01:34:04
pregunto, no, no, no 01:34:05
si voy poniendo más 01:34:07
se vuelve loco, da fallo, vale 01:34:08
vale, esto es lo mismo 01:34:11
Y esto es otra sintaxis que suele dar problema al principio, ¿vale? Que esto mismo es la forma resumida de escribir esto, ¿vale? Y vais a decir, esto no tiene mucho sentido. Bueno, hasta que lo tenga, ¿vale? Esto y esto es exactamente lo mismo, ¿vale? 01:34:13
Y vais a decir, ¿cómo vida es igual a vida más uno, no? Si lo pensamos en álgebra humana, eso no tiene sentido porque estamos pensando como pensarían las matemáticas, ¿no? Las ecuaciones. 01:34:32
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 uno. 01:34:43
Entonces, esto significa que lo que hay en esta caja es igual a lo que guarde la caja. 01:34:54
Aquí está refiriéndose a abrir la caja y aquí se está refiriendo al contenido de la caja. 01:35:00
Aquí siempre hablamos de declarar la variable o llamar a una variable e inicializarla o cambiar el valor. 01:35:05
El igual no es igual, no es un igual de matemáticas, es un asignador. 01:35:10
Entonces, vida es igual a vida más uno. 01:35:15
Es decir, en esta caja vamos a guardar lo que valga vida más uno. 01:35:17
Y si volviéramos a poner aquí vida, pongo otra vez esta línea, ¿vale? Cuando yo muestre otra vez la misma instrucción, no son lo mismo, ¿vale? ¿Qué pensáis que va a poner ahora en la consola? 01:35:20
Lo mismo, 26. 01:35:36
Aquí 26, ¿vale? Pero estoy diciéndole otra vez, recordad, esta... 01:35:39
¿Y te coge la segunda orden que estás dando el resultado de la primera y no el resultado del que has declarado? 01:35:44
Vale, ahora lo explico. Simplemente lo voy a enseñar para que me creáis y luego os lo explico. 01:35:51
Esto es bastante simple y a la vez bastante complicado. Veis que pone 26 y 27. 01:35:57
Volvemos a lo del encoapsulamiento y cuando se declaran las variables. 01:36:03
Tenemos una variable global aquí arriba, con su caja, y la inicializamos con 25, 01:36:07
como podría ser con cualquier valor. 01:36:13
Y vamos aquí y decimos, vale, en vida, igual que antes decíamos ahora vale 70, 01:36:15
y lo decíamos así a las bravas, entonces aquí en señal 70, 01:36:21
esto lo vimos el otro día y lo hemos visto antes también, 01:36:24
quiero que sea lo que vale vida más 1. 01:36:27
Y aquí lo que está haciendo es coger, todavía no lo hemos asignado, 01:36:30
está abierta la caja y aquí hacemos la asignación. 01:36:34
está volviendo a donde se declaró la variable, coge este valor, le suma 1 y lo guarda en vida. 01:36:36
Vale, y lo lee de arriba a abajo y por eso suma 2. 01:36:44
Y aquí lo aguarda como vida. 01:36:46
Pero es que cuando volvemos a esta caja, vuelve a abrir la caja y aquí ya no vale 25 a estas alturas, vale a 26. 01:36:48
Vale. 01:36:53
Y le sumamos 1. 01:36:54
Y así progresivamente, es decir, si yo empezara a hacer esto, pues sería 26, 27, 28, 29, ¿vale? 01:36:56
que es lo mismo, ¿vale? 01:37:02
os lo vuelvo a decir, en vez de escribir todo esto 01:37:05
es lo mismo que decir esto 01:37:07
es a la caja, súmale uno 01:37:08
¿vale? es exactamente lo mismo 01:37:11
vale, pero si lo quisiera 01:37:13
mencionar en otra caja 01:37:15
que se vinculara con los 26, sí que le tendría 01:37:17
que asignar como otro nombre a vida 01:37:19
para que la otra cápsula te lo 01:37:21
reconociera por 26 en vez de por 25, ¿o no? 01:37:23
no, aquí lo que va 01:37:26
haciendo, claro, tú me estás hablando 01:37:27
de abrir otra variable distinta 01:37:29
Claro, si tú abres otra variable, pues esto se llamará muerte, no sé, y esto tendrá otro valor. Es decir, vida y muerte son distintos. Es decir, si yo aquí digo muerte y le pongo 800 por poner un valor muy distinto, aquí es que muerte no está cambiando en ningún momento. 01:37:31
Es verdad que yo puedo ir aquí y decir muerte. Y aquí me va a enseñar vida 25 más 1, 26. Ha guardado 26 en la caja en este momento. Ahora vuelvo aquí, que ya vale 26. Estoy llamando a la caja. 26 más 1, 27. En este momento va a enseñar 27. 01:37:51
¿vale? vuelvo a llamar 01:38:09
a la caja vida, he guardado 27 01:38:11
aquí antes, ¿vale? 27 más 01:38:13
1, 28, en este momento 01:38:15
la caja vale 28 y aquí enseñará 28 01:38:17
y aquí valdrá 29 01:38:19
pero aquí no va a enseñar 29 01:38:21
porque es que lo que le estoy diciendo que enseñe no es 01:38:23
vida, no es lo que hay en la caja vida 01:38:25
es la caja muerte, entonces va a enseñar 01:38:27
26, 27, 28 y 800 01:38:29
vale, pero si yo lo pusiera 01:38:31
fuera de esas llaves 01:38:33
sí que tendría que 01:38:35
declarar de otra manera la vida 01:38:37
más uno para que me lo reconociera 01:38:39
porque estaría fuera de todas 01:38:41
estas llaves, no sé si me explico 01:38:43
claro, pero tú donde has declarado la variable 01:38:45
es a comienzo, es global 01:38:47
entonces se va a poder usar en toda 01:38:49
la clase, sin problema 01:38:51
el problema viene 01:38:52
de que yo 01:38:55
la declaro aquí 01:38:56
como está en el ámbito, aquí sí que funciona 01:38:58
¿no? pero si yo luego en el 01:39:01
update pongo 01:39:03
vida, pues es lo de antes 01:39:05
aunque yo ponga vida más uno 01:39:07
es que no sabe que es vida 01:39:09
porque está fuera de su ámbito 01:39:11
¿vale? 01:39:12
sin embargo muerte sí 01:39:14
porque muerte está aquí 01:39:16
muerte se va a poder poner 01:39:17
muerte es igual a 55 01:39:18
¿vale? 01:39:21
o mejor aún, mira 01:39:24
¿sí? ¿me vas siguiendo? 01:39:25
01:39:27
vale, o mejor aún 01:39:28
voy a comentar esto 01:39:29
para que en el start no haga nada 01:39:32
y no salgan muchos numerajos 01:39:33
pero imagínate que en el update 01:39:35
que recuerda que se va planteando en cada fotograma, quito lo de muerte 55, 01:39:37
digo que cada fotograma me enseñe lo que vale muerte, que esto por ejemplo puede servir para un contador. 01:39:44
Aquí, muerte. ¿Qué crees que va a pasar? Como la he declarado arriba, como es global, 01:39:51
puedo hablar de muerte de esta variable en cualquier lado, ¿qué va a ir pasando? 01:39:59
que va a sumar 801, 802, 803 01:40:03
porque lo has puesto 01:40:07
en el que se va cargando por fotograma 01:40:08
exacto, empieza valiendo 01:40:11
800, en el fotograma siguiente le digo 01:40:13
ojo, súmale 1 y me lo enseñas 01:40:14
y aquí guarda 801 01:40:16
porque está fuera del update 01:40:18
en el siguiente, 801, súmale 1 01:40:19
vale, pues enseñará 802 01:40:23
y guarda 802 01:40:24
y ahora vas a ver que tenemos como una especie de contador 01:40:26
muy poco refinado 01:40:28
pero vas a ver que cada fotograma 01:40:30
Espera, ¿verdad? 01:40:33
Sí. 01:40:34
¿Vale? 01:40:35
Ahí. 01:40:36
Pues va a ir sumando. 01:40:37
Cada fotograma que por segundo se ejecuta mucho fotograma, ¿vale? 01:40:38
Por eso va como a saltos. 01:40:41
Pero sí que se están planteando, ¿vale? 01:40:43
¿Ves que van sumándose? 01:40:47
Sí. 01:40:48
¿Vale? 01:40:48
Que no va de uno en uno. 01:40:49
Bueno, si vas parando sí van de uno en uno, 01:40:50
pero se ejecuta más rápido del uno en uno. 01:40:52
¿Vale? 01:40:55
Entonces, pues mira, por ejemplo, una aplicación práctica. 01:40:55
Pues para hacer un contador, pues mira, el más más puede servir. 01:40:58
Y lo mismo. 01:41:01
Esto es igual a muerte más uno. Es exactamente lo mismo. Va a dar el mismo resultado. Si quieres lo comprobamos, pero te lo digo yo. 01:41:01
Sí, sí, lo da. 01:41:09
Vale. Y, vale, muerte más uno. Vuelvo aquí a los apuntes. ¿Vale? Este operador, importante que sepáis cómo... Bueno, esto lo apago, que ya está aquí usado. 01:41:09
¿cuántas cosas? ¿vale? 01:41:20
y esto también, esto que estoy poniendo 01:41:23
de vida más 01:41:26
vida igual, vida más uno 01:41:27
también se puede poner con otra forma resumida que son estas 01:41:29
¿vale? bueno, ojo 01:41:32
no he puesto el menos menos, pero el menos menos lo que va haciendo 01:41:33
es restar uno, ¿vale? cada vez que se invoque 01:41:36
igual, si queréis hacemos las pruebas 01:41:37
pero por no perder tiempo 01:41:39
pero existe el más igual y el menos igual 01:41:41
¿vale? si yo voy al más igual 01:41:43
lo que se puede hacer 01:41:46
es para no tener que repetir, que incluso es 01:41:48
La confusión que nos viene siempre, en vez de poner muerte igual a muerte más 1, cuando se va a hacer una operación sobre la misma variable, sobre la propia variable, se puede hacer igual más 1. 01:41:50
¿Y esto qué significa? Que muerte pasa a valer lo que valga más 1 o más 7 en este caso. 01:42:02
Ahora se van a ir sumando de 7 en 7. Va a ir 807, 814 y cada fotograma va a ir enseñándolo. 01:42:10
vale, ¿por qué no lo está haciendo bien? 01:42:17
pues por una cosa muy simple 01:42:23
que es que he puesto igual más 01:42:24
no más igual, ¿vale? importante 01:42:26
he puesto igual más 01:42:28
y la operación es 01:42:31
más igual 01:42:32
ahora mismo esta línea como no tiene sentido 01:42:33
¿vale? le estaba diciendo 01:42:37
que era un 7 positivo básicamente 01:42:39
entonces siempre vale 7, que no es lo mismo 01:42:40
que cada vez que dé una vuelta 01:42:42
en este caso vaya sumándole 7 01:42:44
ahora sí que va a ir 01:42:46
800, 800, 7 01:42:48
va a ir, lo paro porque si no esto 01:42:50
se vuelve loco 01:42:52
vale, 807, va sumando 01:42:54
7 en cada ocasión, que es la cifra que hemos 01:42:56
puesto, vale 01:42:58
si aquí lo pusiéramos con el 01:43:00
menos, aquí lo bueno es que podemos determinar 01:43:03
que sean saltos más allá del 1 01:43:04
vale, porque en el más más sí que es 1 01:43:06
por ejemplo, aquí también podríamos poner 7 01:43:08
por ejemplo, si aquí 01:43:10
ponemos que vaya restando 1 en cada fotograma 01:43:12
pues será 01:43:19
lo paro y voy para arriba para ver lo que ha hecho 01:43:19
va restando uno en cada vuelta 01:43:22
¿vale? 01:43:27
eso es importante, ¿qué tal hasta aquí? 01:43:29
bien 01:43:31
más o menos, ahí va 01:43:32
para el próximo día 01:43:34
me quedo con 01:43:37
esto siguiente, con el último ¿vale? 01:43:38
esta página más o menos estaría vista 01:43:41
falta de los arrays, que los arrays 01:43:42
lo vemos poco después 01:43:45
y tardaré un poco en hablar de ellos 01:43:46
pero aquí hay otra línea 01:43:49
que sirve para invertir booleanos 01:43:50
Pero bueno, ya lo veremos cuando veamos la aplicación más aplicada, por decirlo así. 01:43:52
Entonces, hasta aquí que esta página más o menos la deberíais ir ya entendiendo. 01:43:59
Entonces, hay una última cosa que quiero que sepáis, que es, que antes lo hemos visto, que es, por un lado, 01:44:06
que cuando tenemos algún, a ver, que lo voy a tener que crear porque no lo tengo, 01:44:14
Cuando tenemos algún valor público o con serialize fill, como aquí, es decir, que lo asignamos, lo podemos asignar por el editor, como hemos hecho, pero en este caso es un número, yo aquí le he asignado 800 y esto lo voy a comentar para no complicarlo más. 01:44:17
Yo aquí le estoy diciendo que esto vale 800 01:44:38
Y yo voy 01:44:41
Y voy al script durante la tutoría 01:44:42
Y vale, pone 800 01:44:44
Y yo le digo, bueno, no, 800 no 01:44:45
950 01:44:48
¿Vale? 01:44:51
Es verdad que aunque, bueno, espera 01:44:52
Y en el start voy a decir que me enseñé 01:44:54
Que está guardando muerte 01:44:56
Porque si no, no sabemos que está interpretando 01:44:58
Internamente el 01:45:00
El programa 01:45:02
¿Vale? Cuando empiece el juego, enséame lo que vale muerte 01:45:04
Y aquí yo he inicializado muerte, pone 800, lo lógico sería que pusiera 800, ¿vale? Que era el problema que estaba dando antes. Yo cuando voy y arranco el juego, ¿qué es lo que me pone? 950, ¿vale? 01:45:06
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. 01:45:20
Aquí, si no lo tuviera serializado y lo cambiara, lo que me va a enseñar es 1000, 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:45:33
Entonces, lo que me va a enseñar es 1000. 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. 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? 01:45:49
Como yo he cambiado el juego y le he dicho al arrancar la ejecución, ponmelo en 1000, ¿vale? 01:46:14
Sobrescribe al empezar el juego, en un momento de ejecución, lo que yo ya he hecho tanto en la declaración inicial, ¿vale? 01:46:20
Como en la sobrescriptura que tenemos aquí, que sí que es verdad que si no hiciera nada más, ¿vale? 01:46:27
Como no hay un momento de ejecución, no hay un momento en el que lo vuelve a cambiar. 01:46:32
Pero tened ojo con que a veces poner aquí las instrucciones puede dar este tipo de problemas, que hay un orden de ejecución, ¿vale? 01:46:35
ya os iréis pegando con ello 01:46:42
no sé si me vais siguiendo pero eso 01:46:44
aquí al inicializar pues damos un valor 01:46:46
pero luego hay momentos de ejecución 01:46:48
con el start y el update 01:46:50
que pueden ir sobre escribiendo valores 01:46:52
pero este serialize field 01:46:54
perdonad por el joder 01:46:58
y el public 01:46:59
también se puede variar dentro 01:47:00
del propio 01:47:02
del propio 01:47:04
script y de hecho para que os hagáis 01:47:06
una idea yo aquí 01:47:08
pongo 01:47:10
serializar 01:47:11
el campo 01:47:13
lo inicializo como 800 01:47:15
al empezar lo pongo en 1000 01:47:17
y quiero que la muerte 01:47:19
me lo vaya enseñando en el update 01:47:21
que cada fotograma me vaya enseñando esta cifra 01:47:23
y guardo, y vais a ver que pasa una cosa 01:47:25
que mezcla todo esto 01:47:27
que acabo de decir 01:47:29
yo arrancaré el juego 01:47:30
al arrancar se me pone en 1000 01:47:32
sobre escribiendo esto que está en 1132 01:47:34
a ver, placa 01:47:37
se pone en 1000 01:47:39
Y vale, pues 1000 01:47:40
Me lo ha puesto 1000 incluso aquí 01:47:42
Pero cuando yo ya he arrancado el juego 01:47:43
Como digamos que esta orden ya se ha ejecutado 01:47:45
Y no lo va a sobreescribir 01:47:49
Al final lo que va a importar es 01:47:50
Lo que yo vaya poniendo aquí 01:47:52
Y veis que va cambiando el valor 01:47:53
Y podría ir cambiando desde el editor a mano 01:47:55
Ciertos valores 01:47:58
¿Vale? Que os suene 01:47:59
¿Pero para qué? 01:48:01
Pues por ejemplo, imagínate que quieres probar 01:48:03
Hacia donde se mueve una nave 01:48:06
De una forma intuitiva 01:48:07
Porque tú cuando arrancas el juego 01:48:09
No puedes cambiar el código 01:48:12
El código, digamos que una vez arranca 01:48:13
No se puede cambiar 01:48:15
Pero nos puede interesar probar cosas 01:48:16
Que sí que se ejecutan durante el juego 01:48:18
Como esto 01:48:21
Pero luego lo tendrías que cambiar en el código, ¿no? 01:48:21
Es que estoy cambiando el código, aunque no lo parezca 01:48:24
O sea, aunque no salga en el CESAR 01:48:26
Es como si estuviera cambiando, ¿no? 01:48:28
Claro, yo con este serialize field 01:48:30
Estoy accediendo a esta variable en todo momento 01:48:32
Y siempre y cuando sea 01:48:34
En un momento de ejecución 01:48:36
que se pueda ver cómo voy cambiando 01:48:37
el valor de muerte, yo en todo momento 01:48:40
tengo abierta esta caja. En vez de cambiarlo 01:48:41
como aquí, lo estoy cambiando, pero por el 01:48:43
editor, en vivo. 01:48:45
¿Vale? Yo lo que vale 01:48:48
muerte, lo estoy cambiando ahora mismo. 01:48:49
En este mismo instante, muerte 01:48:51
no vale ni 800 ni 1000, vale 01:48:53
1657. 01:48:55
Ya lo iréis viendo. Mira, en el siguiente 01:48:57
tema ya, de hecho, tiene aplicaciones, así que 01:48:59
ya lo veréis. ¿Vale? E importante, 01:49:01
si en algún momento queréis ir 01:49:04
viendo cómo va, pues por ejemplo, lo 01:49:05
del más uno que va cada fotograma aquí vais yendo fotograma fotograma aquí da igual porque mira 01:49:07
cómo está parado el juego si yo ahora cambio a 1896 al ir al siguiente fotograma por 1896 vale 01:49:13
que en ocasiones puede que queramos ir viendo qué va pasando cada fotograma en vez de aquí 01:49:21
una sucesión de elementos pues continua vale que se puede detener el juego y se para ahí y 01:49:26
Y podemos seguir fotograma a fotograma ejecutándolo. 01:49:33
Y ya, última cosa. 01:49:36
Bueno, hasta aquí qué tal, más o menos. 01:49:38
Sé que son muchas cosas, pero bueno, 01:49:39
veis que están escritas en el tema también. 01:49:41
Y en los vídeos de Álvaro Holguera también se ven ciertas cosas 01:49:43
que estoy hablando aquí. 01:49:46
Esto es un mejunje de cosas, 01:49:48
pero que poco a poco iréis asimilando. 01:49:50
Al menos los que vayáis siguiendo las clases. 01:49:54
Hay una última cosa muy importante, 01:49:57
que es que cuando vayamos cambiando cosas en vivo 01:49:59
yo puedo decir, yo arranco el juego y se me ponen 1000 siempre 01:50:03
y aquí empiezo a guardar 01:50:06
y vais a ver que yo cuando detengo el juego 01:50:09
me vuelve al otro valor que estaba guardando antes de empezar 01:50:11
por ejemplo, 500, arranco el juego 01:50:14
se va a sobreescribir a 1000, que es lo que hace al arrancar el juego 01:50:17
y me pongo a cambiar esto a 192 01:50:20
y por lo que sea yo quiero que en 192 01:50:23
se deje aquí sobreescrito el valor 01:50:25
Veréis que cuando yo detenga la ejecución del juego, vuelve a 500, que es el que yo había metido a mano. 01:50:29
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:50:35
Tengo aquí colocada la nave y quiero que se mueva, y lo voy a ir cambiando en tiempo real, en estas coordenadas. 01:50:42
Quiero cambiarlo en estas coordenadas. 01:50:48
Todos estos cambios que yo voy haciendo, imaginaos que yo hay un momento que voy a decir, quiero que la nave se quede aquí. 01:50:50
que la he ajustado, pero como estoy en ejecución 01:50:58
durante la ejecución 01:51:01
los cambios que vayamos haciendo solo funcionan 01:51:02
durante la ejecución, cuando yo pare 01:51:05
vuelve a los valores 01:51:07
que tenía antes de la ejecución 01:51:09
por tanto, cambios que hagamos en vivo 01:51:10
que en el siguiente tema vamos a hacer 01:51:12
cuidado que se hacen 01:51:14
y no se guardan 01:51:16
por eso veréis que cuando yo le doy 01:51:18
al play, se oscurece un poco el área 01:51:21
se oscurece un poco el entorno 01:51:22
indicando que estamos dentro 01:51:25
de la ejecución y un poco advirtiendo que el cambio que hagamos en los parámetros, pues no se guardan, ¿vale? 01:51:27
Último consejo. Para cambiar este color y que sea aún más obvio cuándo podemos o no cambiar los elementos 01:51:33
sin que se guarden, ¿vale? Dentro de Edits hay una pestaña de Preferencias. Creo que siempre confundo estas dos. 01:51:39
En preferencias, edit preferencias, están los colores del sistema. Ya hay uno bastante interesante de modificar, que yo ya lo haría, y esto se guarda siempre que no instaléis otra versión de Unity o vayáis a otro ordenador, etc. 01:51:48
Es decir, entre distintos juegos incluso que uséis la misma versión de Unity se va a mantener, en vez de decirle que sea el tintado de este gris tan sutil que tenemos, lo podemos exagerar a un rojo de warning. Cuando lo tengamos ahí configurado, el Play Mode Tint, el tinte de modo de juego, ahora cuando ejecutemos el juego vais a ver que se tiñe de otro color. Lo podéis poner más o menos llamativo. 01:52:05
ahora, todo cambio que vayamos haciendo 01:52:28
mientras estemos en este modo 01:52:30
sabemos que 01:52:31
cuando detengamos la ejecución del juego 01:52:34
placa, no ha servido para nada 01:52:36
excepto a lo mejor para tener clara 01:52:38
la referencia de donde queremos ubicar algo 01:52:40
en este caso, etc 01:52:42
entonces es importante que a lo mejor 01:52:43
cambies ya 01:52:46
en edit 01:52:47
preferencias, este color 01:52:49
ponerlo en algo intermedio 01:52:51
no tan rojo saturado, porque al final 01:52:54
este color se añade al que tiene ya la interfaz 01:52:56
pues yo que sé, algo así rosadito 01:52:58
y cuando le deis pues ya 01:53:00
os marca que estáis como en 01:53:01
momento warning 01:53:03
bueno, sé que os he dicho muchas cosas 01:53:04
la grandísima mayoría 01:53:09
están en los apuntes realmente 01:53:11
de una forma quizá menos desarrollada 01:53:13
claramente, pero bueno 01:53:15
que 01:53:17
espero que poco a poco vayáis teniendo 01:53:18
un poquito más de información y la vayáis 01:53:21
ubicando bien 01:53:23
Subido por:
Daniel M.
Licencia:
Todos los derechos reservados
Visualizaciones:
98
Fecha:
15 de octubre de 2024 - 12:48
Visibilidad:
Clave
Centro:
IES CIFP a Distancia Ignacio Ellacuría
Duración:
1h′ 53′ 30″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
698.12 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid