Tutoría 1 - DEIM - UT1 y 0 - Curso 23·24 - 16 Noviembre - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Tutoría de DEIM donde nos enfocamos en consejos para resolver la tarea de la UT1
Bueno, pues bienvenidos a esta primera tutoría. Como os estaba comentando, para aquellos, estaba
00:00:00
hablando un poco con los compañeros, para aquellos que lo estáis viendo en diferido, etcétera,
00:00:06
por favor, este módulo lo aconsejo en todos, pero en este módulo especialmente os sugiero que vayáis
00:00:10
un poco con el tema realidad a medida que se van proponiendo las tutorías para ir viendo los
00:00:18
errores o los problemas o todo lo que os suponga un problema de comprensión, digamos en el momento,
00:00:23
porque vamos al concepto de programación y va a ser, bueno, pues quien no haya programado nunca
00:00:30
pues tiene que irlo asimilando poco a poco y es un poco el recorrido que vamos a hacer estos meses.
00:00:35
Bueno, en la anterior tutoría inicial ya se habló de cómo instalar Unity, el Unity Hub,
00:00:40
el Unity Editor, un poco los paneles, esa parte la voy a dar un poco por supuesta y voy a proceder
00:00:48
un poco a ir resolviendo dudas de la tarea 1, especialmente a partir de cuando entramos en el
00:00:54
código que es al instanciar. Voy a compartir pantalla. Entiendo que veis el Unity Editor, ¿verdad?
00:01:01
Si me podéis confirmar, porfa. Sí, vale, genial. Vale, en esta práctica hay una parte que a no ser
00:01:11
que tengáis problemas claros, no me voy a meter mucho, que es la creación del prefab, porque creo
00:01:19
que está suficientemente bien explicada dentro de las dudas que os puedan surgir, que por favor si
00:01:26
tenéis alguna me vais diciendo. Sí que hay un concepto, que es el de prefab, que yo tengo aquí
00:01:32
por ejemplo preparada mi nave, que quizá cuando vais siguiendo un poco las instrucciones pues
00:01:38
o pasáis por alto, porque también es normal, o que pueden generar dudas. Al final un prefab
00:01:44
no deja de ser un objeto, como se explica, que está guardado para poder ser reutilizado en
00:01:50
distintas partes de proyectos o instanciado. Instanciado es generar copias de un mismo objeto.
00:01:57
Y lo voy a usar de referencia en varios momentos. Por ejemplo, si en un videojuego, y perdonad que
00:02:05
remita a videojuegos violentos, pero es que suelen abundar mucho, cuando disparamos una bala con la
00:02:10
metralleta, imaginaos que cada bala es un objeto, que ese proyectil va volando por el aire. Bueno,
00:02:16
pues tenemos ya un prefab de esa bala y lo que vamos haciendo es lanzar copias de esa bala,
00:02:22
de una única bala. A lo mejor tenemos prefabs de bala de jopeta, bala de metralleta, yo que sé,
00:02:26
pero al final, a menos que lo hagamos con otra finalidad, va a ser ese prefab que se va duplicando.
00:02:32
Como hemos visto los prefabs, y tengo aquí uno preparado en el panel de proyectos y lo puedo
00:02:39
importar, meter en el proyecto, incluso meterlo dentro de la jerarquía, vais a ver que viene
00:02:45
marcado con este texto azul, con la cajita azul. En el panel proyecto vais a ver, normalmente,
00:02:49
ya la geometría del prefab. Por ejemplo, aquí veis la nave. Y atención, porque aquí podemos
00:02:57
hacer zoom y hay una forma, que no es que haya un menú de ver en modo lista ni en modo visualización,
00:03:01
que es que si quitamos todo el zoom, vamos viendo los elementos con iconitos y en listado, que a
00:03:07
veces es más interesante para saber de qué se trata cada elemento. Al ver esta caja azul sabemos
00:03:13
que es un prefab y lo tenemos ahí preparando. Y habéis visto que yo puedo empezar a meter aquí
00:03:18
el prefab 85 millones de veces. Lo podemos tener aquí para hacer un escuadrón. No sé si ahora
00:03:24
habéis visto el típico juego que hay de alguien que va corriendo y va pasando por un más 10, por 2
00:03:30
y se va multiplicando. No, eso al final son que se van instanciando más o menos prefabs a medida que
00:03:38
se van cumpliendo ciertas condiciones. Bueno, una vez dicho esto, algo importante y me
00:03:43
vuelvo a referir a la bala de la escopeta. Imaginaos que ahora en vez de la nave es una escopeta. El
00:03:48
prefab cuando lo generáis, que lo podéis ir generando, como ya habréis estado haciendo los
00:03:54
que comenzaste la tarea, a generar aquí los elementos con la geometría, etcétera, con las distintas
00:03:58
primitivas que se pueden poner en Unity. Y lo que hacemos es arrastrar, pues imaginaos
00:04:03
que este cubo es lo que queremos convertir en prefab. Para convertir en prefab cogéis de la
00:04:09
jerarquía los elementos, podéis seleccionar varios, y lo arrastráis al panel de proyecto y se
00:04:15
genera un prefab. En este caso es un cubo. Bueno, pues es un prefab bastante básico. Si fuera una
00:04:20
esfera pues podría ser la bala. Si queréis editar este prefab, bueno y ved que he borrado el prefab
00:04:26
que había generado y aunque esté en la escena, es verdad que se pone en rojo como avisando de
00:04:32
oye el prefab de origen no está. Te dejo el objeto aquí pero esto ya no es un prefab. Si
00:04:36
visual esta indicación roja significa eso. Imaginaos que tenemos ya la nave y ya la hemos
00:04:42
preparado y está ahí como un prefab. ¿Cómo se edita un prefab? Porque esto al final es como cuando
00:04:49
en cualquier software se mete en una carpeta, en un folder, en un bin, varios objetos de la jerarquía
00:04:55
que se van aquí poniendo una dentro de otra, como habréis visto también en la tarea. Cuando
00:05:01
vayamos teniendo estos elementos y los convertimos en prefab, pues igual lo tengo aquí como prefab,
00:05:06
lo borro todo y digo vale pues tengo aquí el prefab que lo puedo duplicar pero esto cómo se
00:05:11
edita luego. Para editar un prefab es fácil o le dais doble clic al elemento o al propio elemento
00:05:19
también de la jerarquía, se puede de cualquiera de los dos puntos, en este caso el cubo, voy a abrir
00:05:27
la nave, mi nave. Cuando hagáis el prefab, pues para reeditarlo y recolocar elementos, doble clic
00:05:31
y se os abre esta área como azul, un poco tron, ahí esperando a que hagamos cosas. Esto se
00:05:37
identifica, para que sea fácil, con dos pistas visuales. Una, aquí vais a ver en el panel de
00:05:43
escena que hay unas migas de pan para ir viendo que este prefab está metido dentro de escenas
00:05:52
porque lo hemos abierto desde donde está aquí incorporado, en una de las escenas está
00:05:58
este prefab aplicado y aquí podemos ir variando todos los elementos que componen ese prefab,
00:06:05
que al final veis que es como una especie de empaquetado de geometrías que tenemos ahí con
00:06:11
una jerarquía, esperando a que se instancie. Si en algún momento queremos cambiar el prefab,
00:06:15
pues nos metemos dentro del prefab y aquí podemos ir modificando cada elemento como en la jerarquía
00:06:20
de la escena habitualmente. Sí que es verdad que es importante, aquí hay una opción que se llama
00:06:25
autosave, que por defecto a mí me aparece marcada, debería aparecer marcada, que nos puede interesar o
00:06:31
no, porque esto significa que todo cambio que vayamos haciendo de los elementos se irán guardando
00:06:37
en el prefab automáticamente. Si lo desmarcamos, veréis que yo, si por ejemplo el alerón lo muevo
00:06:43
un poco, pues si yo saliera no se está guardando, habría que dar a este save que ha aparecido aquí,
00:06:50
que a veces cuando intentáis salir del prefab os dice oye pero guardas o no, eso dependerá de
00:06:54
cómo lo estáis gestionando. Si queréis volver, dice ya he terminado y lo voy a dejar mal, esta
00:07:00
pieza la he dejado un poco, que es el alerón trasero vertical este que he puesto, lo dejo así,
00:07:06
movido de sitio, si os fijáis. Si yo guardo y salgo, para volver a la jerarquía o al escenario,
00:07:12
aquí está esta flechita que nos sirve para volver al proyecto, para ir para atrás o también
00:07:20
podemos incluso dar a esa miga de pan que tenemos. ¿Qué pasa? Que ahora incluso si lo veis en la
00:07:26
miniatura, ese alerón se ha movido y se ha guardado como movido, si yo ahora lo duplico va a tener el
00:07:31
alerón ahí flotando, lo ha instanciado todo. Y esto es lo que me sirve para primera cosa que suele
00:07:36
haber de problema en vuestras entregas de esta tarea, que es tener en cuenta, imaginaos que cuando
00:07:43
hagamos las instancias del objeto, vuelvo a remitir a la bala, nosotros luego vamos a dar un punto de
00:07:49
referencia donde se va instanciando esa bala, desde donde se emite ese proyectil. En el caso
00:07:56
de una bala pues lo suyo será poner la boquilla de la pistola o del arma que sea, para que a
00:08:01
partir de ahí vaya para adelante en profundidad. Si ese elemento que estamos instanciando está
00:08:06
movido del cero cero de ese origen, imaginaos que hago esto, si yo me muevo de aquí, cuando yo
00:08:14
instancia esa bala, si no lo corrijo de algún modo, va a identificar que desde donde se lanza,
00:08:22
imaginaos que aquí está la boquilla de la pistola, va a estar ya movido desde ese punto. Por tanto,
00:08:27
ojo, si queréis instanciar algo en un punto concreto, aseguraos de que todo esté en el cero
00:08:34
cero de origen. Es decir, ahora mismo lo está y veis que aquí hay un elemento padre, que es el
00:08:41
nave prefab, que está con todo intacto, y luego he ido haciendo hijos a los distintos elementos de
00:08:46
la jerarquía. ¿Por qué pongo otro padre? Está el elemento empty, que es como un nulo,
00:08:52
como un null en otros software de 3D, etcétera, que cuando lo creáis está vacío, pero sirve para
00:09:00
colocar elementos dentro de otros elementos y dar coordenadas. El elemento padre padre de un prefab,
00:09:05
cuando estamos dentro del prefab, digamos que no puedes poner nada por encima de la jerarquía de
00:09:12
ese elemento, por tanto diría que este elemento, por defecto en los prefabs, debería estar siempre
00:09:18
configurado para que estén las coordenadas de origen, que son los ceros de posición, los ceros
00:09:23
de rotación y a uno de escala. Ojo, la escala por defecto es 1 en las tres dimensiones. Y luego,
00:09:28
dentro de eso, nos aseguramos a modo visual que esté todo donde queremos que esté. Así,
00:09:35
cuando instanciemos, nos aseguramos que este padre es el origen del prefab y luego ya iremos
00:09:41
distribuyendo los elementos. Luego hay otra cosa a considerar que os pone, que es que la nave
00:09:47
tiene que estar mirando hacia la Z en profundidad. Si os fijáis en este gizmo del mundo, dado el
00:09:55
juego que vamos a hacer luego, que va a ser un endless runner, que va la nave en profundidad y
00:10:03
van apareciendo obstáculos, un poco como el Subway Surfer, no sé si lo conocéis. Yo os voy a
00:10:09
enseñar para que tengáis en cabeza hacia dónde se dirige esto, lo enseño muy rápido. Esto será
00:10:13
de la tarea 2, es el siguiente paso. Pero lo que vamos a buscar, ahí lo tenemos, es un juego como
00:10:18
de estas características, todavía feo etcétera, pero que va a ir esquivando los pivotetes estos
00:10:26
que van apareciendo. Lo que vamos a hacer es que esta nave va en profundidad. Si el prefab lo
00:10:31
incorporamos angulado hacia otra dirección, luego habrá que hacer otra operación para reenderezarlo.
00:10:38
Por tanto, igual que con lo de la bala, lo mismo. Si queremos que esté en el punto de origen y
00:10:43
orientado correctamente, pues hay que tener en cuenta que el mundo está mirando en Z en profundidad.
00:10:50
¿Hasta aquí qué tal? Los que habéis estado probando, ¿cómo lo veis? Esto es ponerse y probar. Creo que
00:10:56
no tiene más complicación que saber meterte en un prefab, etcétera. Luego hay otra cosa para
00:11:05
que lo vayáis teniendo en cuenta, que es que cuando vamos instanciando o metiendo en la jerarquía
00:11:12
distintos prefabs, de pronto puede haber una de estas instancias, por ejemplo esta nave.
00:11:16
Veis que aquí se han acumulado unas cuantas, que yo le quiero poner un material o
00:11:22
darle otro componente, meterle un componente, como por ejemplo un Rigidbody. En los siguientes temas
00:11:29
lo vamos a ver. Metemos un componente. Recordad, esto lo dije el otro día, que los distintos
00:11:38
elementos que van sumándose a cada objeto se llaman componentes, que son lo que van metiendo
00:11:43
las propiedades que tiene ese objeto. Un Rigidbody, si le doy a play, vais a ver que es un objeto
00:11:50
que lo que hace es meter gravedad al objeto. ¿Qué ha pasado? Esto me sirve no para hablar del Rigidbody
00:11:59
en este momento, todavía no es el momento, sino para que veáis que tengo un prefab de todos los
00:12:06
que ya he metido, que es diferente al resto, que tiene un Rigidbody. Por defecto este de origen
00:12:11
no tiene el Rigidbody, pero a lo mejor estamos trabajando en uno de estas instancias y
00:12:17
hemos metido un elemento nuevo. Esto lo vais a ver a nivel visual, porque vais a ver que
00:12:22
donde está el iconito del componente, os añade un más, en plan está añadido a una instancia
00:12:29
del prefab. Podemos seguir obviando que esto es un añadido y seguir trabajando, porque esta
00:12:35
nave va a ser diferente al resto, o hay una opción aquí, cuando metáis un prefab va a aparecer
00:12:43
esta línea, para abrir el prefab como hemos hecho, para seleccionarlo de la jerarquía, y otro que son
00:12:48
los overrides. Los overrides sirven para, diciendo lo que tiene diferencial marcado con este más,
00:12:53
esa diferencia que hay con el prefab, decir yo lo que quiero es que todos los prefabs que deriven
00:12:59
de este, pues he pensado que tenga este Rigidbody, entonces si le damos a aplicar, vais a ver
00:13:05
que se aplica ahora a todas las instancias que tenga este prefab, por tanto es otra forma
00:13:12
de modificar también una instancia. Incluso aquí podemos ir abriendo la nave y decir no, es
00:13:19
que la nave no quiero que tenga alerones, veis que estoy trabajando no dentro del área de prefab, sino
00:13:29
dentro de la jerarquía, en una instancia. Si yo borro esos alerones, en los alerones justo me va a
00:13:34
decir, oye esto es un hijo de un prefab, si borras esto pues te está variando el prefab, lo tendrías
00:13:40
que hacer del prefab o tendrías que hacer una variante, y aquí es donde se podría borrar y
00:13:45
luego guardar. Hasta aquí, no sé si tenéis alguna duda, algo que me queráis decir, algo que
00:13:50
queráis que explique más relacionado con esto, si no paso a las siguientes cosas.
00:13:57
Nada, vale. Vamos a empezar a hablar de programación. Yo no sé de vosotros si alguno
00:14:03
ya ha programado alguna vez en otro lenguaje o tiene nociones, entiendo que muchos no, lo cual
00:14:15
es lógico. Vale, entiendo que si alguien tiene nociones, que me lo diga y así también le uso
00:14:23
un poco de ayudante en algunas cosas. El otro día dije que lo que son, algunos lo han
00:14:31
montado en Java, bueno pues ya salgo. Hablé de que se podían añadir código, todas las
00:14:40
funcionalidades que vamos a ir añadiendo, va a ser a través de estos componentes que os he indicado,
00:14:47
o añadiendo nosotros código que vayamos programando, que a fin de cuentas también se
00:14:51
añadirá como un componente. Para eso se generan lo que se llaman scripts. Y estos scripts ya vimos,
00:14:56
voy rápido porque esto lo expliqué el otro día, que se generan con clic derecho, crear y aquí
00:15:04
tenemos una opción de generar un script de César, que es el lenguaje de programación en el que
00:15:09
trabajamos. Ya os comenté y lo pone en los apuntes, que cuidado con el nombre que demos al script por
00:15:13
defecto, porque luego se va a ver reflejado dentro del código, y si no coincide este
00:15:19
nombre con el nombre de la clase del código, la clase es digamos el patrón que se va a usar en
00:15:29
el código para ir organizando los distintos códigos, pues si no coincide dará problemas.
00:15:36
Entonces he generado este script y si quiero que se vean los resultados de algún modo, habrá que
00:15:42
meterlo como componente en algún elemento. Ahora vamos a hacer operaciones matemáticas y al final
00:15:48
del todo un instance hit, para ver cómo se hace un poco lo de la tarea. Pero para que se aplique
00:15:54
este código a algo, ahora mismo simplemente está aquí preparado y si le doy doble clic se abrirá
00:16:01
vuestro Visual Studio, que tendréis aquí. Veis esta bonita pantalla de hacker que se nos ha quedado,
00:16:06
con un poco ese código abierto preparado para trabajar. Aquí vais a ver que este nombre y
00:16:13
este coinciden, y tienen que coincidir, ya lo expliqué el otro día, por eso si no tenéis dudas
00:16:20
no lo voy a repasar más, pero aquí tenemos la conexión entre el archivo que está trabajando
00:16:24
operando dentro de Unity y lo que va a responder a nuestro código. Por tanto si cambiamos alguna
00:16:30
letra aquí o algo, habrá que cambiarlo en ambos puntos. Importante, aquí ya de hecho tengo
00:16:36
algunas carpetas, habéis visto la de prefabs, donde tenía los prefabs, para generar carpetas clic derecho
00:16:44
crear, aquí es prácticamente donde se crea todo lo que podemos tener para el proyecto, hay
00:16:50
uno de folder. Os recomiendo que vayáis organizando, esto lo ponen los apuntes también, por tipología
00:16:54
de elemento. Entonces yo por ejemplo tengo aquí algunos que he estado yo trabajando, los quiero
00:17:00
tener ahí preparados, pero este que va a ser durante la tutoría, lo meto en la carpeta durante, para
00:17:05
tenerlo ahí, para saber cuáles son los de durante y los que tenía de antes. Lo dicho, tenemos
00:17:10
aquí el script abierto esperando para operar, y por mucho que yo escriba aquí hasta, bueno, no por mucho,
00:17:16
hay otros que no hará igual falta, esto ya es más avanzado, pero si queremos que lo que yo vaya
00:17:22
aplicando a este código se vea reflejado en algún momento en el programa, habrá que meterlo como
00:17:27
componente en algún elemento. Ahora mismo vamos a hacer, porque va a ser a nivel teórico, vamos a
00:17:32
generar un vacío, no va a afectar a un objeto visual, visible, y va a servir para
00:17:37
cálculos, por ejemplo, va a ser un objeto vacío al que yo vinculo, y mirad que para vincular un script
00:17:44
puedo arrastrar desde aquí al inspector y se incorpora como otro de los componentes. Si lo
00:17:50
quiero eliminar, las opciones de eliminar, de copiar, etcétera, están en estos tres puntos, lo voy a
00:17:58
eliminar, porque también se puede añadir, igual que se puede hacer, por ejemplo, con los componentes, con
00:18:04
los efectos, digamos, por decirlo de una forma rápida e inteligible, todos los que ya vienen
00:18:09
configurados también se puede buscar por aquí como para añadirlo. Hay uno de cálculos, que es el otro
00:18:17
que tenía, y cálculosTut. Fijaos, de hecho, cuando leáis sobre el PascalCase y el CamelCase,
00:18:23
cómo se deberían escribir las palabras en programación, aunque aquí haya puesto
00:18:30
cálculosTut todo seguido, fijaos que el propio programa, yo ya cuando lo meto en el archivo, sabe
00:18:36
separar estos nombres, para que veáis que ya está pensado esto, y hay que ir siguiendo estas
00:18:41
nomenclaturas que iremos viendo, y que ya en el tema 0 se habla de varias. Hasta aquí, no sé si hay
00:18:46
alguna duda. Vuelvo a abrir el código. Ahí lo tenemos. Ahora ya está, digamos, en un objeto dentro
00:18:52
de Unity, esperando a operar con él. ¿Qué tal? ¿Hasta aquí qué tal? ¿Alguien tiene dudas? Os abro un
00:19:00
segundo, que igual alguien me está escribiendo y no lo he visto. Sí, la opción, Elisa, es CSARP.
00:19:08
CSARP es el lenguaje de programación, C almohadilla, si lo hispanizamos.
00:19:18
CSARP Script, se crea uno nuevo y ya genera eso, y importante, según le das a crear, ya te pide
00:19:24
el nombre, pues tenerlo ya pensado, no lo dejes para más tarde, y así en estos momentos, sobre
00:19:31
todo, que igual nos puede generar problemas, pues lo metemos ya. Perfecto, pues estamos
00:19:36
aquí con CalculoStud, y vamos a hacer nuestra primera operación matemática. Y os voy a decir
00:19:43
algo, que es que casi todo lo que vais a hacer consiste en operaciones matemáticas, y en lógica
00:19:50
de que se cumplan condiciones o no. Es decir, todo por detrás suelen ser números, o interpretaciones
00:19:59
de números. Entonces, aunque ahora una suma parezca una tontería, al final casi todo lo vamos a ir
00:20:05
controlando con números, ¿vale? Entonces es importante saber operar con las opciones que nos
00:20:11
da. Para empezar a programar, y esto, quien haya programado en cualquier lenguaje, hay un
00:20:17
concepto que es el primario, digamos, que es la variable. La variable, digamos, es un elemento
00:20:23
en el que se van guardando espacios en la memoria con una información. Por ejemplo, quiero que
00:20:28
haya un número al que puedo referenciar con otra palabra. Voy a hacer primero una operación
00:20:36
matemática, y luego vamos a ver qué son las variables. Para empezar, cuando abrís este código,
00:20:46
aparecen aquí varias líneas, que ahora mismo no me interesan tanto, pero son estas tres. Son
00:20:51
librerías que hay dentro del Visual Studio, que es el IDE, el administrador de desarrollo que
00:20:56
tenemos. Cuando vamos añadiendo estas librerías, nos va dando posibilidades de ir usando como
00:21:04
opciones ya preconfiguradas por desarrolladores que han hecho este sistema. Si yo borrara esto,
00:21:14
por ejemplo, lo hago muy rápido, vais a ver que empiezan a surgir fallos, y los fallos vienen
00:21:20
marcados con estos subrayados rojos. Veis que el MonoBehaviour, que no sabemos lo que es,
00:21:25
pero funciona, parece, supeditado a estos sistemas. Así que no aburráis nada hasta que no sepáis lo
00:21:30
que es, pero son líneas que están proporcionando ya características preechas para el código. Luego
00:21:38
aquí hay una línea que veis que se llama igual que el archivo. Ya veremos un poco más qué es esto de
00:21:44
clase, etcétera. Pero a partir de estas llaves, y vais a ver que cuando marca una llave, se marca
00:21:50
otra llave, una de apertura y una de cierre, porque este lenguaje, como los que si habéis visto el
00:21:58
tema 0, los que se suele trabajar en lo que se llama programación orientada objetos, más avanzado,
00:22:04
ya le iréis dando vueltas, se van estipulando en bloques. Estos bloques significan que hay
00:22:09
una llave de apertura y una llave de cierre que delimita un área. Ahora mismo, de aquí a aquí,
00:22:17
pues hay un área y dentro de ese área, de ese bloque, es donde vamos a ir añadiendo las
00:22:23
instrucciones que se van a ejecutar, por ejemplo en este caso, dentro de esta clase. Si veis esta
00:22:28
llave, comprende todo lo que hay aquí dentro. Y luego vais a ver otras llaves, por ejemplo aquí. Y esta
00:22:34
llave, cuando marco esta, veis que tiene su correspondiente llave de cierre. Y aquí es donde
00:22:39
se irá ejecutando, por ejemplo, lo de este Start o este Update, este método Update. Esto ya
00:22:44
veremos ahora qué es. También tiene un área de influencia, donde yo iré escribiendo código y se
00:22:50
ejecutará lo relacionado con Update. Entonces aquí es muy importante que lo que se abre se cierre a
00:22:56
nivel de llaves y a nivel de paréntesis. También veis que se suelen abrir y cerrar aunque estén
00:23:03
vacíos y parezca un sinsentido. Ahí están esperando. Dentro de este bloque iremos haciendo operaciones,
00:23:08
pero veis que este bloque ya tiene, digamos, dos bloques aquí también, esperando que hagamos cosas.
00:23:15
Esto es porque Unity ya, a través de la herencia de otra clase, como de otra carpeta de posibilidades
00:23:21
que alguien ha hecho antes, los que han desarrollado CSAR para trabajar en Unity,
00:23:29
pues ya ha generado ciertas funciones, como este Start y este Update, para poder ejecutar en ciertos
00:23:34
momentos. CSAR se usa también para programar de otro tipo, etc. Incluso si veis tutoriales en
00:23:42
internet de CSAR, de Aprende CSAR, si no está aplicado a Unity, vais a aprender CSAR, el lenguaje,
00:23:48
pero veréis que por definición va a haber una cosa llamada Main, pues otro método que está
00:23:53
pensado para otros usos. Aquí digamos que está adaptado, igual que un lenguaje luego tiene
00:23:58
dialectos, por decirlo así, pues este ya está adaptado para lo que se hace en Unity, que es
00:24:03
desarrollo de aplicaciones, videojuegos, etc. Entonces, si pensamos fríamente, cuando estamos
00:24:07
jugando en un videojuego, lo que vamos a tener es unas interactividades, unas interacciones que
00:24:13
vamos a ir haciendo, y el programa en todo momento tiene que ir captando lo que hacemos o no
00:24:18
hacemos, para si en el mando damos a la X, pues que salte, si es lo que hemos configurado.
00:24:23
También va a haber operaciones que queremos que se ejecuten según se lanza el juego. Por ejemplo,
00:24:31
que se configure el nivel, se cargue, que se ponga que la vida está al 100%, etc. Y ese es otro
00:24:39
momento del juego, que es al iniciar. Estos dos métodos que tenemos aquí sirven, uno,
00:24:47
para meter instrucciones que se ejecutan según se abre o se aplica dentro del juego este código,
00:24:52
al arrancar este código, en el Start, lo que yo diga, se va a ejecutar. Y luego va a haber aquí
00:25:00
otro bloque, en base a otro método, que es este Update, a ver la traducción que ahora no me sale,
00:25:06
como de actualización, de actualizar, que constantemente, fotograma a fotograma,
00:25:13
va a ir mirando qué hay aquí dentro, para fotograma a fotograma, irlo ejecutando.
00:25:17
Entonces, lo primero, lo que metamos aquí, dicho rápido, se ejecutará al iniciar el juego,
00:25:21
a no ser que este código se ejecute posteriormente, y será cuando empiece a ejecutarse ese código,
00:25:29
y este Update se irá ejecutando fotograma a fotograma. Esto lo vamos a entender en poco.
00:25:34
Vamos a escribir, lo ha dicho el compañero, nuestro primer Hola Mundo, que es una frase
00:25:40
que se usa en programación para comprobar que la consola de programación del programa,
00:25:47
la consola es una especie de ordenador que va a ir reflejando qué operaciones se están
00:25:55
desarrollando en cada momento, aquí está más simplificado que en otros usos, pero vamos a
00:26:02
lanzar a consola, ahora veis lo que es eso, nuestra primera frase, que va a ser ese Hola Mundo,
00:26:09
y vamos a ver nuestra primera operación. Va a haber un montón de palabras reservadas,
00:26:13
de palabras clave, de propiedades, etcétera, que tenemos que ir aprendiendo e ir manejando.
00:26:18
La primera que vamos a hacer es cómo hacer que nuestro programa lance una frase. Vamos a conseguir
00:26:23
que a través de Unity ver la frase que nosotros le digamos. Para eso hay que escribir debug,
00:26:30
y veis algo importante, que cuando empecéis a escribir algo os empieza a salir aquí como
00:26:37
ayudas. Esto es un sistema en Visual Studio que se llama IntelliSense, que lo que va haciendo es
00:26:42
detectar lo que vamos escribiendo para darnos sugerencias de, oye, pues esto puede completarse
00:26:47
con estas opciones, que en todas veis que hay un tran, pues si sigo ir afinando, pero esto viene
00:26:54
muy bien para ir sabiendo qué opciones hay que podamos ir seleccionando. La primera instrucción
00:27:00
es este debug, y dentro de cada instrucción, digamos que luego, dentro de cada clase en este
00:27:07
caso, luego va a haber como propiedades hijas de esta operación. Por ejemplo, debug, si le
00:27:15
damos al punto, de pronto van a salir muchas opciones, no hemos escrito más. Pues debug a
00:27:24
ser debug log, que es la que nos interesa. Entonces quiero que en programación interpretéis los puntos
00:27:28
como separadores en jerarquías inferiores, me explico, como unas migas de pan que hemos visto
00:27:34
antes. ¿Qué significa esto? Supongo que todos habéis rellenado la típica ficha que os preguntan
00:27:40
cuál es vuestro país, y luego cuál es vuestra ciudad, y luego cuál es vuestra calle, y luego
00:27:46
cuál es nuestro número. Y cada opción consecuente, cada opción va a ser dependiente del padre, es
00:27:53
decir, si ponéis que sois de EEUU, pues luego saldrá aquí la opción de poder elegir entre los
00:28:00
estados. Pero si elegís España, pues lo que van a salir son las comunidades autónomas. Cada
00:28:05
caso irá desbloqueando nuevas opciones. Entonces siempre se va a ir de lo general a cada vez lo
00:28:10
más concreto. Debug, que sirve sobre todo para depurar código, para encontrar
00:28:17
errores. Si damos al punto, tiene dentro muchas operaciones relacionadas. La mayoría
00:28:25
de ellas no las vamos a necesitar, pero hay una muy importante que vais a aprender, que es esta
00:28:33
que se llama debug.log. Damos doble clic y ahí está. Cuando estamos ejecutando una acción con
00:28:39
código, vais a ver que siempre, o prácticamente siempre, vais a tener que abrir y cerrar unas
00:28:46
unos paréntesis. Y esto alude otra vez a estos paréntesis, por ejemplo, que tenemos aquí, sin
00:28:54
rellenar, porque ahora mismo esto nos interesa que esté vacío. Pero hasta que no ponemos estos
00:29:00
paréntesis, digamos que el software, el Visual Studio, nos sabe que estamos lanzando una instrucción
00:29:07
de hacer algo, que es lo que se llama lanzar un método o lanzar una función. Debug.log,
00:29:14
como funciona, por ver el primer uso, sirve para aquí, entre comillas, ahora os digo por qué, podéis
00:29:21
poner la frase que queráis lanzar, desde el hola mundo, que es la que vamos a lanzar ahora, pero
00:29:28
bueno, lo voy a hacer más personal. Hola mundo, Daniel. Y vais a ver que aquí nos sigue
00:29:33
marcando un fallo. Está aquí subrayado con un fallo. Os dije el otro día que para que se vea
00:29:38
reflejado algo que hagamos en código, atención que aquí arriba tenéis el nombre del archivo y va
00:29:44
apareciendo un asterisquito. Esto también os lo conté ayer, por ejemplo, en Premiere, que veáis que esto
00:29:49
pasa en muchos, un asterisquito que indica que es que no está guardado. Hasta que yo no haga
00:29:54
CTRL-S, yo no estoy guardando el código y hasta que yo no guardo el código, por tanto, siempre hay
00:29:58
que estar dando CTRL-S cuando queramos hacer algo, aunque yo vaya a Unity y haga lo que tenga que
00:30:03
hacer, no se va a ver reflejado. Tenemos que ir guardando. Y ojo, mirad que aquí y aquí también
00:30:07
tenéis asterisquitos. Son dos software diferentes, Visual Studio y Unity. En uno estamos trabajando el
00:30:16
código, que habrá que ir guardando también, y en otro iremos trabajando en todo lo que nos
00:30:21
ofrece esta interfaz destinada a desarrollo de videojuegos a nivel gráfico. Aquí también puedo
00:30:28
hacer CTRL-S e ir guardando. Veis que ahora se ha ido el asterisco. Aquí se ha guardado todo lo
00:30:34
relacionado a nivel visual, pero si yo cambio algo en Unity, en código, son independientes
00:30:38
cada uno de ellos. Entonces atención de si algo no funciona, que aquí no esté el asterisco, porque
00:30:44
igual todo lo que habéis cambiado no se está viendo reflejado. Y veis que aquí está este error.
00:30:50
Si aquí hay algo subrayado rojo, vuestro programa no va a funcionar. Va a dar fallo, va a dar error,
00:30:55
porque no está sabiendo ejecutarlo. Y esto lo veis si vais a Unity. Aquí abajo ya sale
00:31:01
una exclamación roja que algo nos dice que no está yendo bien. Y de hecho yo intento ejecutar
00:31:08
el juego, aunque ahora no tenga nada. Le doy y dice todos los errores de compilación tienen que ser
00:31:14
arreglados antes de poder proceder al modo de juego. Por tanto veis que a mí no me deja hacer
00:31:18
nada en el área de game, porque está habiendo un error. Esta línea roja que hay aquí realmente es
00:31:24
una especie de resumen de lo que podéis ver en el menú consola. Si dais a consola,
00:31:32
aquí sale aún más grande la exclamación y es el mismo error. Hay verdad que aquí pueden salir
00:31:38
muchas más líneas, muchos más errores. Se puede llenar, pero aquí digamos que os va poniendo como
00:31:43
la última o la principal que tenéis que ver. Son las mismas. Si leís la línea es exactamente lo mismo.
00:31:48
Y esto más adelante va a venir bien si queréis acceder a lo que está dando este fallo. Si le
00:31:54
dais doble clic, lo debería abrir. A mí me lo ha abierto en otro lado porque tengo otra ventana,
00:31:59
pero lleva a la línea de ese error. Me está aquí marcando dónde está el error. Es una buena
00:32:05
forma de saber de dónde viene. Le dais doble clic y decís, oye, ¿qué pasa? ¿por qué esto
00:32:10
está yendo mal? Aparte aquí os pone también tanto el nombre del script del que está
00:32:16
surgiendo el error, la línea 1140, la línea y la columna que está dando el error. Si nos metemos
00:32:23
en el código vemos que es la línea 11, por eso no lo va numerando, y la columna que no está
00:32:29
detallada es la línea 40. Aquí podéis ir viendo todos los problemas que podéis ir
00:32:34
viendo de una forma también descrita. Aquí también pone el error. Aquí suele poner el
00:32:42
motivo y es que espera un punto y coma. A nivel de sintaxis, de trabajo de este código, de CISAR,
00:32:47
de este lenguaje, toda instrucción que vayamos dando, toda línea, debe acabar en punto y coma
00:32:56
para ir separando las distintas órdenes que vamos ejecutando. Hasta que no ponga punto y línea,
00:33:02
pues esta orden no se sabe hasta dónde llega, entonces hay que delimitarla en algún momento.
00:33:09
Vemos que no da error y voy a ir a CISAR para ejecutar esto. Aquí sigue poniendo el error.
00:33:17
¿Por qué creéis que es?
00:33:27
¿Por qué? Si aquí no me sale nada rojo.
00:33:31
Venga, primera pregunta interactiva. Porque no se ha guardado el proyecto en el Visual Studio.
00:33:34
Perfecto. Veis que está el asterisquillo. Importante, porque esto ahora es muy obvio,
00:33:42
pero luego pasa. Control-S, se ha guardado, vuelvo y ya, cuando me permita, a veces tiene que
00:33:47
recargar. Según el ordenador, mejor o peor, pues tardará más. Ahora hay otros problemas, pero ya
00:33:55
no es el rojo. Cuando salen errores amarillos, con este warning amarillo, significa que hay
00:34:03
errores, pero no son fatales. Es decir, no van a detener la ejecución, pero bueno, convendría echarle
00:34:09
un ojo. Lo mismo, si le damos doble clic, nos abriría, esto es de otros scripts que tengo preparados
00:34:16
antes, nos abriría donde está en el código ese error. Ahora, cuando lancemos la aplicación,
00:34:20
cuando le dé a play, vais a ver que se ejecuta. Os he dicho, cuando lancéis, ahora se va a ver en el
00:34:26
juego la frase cual hemos dicho, hola mundo Daniel. Y os vais a llevar la primera desilusión, porque
00:34:32
no se ve nada en el juego, no hay nada que se vea. Pero si os fijáis en la consola, sí que aquí pone
00:34:38
hola mundo Daniel. Os he dicho que estas operaciones se hacen para depurar errores de código. Es decir,
00:34:45
no es algo que se va a ver en el juego, son instrucciones que la consola va a ir mostrando
00:34:54
para ir viendo si se está ejecutando algo bien o no. Es de vital importancia este debug log. Ya
00:34:59
iréis viendo que es con lo que vamos a ir comprobando que todo funcione. Ahora mismo
00:35:03
he puesto hola mundo Daniel, aquí podría poner, hola a ver uno de vosotros, Elisa, que la estoy
00:35:07
viendo ahora mismo. Pues hola Elisa, yo si vuelvo a guardar y voy, cuando ejecute el juego, ojo,
00:35:15
cuando me meto otra vez, si está el juego en ejecución, necesito volver a lanzarlo. Y ahora
00:35:21
pone por lo que le he dicho. Ya vamos viendo que hay cierta interacción.
00:35:28
¿Dudas hasta aquí? ¿Más o menos me vais siguiendo?
00:35:38
Sí, creo que alguien está hablando, pero no lo escucho.
00:35:43
Vale, por si tenéis bloqueado. Lo digo porque la única persona que me ha puesto, no sé si es a mí,
00:35:51
pero que leo. Sí, vale, no te escucho, si lo estás intentando. Tienes el micro bloqueado.
00:35:56
Y alguien está pidiendo la mano, dos personas, pues adelante.
00:36:02
Vale, no sé si lo vais a escribir. Vale, bueno, pero no sé si ha sido Esther, también ha levantado
00:36:12
la mano. ¿Alguien quiere decir algo? Que no sé, es que ahora solo, ahora no lo veo, igual se ha
00:36:18
equivocado. Vale, ha habido equivocación ahí. Vale, entonces, ya para entender que lo que hemos
00:36:23
hecho en el Start significa que cuando empieza a ejecutarse el juego se ve este Hola Elisa.
00:36:29
¿No te sale en la consola, Elisa? No, ahora ya me escuchas, ¿no? Que no me sale en la consola,
00:36:36
lo estoy poniendo en el código y cuando me voy a Unity no me sale. ¿Quieres compartirme pantalla
00:36:41
y lo vemos? Sí. Ah, no puedo, porque estoy con la cámara en un ordenador y con el Unity en otro.
00:36:46
Bueno, pues compárteme con él. En el ordenador de Unity no están metidas las dos.
00:36:52
No. Vale. Sigo trasteando y si no te escribo y lo vemos. ¿Tú has escrito el código dentro? No,
00:36:58
hombre, pero me interesa que vayamos viéndolo. Sí, a ver, estoy poniendo como anotaciones de
00:37:06
las cosas que vas explicando para tener como ahí una mini chuleta, pero he puesto de bug.log
00:37:09
Hola Eli y no me sale. O sea, me sale bien el código, no me sale ningún error, está pues con
00:37:14
los mismos flores que tú, pero en Unity no me sale en consola. De hecho, me sale un error.
00:37:21
¿Y le estás dando al reproducir? Es decir, lo guardas.
00:37:26
Sí, lo guardo, lo reproduzco y me sale un error. A ver.
00:37:29
¿Y qué error pone? Collapse service is desplicated and has been replaced with plastic SCM.
00:37:36
Uy, ese es avanzado. ¿Pero es rojo el error? No creo.
00:37:45
Sí, es rojo. ¿Puedes hacer algo para compartirme la pantalla, por fa?
00:37:47
A ver si te van así. Es que esto es una locura. No, no, espérate. Me quito la cam, me meto en el ordenador.
00:37:52
Vale, sí, quita la cámara, da igual. Hombre, me ha servido para ver que estabas hablando y no te
00:38:02
escuchaba, pero bueno, ¿qué tal? Prefiero ver tu código.
00:38:06
Vale, pues espera, dame un momento que cierro aquí y me abro en otro sitio.
00:38:08
Vale, genial. ¿El resto qué tal? ¿Tenéis alguna duda? ¿Más o menos vais siguiendo?
00:38:12
De momento todo bien. Vale, genial. Voy a esperar a que se conecte Elisa, pero...
00:38:24
No estoy en ello.
00:38:28
Ah, pero tú me vas escuchando mientras lo vas haciendo el cambio.
00:38:29
Sí, sí, de hecho creo que lo voy a dejar el datos conectado y ya está.
00:38:33
Vale, sí, sí, sin problema. Voy a hacer una cosa para que veáis las diferencias que hay ya entre
00:38:36
todo lo que tenemos, que es que si yo esta línea de debug log la corto con CTRL X de toda la vida
00:38:42
y la meto dentro del update y guardo, el resultado va a cambiar. Es decir, ahora no le estamos
00:38:48
diciendo que ese debug log, esa escritura de frase en consola se haga en el comienzo del juego,
00:38:54
sino que se haga fotograma a fotograma, hemos dicho. De hecho, aquí hay lo que se llaman comentarios,
00:39:01
creo que esto no lo comenté el otro día, que son estas líneas que aparecen en verde marcadas
00:39:06
con dos líneas verticales y estas líneas verticales, todo lo que se ponga después,
00:39:11
no se está ejecutando, son comentarios que vamos escribiendo. Y aquí pone,
00:39:19
esta se llama antes de la primera actualización de frame, de primer frame vamos, y este se irá
00:39:23
llamando una vez por frame. Ahora lo ejecuto, vamos a ver un segundo lo de Elisa, no sé si lo veis
00:39:28
todos, lo muevo aquí, espera un segundo, y aquí, lo voy a cambiar de pantalla para que se grabe,
00:39:35
vale collapse services deprecated, claro pero eso no tiene nada que ver con,
00:39:43
sí, está bien, clase, a ver, vuélvete al editor,
00:39:55
dale doble clic al error, que te hace,
00:40:02
vale, y esto lo ha generado de cero y nada.
00:40:11
Y ese más que te sale, es que tienes activado algo de compartir en la nube, puede ser, a ver,
00:40:19
cuando lo hayas creado en Unity Hub, ¿puedes ir al Unity Hub un segundo? El Unity Hub es el otro,
00:40:27
el blanco, ahí, conectado, vale, han metido nuevas opciones que están dando fallos y de las que yo
00:40:33
la verdad tampoco controlo mucho, en el último Unity Hub han metido opciones de el cloud,
00:40:42
de la nube, vale, y en tu caso aparece como conectado, desconectalo porque creo que es lo
00:40:47
que está dando problema, entonces para desconectarlo, no, no, no te salgas, dale donde pone connected,
00:40:53
ahí, a ver qué te pone, dale, no te deja cambiar la opción, vale,
00:40:58
disconnect from Unity Cloud, pero no te deja, y a ver, y en el proyecto de abajo, que es otro,
00:41:08
que no está en uso ahora mismo, si vas a los tres punticos de la derecha, disconnect from Unity Cloud,
00:41:14
vale, vale, te sugiero que lo desconectes,
00:41:20
sí, desconectalos, sin problema, y va a seguir dando el error porque este archivo sigue estando
00:41:26
conectado, tienes que cerrarlo, vale, ciérralo, ciérralo de, ahí, eso es, sí, y vuelve a hacer
00:41:31
lo de la opción de desconectar, desconectar, este error la verdad que no sé muy bien cómo
00:41:38
gestionarlo porque es algo que acaban de poner nuevo, a ver si con esto ya, perfecto, a ver, dale a play,
00:41:47
pero no te sale el hola Elisa, ah bueno, claro, a ver, importante, bueno, ya hemos solucionado el error,
00:42:04
no, pero como he dicho antes, para que se vea reflejado en el Unity, ¿lo has aplicado como
00:42:11
componente algún objeto? ¿lo has arrastrado algún elemento? ahí, por ejemplo, la luz da igual, la luz,
00:42:17
cuando tiene sentido, ahora cuando lo lances, que igual te tarda un poquillo, vale, dale a play,
00:42:25
ahí lo tienes, vale, hasta que no lo aplicáis a algún objeto que está dentro de la escena,
00:42:36
pues el código está ahí preparado, pero no sabe a qué aplicarse, vale, bueno, no te escucho, pero
00:42:41
espero que más o menos resuelto, vale, vuelvo a tomar yo el control, vale, vuelvo a compartir
00:42:47
pantalla, voy a ello, no te escucho si me estás hablando, que no sé si lo estás haciendo,
00:42:54
vale, a ver, gracias, vale, comparto yo pantalla y deberíais verla ahora otra vez,
00:42:59
compartir, veis mi Unity, ¿verdad?
00:43:12
vale, entiendo que veis mi Unity, sigo, entonces, importante, ya veis que las sutilezas son
00:43:24
importantes, estaba preparado todo bien, pero bueno, no se estaba reflejando, y como he visto
00:43:29
que estaba haciendo en el código lisa, cuando ponemos dos líneas de este tipo, podemos escribir
00:43:35
lo que queramos para darnos indicaciones, pues por ejemplo, esto sirve para mostrar mensaje en consola,
00:43:40
vale, y esto no se ejecuta, esta línea, esto verde, no se ejecuta, es simplemente comentarios que
00:43:47
vamos metiendo en el código para recordarnos nosotros e ir marcando a otro programador que
00:43:52
también se meta en el código, pues lo que queramos, indicaciones, vale, importante, para que no ocurra
00:43:57
lo de lisa, que tampoco era el problema por lo que hemos visto, pero bueno, esa indicación roja que
00:44:03
salía no era muy aconsejable, han añadido, a lo mejor alguno, si el Unity Hub lo incorporaste y
00:44:07
según empezó el curso no salga, porque es algo nuevo del Unity Hub que acaban de incorporar, que
00:44:12
es poder trabajar en la nube, vale, para que esto no aparezca por defecto y no haya que desconectarlo
00:44:16
después, como acaba de hacer la compañera, cuando creéis un nuevo proyecto, de momento, a no ser que
00:44:22
sepamos lo que hagamos, vale, el otro día lo vimos y de hecho el otro día no estaba estas opciones, para
00:44:28
que veáis lo reciente que es, os sugiero que a no ser que sepáis lo que hacéis, desconectéis los dos
00:44:33
tics nuevos que han puesto de usar en la nube, vale, la versión de controles y el connect y de
00:44:38
esta forma ya aparece desconectado, vale, para que no de ese error, que no era fatal aunque salía en
00:44:43
rojo, yo creo que hubiera funcionado, pero bueno, pues de momento no nos liamos con más cosas, vale.
00:44:49
Hasta aquí bien, como alguna duda de alguien, no? Lo que he hecho, si os acordáis lo último que he
00:44:58
hecho, mientras Elisa hacía el cambio, ha sido copiar ese debug log de start a update, vale, si yo
00:45:07
ahora mismo ejecuto el juego, vale, me meto aquí y le doy a play, cuando arranca el juego vais a ver
00:45:16
que hola Elisa sale muchísimas veces y aquí se van contando y me dice ya más de mil y ya no te
00:45:22
hace la cuenta, no? Cuando yo pare el juego, veréis que aquí hay un trillón de hola Elisas, ¿por qué?
00:45:28
porque esta instrucción que le he dado aquí de escríbeme en consola hola Elisa, pues se ha ido
00:45:34
ejecutando cada fotograma de juego, vale, fotograma dependiendo del ordenador, esto lo veréis en la
00:45:40
próxima lección que abra, al final cada ordenador va a tener una capacidad de computación, según si el
00:45:48
procesador es mejor o peor, pues la capacidad, pues eso, si es mejor o peor el ordenador, pues va a poder
00:45:55
procesar más fotogramas por segundo que otros, vale, entonces dependiendo del ordenador ya veremos
00:46:00
que esto puede suponer un problema, vale, porque unos ordenadores van a ser más rápidos a la hora de
00:46:05
ir calculando más fotogramas que otros, vale, pero por defecto ya vemos que sea el ordenador que sea
00:46:11
esta instrucción de hola Elisa, cada fotograma que puede ir refrescando, pues danza la instrucción
00:46:16
indiscriminadamente cada fotograma, cuando se meta dice un hola Elisa, un hola Elisa, un hola Elisa, vale, ya
00:46:21
veis que hay dos momentos que vienen ya por defecto hechos en los códigos, que son este start para
00:46:26
cuando arranca el script y otro para, según en el momento que esté este script, pues se vaya ejecutando,
00:46:31
vale, digo siempre lo de en el start cuando arranca el script, porque si yo vuelvo a poner en el start
00:46:36
el debug log, vale, y yo tengo aquí el juego, lo tengo dentro, el componente está dentro de este
00:46:43
empty object que es cálculos, vale, hay una opción aquí que sirve para activar y desactivar, que
00:46:51
esto si lo probáis, pues por ejemplo con la nave, pues sirve para que se vea o no, está ahí en la jerarquía
00:46:56
pero no está funcionando, si yo lanzo el juego, vale, veis que no se ejecuta, a diferencia de antes,
00:47:02
vale, está el start, pero es que como no se ha ejecutado el componente, dado que el objeto que lo contiene
00:47:08
no existe, vale, cuando yo le dé a, de alguna forma ya veremos, a que se ejecute este objeto, pues ahí sí,
00:47:14
según se ejecuta, vale, por eso digo que el start no es el primer fotograma del juego, porque hasta que
00:47:21
no se lance, digamos, el script, pues no funciona, vale, importante, entonces ya tenemos, voy a dejar que
00:47:27
sí que esté activo, vale, importante, que a veces no es que no funcione, es que no está vinculado a nada, no
00:47:35
está funcionando ese objeto, vamos otra vez aquí al código, vale, os he dicho este debug log, hola Elisa,
00:47:40
yo ahora en vez de decirle una frase literal, por eso hay que poner las comillas cuando sean textos,
00:47:47
o strings, esto es lo que vamos viendo, hay que ponerlo entre comillas, yo voy a decirle, no, yo quiero que lo
00:47:52
que muestre en consola, pues porque soy así de temerario, yo que sé, es el resultado de 5 más 4,
00:47:57
vale, una operación aritmética muy básica, yo cuando lance este juego, guardo, vale, y lance este
00:48:04
juego, al arrancar, lo que me va a mostrar en la consola, dado que es lo que está dentro de estos paréntesis,
00:48:13
va a ser un 9, vale, lo veis aquí, que es el resultado de la suma, vale, esto cuando vayamos teniendo que una
00:48:19
bala así te impacta, te quita 100 de vida y lo resta de las 500, pues ya tendremos que ir haciendo
00:48:30
operaciones, entonces esta operación tan básica es el origen de todo lo que vamos a ir haciendo
00:48:36
con los juegos, vale, aunque aquí haya puesto los números rápidamente, como números sueltos, vale,
00:48:42
hay que entender un poco cómo gestiona la información el propio Unity, me refiero con cómo
00:48:49
gestiona la operación, con que aunque aquí pongamos un 5 y un 4, vale, hay distintos tipos de variables,
00:48:54
ya me meto a ello que he introducido, según qué vamos a meter en esa variable, vale, voy a hacer
00:49:01
primero una cosa para que lo veáis sin entenderlo y luego lo explico, yo por ejemplo voy a generar
00:49:08
un número de tipo entero, con número de tipo entero me refiero a un número que no tiene decimales,
00:49:14
vale, un número entero, que se va a llamar 5, vale, contesto y a esto le digo que es igual a 5, ahora
00:49:20
digo que es y luego voy a hacer otra variable llamada 4 que va a valer 4, vale, y aquí lo que
00:49:27
voy a hacer es, en vez de decir 5 con número, voy a apelar a este 5 que he puesto aquí y a este 4
00:49:35
que tengo aquí y vais a ver que yo cuando lo lancé, lo he escrito con texto, vale, cuando lo lancé
00:49:45
va a dar otra vez ese 9 que teníamos, ahí está el 9, vale, pero esto no es porque el programa sepa
00:49:52
que si escribe el 5 con texto es un 5 como un número, vale, esto es porque anteriormente hemos
00:50:00
declarado y de hecho si yo borrara estas líneas, vale, daría error, vale, porque hemos creado lo
00:50:08
que se llaman variables, las variables son referencias de ciertos tipos, vale, como cajas
00:50:14
digamos que vamos a ir usando para ir construyendo un lego, vale, que pueden ser de distintas formas,
00:50:21
entonces vamos a ir construyendo estas cajas de distintos tipos, en este caso estamos operando
00:50:26
con números que son enteros pero por ejemplo hay otro tipo de caja, otro tipo de variable que son
00:50:32
los que permiten operar con números decimales que son estos de tipo float, por ejemplo esto se va
00:50:40
a llamar 5 con 5, vale, vais viendo que cuando escribo el nombre de esta variable, vale, lo primero
00:50:47
que hacemos es decir qué tipo de caja o qué tipo de información va a guardar porque yo aunque aquí
00:50:56
me ponga bruto si le pongo 5 con 5 pues no lo sabe entender porque esta caja sólo permite guardar
00:51:01
números enteros, vale, pero si yo pongo 5 con 5 y pongo aquí 5 con 5 y hay que poner una F, esto
00:51:07
también lo veremos, aquí no da fallo, vale, aunque sea decimal, aquí aunque pusiera lo mismo 5 con
00:51:14
5 F, pues nada, entonces ved que hay cajas variables de distintos tipos y cada una va a
00:51:19
permitir guardar información de distintas características. La estructura de declarar
00:51:27
una variable, es decir, de crear una caja o una pieza de lego con la que vamos a seguir trabajando
00:51:34
en el código es siempre la misma, primero hay que poner de qué tipo es esa caja, en este caso pues
00:51:40
vamos a hacer, como sé que voy a trabajar con un número entero, pues pongo este int, de integer, de
00:51:46
entero, vale, y luego a esa caja, por hacer como una caja de mudanza el símil, la voy a etiquetar
00:51:52
para yo saber qué hay dentro y yo sé que aquí pues va a ser un 5, vale, este es el nombre que
00:51:58
nosotros queramos, es el nombre que damos a esa pieza de lego con la que vamos a ir trabajando,
00:52:05
entonces yo en vez de 5 puede ser el número primero que vamos a usar, vale, y ese número
00:52:09
primero, esa caja dentro va a tener lo que le asignemos después de este igual, que es un 5,
00:52:16
vale, aquí por ejemplo creo otra caja, otra pieza, que se va a llamar número que suma el nombre que
00:52:21
queramos, aquí es lo que queramos, también de tipo entero y meto ahora un 3, vale, y cuando vaya generando
00:52:30
estos números, veis que me da fallo porque las cajas que antes se llamaban 5 y 4 ya no existen,
00:52:37
ahora habrá que trabajar con las cajas, digamos que yo he creado estas piezas y quiero que la suma
00:52:43
a hacerlo a partir de esas variables, ahora tendré que poner, vale, pues el número primero de la
00:52:48
operación y veis que cuando yo voy escribiendo el IntelliSense me va mostrando lo que coincida,
00:52:53
si yo he creado esta variable, fijaos que incluso el icono tiene forma de caja, que es bastante
00:52:59
representativo, vale, yo si escribo ese número primero, ahora mismo lo que yo ponga aquí con
00:53:03
este nombre y este identificador, vale, lo que le he asignado, vale, ahora mismo aquí esto es sinónimo
00:53:09
de 5 en este momento, esta caja luego podremos ir cambiándola de contenido a lo largo del código,
00:53:16
por ejemplo habrá algún momento que, para adelantar, que sea vida personaje, vale, y empiece valiendo
00:53:22
100, lo que pasa es que nosotros a lo largo del juego a esta caja vida personaje le iremos quitando
00:53:30
o añadiendo vida según pues reciba balas o vaya cogiendo power ups de corazón, de vida, vale,
00:53:36
entonces esta sigue dando fallo porque ahora mismo esta caja no existe, no hay ninguna caja llamada
00:53:44
así, pues por ejemplo número que suma, vale, pues número primero si lo volviera a meter sería otro
00:53:49
5, no, yo quiero el número que suma, a ver, le clico y ahí está, ahora mismo si leemos esto estamos
00:53:55
diciendo por favor muéstrame en consola número primero más número que suma, cuánto crees que
00:54:01
va a dar de resultado, venga, mientras voy 8, a ver, le doy al play y 8, perfecto, y si ahora en vez
00:54:07
de número que suma aquí pongo vida persona, que es otra caja que tengo, ¿cuánto valdría?
00:54:22
105, si, ¿no? ¿estamos todos de acuerdo? a ver si lo que dice... 105, perfecto, vale, entonces vemos que al
00:54:35
final, y esto si no le veis la utilidad se la iréis viendo rápidamente, iremos generando variables
00:54:44
o palabras, digamos que van englobando datos dentro, vale, que ya os digo que se irán actualizando a lo
00:54:51
largo del juego cuando vayan ocurriendo ciertos eventos, vale, veis también que cuando uso una
00:54:57
una de estas palabras, vale, cuando marco en un sitio se me marcará en el resto de sitios que
00:55:04
está apelando a un mismo variable en ciertos puntos, vale, esto sirve para ir viendo
00:55:10
fácilmente dónde se ha declarado, es decir, dónde se ha generado la caja y dónde estamos pues
00:55:17
usándola, veis que hay un número, hay variables que están marcadas de gris, ¿qué eso significa? que sí,
00:55:22
que esa caja existe pero no se ha usado en ningún momento, si nunca se va a usar lo suyo sería borrarla,
00:55:27
vale, de hecho si voy a algunos de los errores en este momento que hay aquí, vale, cuando detengo
00:55:32
la ejecución me puede sugerir a veces, ahora no me lo está haciendo porque tengo que cambiar algo,
00:55:38
voy a poner 105, yo que sé, vale, cuando ahora vuelvo a refrescar vais a ver que por defecto en la consola
00:55:47
a veces tarda un poco, bueno, entre los errores es en Cancun 5 la variable 5 con 5 está sin nada pero
00:55:55
su valor nunca se usa, vale, pues eso significa que 5 con 5 está aquí pero nunca se usa, veis que es un
00:56:06
error que va a funcionar el juego pero dice, oye, borra esta línea si no la vas a usar, para qué vas a
00:56:13
llenar tu habitación de cajas si no las vas a usar, vale, hasta aquí más o menos vais viendo qué estoy
00:56:19
haciendo, sí, vale, aparte de números enteros y decimales, vale, y los decimales se escriben con un
00:56:24
punto en vez de una coma, vale, y hay que poner una f de float, vale, porque si no, no sabe si se está
00:56:34
refiriendo a un número decimal u otras cosas, vale, si no ponéis la f, aunque permita tener 5 con 5,
00:56:40
yo le doy a la f y no funciona, y ojo, si yo pongo número primero y 5 con 5, vale, ahora estoy juntando
00:56:45
cajas de distinto tipo, ¿qué debería la lógica decir que nos da como resultado?
00:56:57
vamos a verlo, 10 con 5 dicen por ahí, por cierto cuando tenemos todos los errores estos que nos
00:57:09
pueden salir, si damos a clear, lo limpiamos, vale, ya sabemos lo que queremos para al volver a ejecutar
00:57:16
pues que se generen los que tienen que ser, 10 con 5, perfecto, vale, entonces los decimales los va
00:57:21
cogiendo, pero cuando vayáis introduciendo un dato decimal siempre con punto y con f detrás,
00:57:28
vale, si no, no lo lee, si no da fallo, vale, simplemente eso, hay más tipos de cajas, otra muy
00:57:33
importante que es el string, las cajas, las variables de tipo string, la variable de tipo string lo que
00:57:41
contienen son textos, vale, no son números con los que operar, son textos, pues la f tiene algún motivo lógico,
00:57:47
simplemente es float, es la miniatura de float, que como vemos aquí es el tipo de variable
00:57:54
que guarda estos valores, vale, el string igual, la lógica de declarar una variable es siempre el
00:58:04
tipo de variable, en este caso vamos a decir el dato que voy a guardar aquí es una cadena de texto,
00:58:11
es un texto, y lo voy a llamar pues cadena de texto o yo qué sé, mi nombre, vale, y entonces al darle
00:58:16
igual, vale, y quiero que vayáis interpretando estos iguales no como un igual en matemáticas de 2 más 2
00:58:24
igual a 4, esto significa que se está asignando un valor, vale, o lo que se llama el término más
00:58:29
correcto sería inicializar, en este caso el valor, que es que una caja que está vacía hasta aquí, de
00:58:36
pronto la vamos a poner un algo, no estás comparando nada ni es equivalente una cosa a otra, sí lo es,
00:58:41
pero es que esto que está aquí a la izquierda pasa a tener este valor, y aquí si yo
00:58:48
pusiera un número, vale, y mirad que yo todas las operaciones las acabo cuando acaba la instrucción
00:58:53
con un punto y coma como os he dicho antes, vale, importante, porque si no se empiezan a juntar
00:58:58
conceptos y empieza a dar problema, entonces veis que yo aquí pongo un 5 y dice error, porque esta
00:59:01
caja no está pensada para números, vale, para meter texto cuando algo queremos que sea un texto
00:59:07
literal, como hemos hecho antes con el hola mundo, hay que abrir comillas, vale, las comillas típicas
00:59:12
de entrecomillar, y aquí se puede poner, vale, pues en mi caso Daniel, vale, y ahí se ha guardado un texto,
00:59:18
si yo pongo ahora mismo,
00:59:27
a ver, por ejemplo,
00:59:32
voy a hacer una frase, digamos, compuesta de varias variables, para que veáis que se puede
00:59:34
ir modulando todo, modularizando mejor dicho, voy a generar un string que guarda mi nombre,
00:59:41
otra caja que guarda la frase que construye o el predicado, que va a ser, tiene
00:59:48
vale, tiene de edad, vale, y luego al final voy a poner otra variable, que en este caso es un número,
00:59:59
porque va a ser mi edad, que van a ser, cuando pongo mi edad, que son 34, entonces yo puedo ir
01:00:10
combinando estas cajas para que vaya componiendo texto, si yo por ejemplo aquí dijera, enseñan el
01:00:16
de backlog solo mi nombre, vale, pues lo que va a enseñar la consola es mi nombre, que es Daniel,
01:00:22
en vez de haber escrito literalmente aquí, está referenciando a una variable, para enseñarnos lo
01:00:27
que hay en el interior de esa variable, yo si ahora voy a la consola, vale, y le doy a iniciar,
01:00:33
pues pone Daniel, vale, así que lo que podemos ver es que podemos ir concatenando distintas variables
01:00:39
para hacer, digamos, elementos más grandes, igual que antes hemos sumado dos variables que contenían
01:00:46
dentro un número, también podemos ir concatenando textos, por ejemplo puedo poner mi nombre, más,
01:00:53
vale, y este más no es que estemos sumando números, cuando se usa el más al usar textos, lo que
01:00:59
estamos haciendo es que un texto va detrás de otro, vale, entonces yo puedo poner mi nombre, luego el
01:01:07
predicado, vale, y ahora lo que va a enseñar, ¿qué crees que va a ser? A ver si alguien puede adivinar.
01:01:12
Voy cambiando a...
01:01:24
¿Alguien quiere apostar?
01:01:31
Ahora lo que va a mostrar es lo que hay, exacto, Daniel, ¿no? y a continuación tiene edad, este más no es para sumar
01:01:34
números, es para unir, entonces vais a ver que lo que pone es Daniel tiene edad, y fijaos que no deja
01:01:46
ningún espacio en medio entre Daniel y tiene, ¿por qué? Pues porque básicamente no sabe que hay un
01:01:55
espacio entre esta cadena de caracteres y esta, vale, si la creemos como es literal, mete un espacio y ahora
01:02:00
sí, ahora sí que va a haber ese espacio, ved que lo que hay entre comillas es literalmente lo que vamos
01:02:07
escribiendo dentro, vale, entonces ahora sí que vais a ver que llegamos aquí y pone Daniel tiene
01:02:11
edad, vale, y ahora puedo decir, vale, y aparte de Daniel tiene edad, vale, que son bloques que yo puedo
01:02:19
en cualquier momento ir cambiando, vale, ahora lo que va a guardar esta variable es tiene de años,
01:02:26
perdón que la frase sea un poco extraña, pero es para construirlo más fácil, tiene de años y aquí voy a
01:02:30
poner edad, que es esta variable, que veis que ahora es una variable de tipo número y además es de tipo
01:02:35
número float, lo cual no es muy correcto si no voy a meter decimales y normalmente la edad no se mete
01:02:41
con decimales, tienes 34 años o 35, no tienes 34 y medio o no se suele guardar así, por tanto, al hacer
01:02:47
esta caja, si la edad siempre van a ser número entero, pues lo ponemos aquí de tipo entero, vale,
01:02:53
sin ningún problema, pero hay ciertas limitaciones si no vamos usando los tipos de variables que hay
01:02:57
que usar, ahora mismo lo que va a hacer es poner Daniel, vale, espacio por este espacio que he puesto
01:03:02
aquí, no porque haya aquí en medio, vale, esto es lo mismo que escribirlo así, los espacios en
01:03:09
programación son sólo visuales, vale, al final lo que importa son los valores que vamos dando dentro,
01:03:14
entonces esto va a decir Daniel tiene de años 34, aquí aunque no sea de tipo texto, como entiende
01:03:21
que un número, si se está concatenando, porque está aquí unido a textos, lo que vas a querer ver es el
01:03:30
texto también, ¿no? y entonces al final lo que voy a hacer es, aparte de meterlo en variable, poner años
01:03:36
y punto, vale, es decir, va a poner Daniel tiene de años 34 y valga la redundancia, años
01:03:42
punto y ojo, aquí habrá que poner un espacio para que se pare de la anterior palabra y en años también
01:03:50
habrá que poner uno para que se pare de la edad, vale, para que se vea con espacio, vale, bien
01:03:56
construido, ¿no? guardamos y a ver si es verdad que está poniendo lo que yo digo, que va a poner
01:04:02
Daniel tiene de años, bueno, he cambiado de edad, habéis visto que he cambiado el interior de la
01:04:11
variable antes, a mano, 34 años, vale, de esta forma podemos ir uniendo distintos elementos
01:04:16
de distintos tipos, ¿sí? hasta aquí, ¿qué tal? ¿me vais siguiendo?
01:04:22
Sí, sí, vale, entonces, importante, al declarar una variable, el tipo de variable, el nombre de la
01:04:30
variable que nosotros queramos darle y luego asignamos el valor que tiene esa caja, vale, lo
01:04:37
que pasa es que muchas veces cuando vamos creando estas variables, vale, y voy quitando aquí, lo
01:04:43
dejo solo en esto, en su mínima expresión, has creado la caja pero no la has llenado de nada,
01:04:50
vale, cuando no llenas la caja de nada, interpreta en los números que es un cero, vale, que está vacía
01:04:56
pero a nivel práctico es un cero, vale, y en los textos pues no tiene texto también, lo interpreta
01:05:02
como un cero y en los de tipo float también es un cero, vale, podemos ir creando las cajas, vale, y
01:05:10
posteriormente, en algún momento de la ejecución, que a lo mejor no es al principio, cambiar su valor,
01:05:15
por ejemplo, hemos dicho, y fijaos que esto está dentro de la clase, que es lo que os he dicho, que
01:05:21
es el patrón que va conteniendo todos los comportamientos que vayamos haciendo, vale, pero luego
01:05:27
hasta que no hay un momento concreto al comienzo o al actualizar, estos son como datos, como variables
01:05:32
que estamos creando a nivel genérico, pero hasta que no sea en el momento del comienzo o que esté
01:05:38
dentro del update, realmente no se está ejecutando nunca, vale, más rápido, si yo cogiera este debug.log
01:05:45
y lo pusiera aquí, va a dar falla, pues dice, sí, muy bien, depura, pero ¿cuándo? ¿cuándo depuro?
01:05:50
Esta instrucción no es crear una caja para luego usarla, es algo concreto, que es lo que os he
01:05:56
dicho, que son los métodos cuando se usa estos paréntesis, una acción, algo concreto, se hace
01:06:00
cuando apelamos a algo que tiene estos paréntesis, aquí dice, vale, yo hago lo que tú me digas, pero
01:06:05
¿en qué momento? no me estás definiendo en ningún momento, por eso tiene que ir dentro de algún bloque
01:06:10
de momento de ejecución, vale, y también lo que podemos hacer es decirle, al iniciar el juego, el
01:06:14
script, quiero que número primero, vale, esta variable que he generado aquí, valga 7, vale, y aquí
01:06:22
qué ha pasado, y voy a volver a decirle que lo que quiero que me enseñe es número primero, y veis que
01:06:34
la misma palabra, yo cuando la marco en un sitio, como es la misma caja nombrada igual, aparece en
01:06:39
varios sitios, esto que estoy haciendo aquí, he declarado, he creado la caja, he declarado la variable,
01:06:43
al principio está vacía, vale, cero, vale, pero al empezar el juego, yo le he dicho, yo quiero que esta
01:06:51
caja valga 7, vale, y imprímeme aquí lo que hay dentro del número primero en la consola, por
01:06:55
tanto, lo que vamos a tener ahora es, pues si lo adivináis, un 7, no, qué pasa, que esto a lo largo
01:07:03
del juego, vamos a irlo cambiando, fijaos que cuando yo ya he declarado la variable y he
01:07:14
dicho de qué tipo es esa caja, vale, ya cada vez que hablemos de esa caja, ya no hace falta poner de
01:07:20
qué tipo es, ya lo hemos generado aquí al principio, vale, veis que por eso ya nunca más vuelve a poner
01:07:25
el tipo de variable, sólo se habla de la variable y se puede asignar a continuación o usarla, pero
01:07:30
no hay que volver a declararla, eso se hace una vez, que declarar, de hecho, es crear esa
01:07:36
caja la primera vez, luego ya es emplear la variable, ¿no? Entonces, ahora mismo enseña 7, pero
01:07:41
algo importante es que, por defecto, en estos momentos que estamos de programación, el código
01:07:48
se va a ir ejecutando de manera lineal, es decir, de arriba a abajo, igual que leemos nosotros, de arriba
01:07:55
a abajo y de izquierda a derecha, ¿no? Entonces, cuando vamos bajando, hemos declarado esta variable de
01:08:00
tipo entero, vamos bajando, va bajando y dice, ah, vale, al empezar la ejecución, enséñame lo que hay en
01:08:05
número primero y luego, aparte, pues decimos, vale, número primero vale 7. Antes ponía que era 7, ¿ahora
01:08:12
qué va a poner, qué va a enseñar en consola, qué número? ¿Ha cambiado algo, no? ¿Creéis que ha pasado algo?
01:08:19
Nada, no va a poner nada porque está debajo, ¿no? Eso es, hasta este momento, la variable vale 0,
01:08:26
nadie ha cambiado que valga 0, que es el valor por defecto, y luego, ya más adelante, pues pondrá 7,
01:08:34
¿no? Entonces, si vamos aquí, ahora mismo y ejecuto, pues pone el 0 como una casa, ¿vale? Veis que si es
01:08:39
solo una línea, además, también nos la enseña aquí, ¿vale? Que a veces también puede servir de ayuda, ¿vale?
01:08:45
Esto sirve para ver el orden de ejecución y que aquí podemos empezar a inicializar y decir,
01:08:50
número primero vale 2, pero después de valer 2, número primero vale 4. Se ejecuta esto, ¿vale?
01:08:59
Cuidado que si no, acabamos la instrucción con punto y coma. Luego, número primero vale 7 y luego voy a
01:09:09
hacer un debug log de vida persona. Ahora mismo, ¿qué va a mostrar? ¿Qué pensáis que va a salir en la consola?
01:09:14
El 4. Sí, pero he puesto otro debug log, otro enseñame en la consola, ¿no? Pues lo suma. No,
01:09:31
es decir, eso es lo que ha puesto Roberto. Primero hace esta instrucción y me enseña, va bajando,
01:09:50
aquí es lo último que le hemos dicho que vale este número primero, ¿vale? Pues aquí enseñará un 4,
01:09:57
seguimos bajando, ¿vale? Si a partir de aquí volvemos a usar número primero, valdrá 7,
01:10:02
pero bueno, aquí va a enseñar 4, aquí hemos dicho enseña 4, sigue bajando, bla bla, y dice,
01:10:06
y aquí voy a enseñar vida persona, que además ahora mismo vale 0. Entonces, Roberto, te has
01:10:10
equivocado en este segundo porque el 7 lo enseñaría si aquí pusiera número primero, pero es que estoy
01:10:18
pidiéndole que me enseñe vida persona, que está vacía, ¿vale? Lo enseño. Es decir, el juego no va
01:10:23
a consistir solo en que enseñe una cosa, va a enseñar o va a realizar muchas operaciones.
01:10:30
Entonces, bueno, os lo enseño y vais a ver que primero sale ese 4 y luego ese 0, ¿vale? Y una
01:10:33
se ha ejecutado primero y luego la siguiente. Os he dicho antes que las operaciones, lo haz algo,
01:10:40
son normalmente palabras con paréntesis, y entre paréntesis puede haber cosas o no. Vale,
01:10:46
pues aquí, al empezar el juego, le hemos dicho, enséñame lo que valga número primero, que vale 4,
01:10:51
y aquí lo que valga vida persona, que está aquí vacía. Si yo vida persona, aquí vale 85,
01:10:56
¿qué va a poner ahora en consola?
01:11:10
Nada, porque está por debajo 0. Es decir, la consola va a mostrar primero 4, ¿no? Y luego 0.
01:11:12
Vale, si yo pusiera... Esto es para ver que pilláis la lógica, vamos,
01:11:24
que sé que son preguntas simples. ¿Ahora qué pondría?
01:11:28
85. En la segunda línea, primero 4 y luego 85. Vale, lo vais entendiendo, ¿no? Básicamente,
01:11:32
puede haber varias operaciones, y aquí se están ejecutando dos. Entonces, el orden de ejecución
01:11:39
está en relación a las líneas que se van leyendo, ¿vale? Hasta aquí bien. Recordad que luego se nos
01:11:44
puede ir un poco la pinza con, vale, vida persona vale 85, pero aquí quiero que me lo enseñe más
01:11:53
número primero, ¿vale? Y aquí ahora mismo, ya última que hago de esto, perdonad, ¿qué pondría
01:12:00
aquí en la segunda línea? La segunda instrucción que le he dado al arrancar. 89. 4 y 89, ¿no? No.
01:12:09
No, 92. Efectivamente, porque aunque aquí ponga número primero, en este punto que estamos ya ha
01:12:19
superado esto y ha cambiado de valor lo que hay dentro de la caja, ¿no? ¿Vale? Esto es lo que va
01:12:26
a ir permitiendo luego tener en cuenta que hay operaciones que se van a ir haciendo fotograma
01:12:31
fotograma, que vayamos actualizando, subiendo, bajando cifras, que al final son la vida,
01:12:35
el tiempo de carga, el nombre del jugador que hemos metido en un campo. ¿Vale? Se va a ir
01:12:40
actualizando a medida que vayamos haciendo ciertas operaciones, ¿vale? Esto es un poco la base de
01:12:46
todo. ¿Vale? Una duda, Daniel. ¿Sí? Para el ejercicio de la unidad cero, entonces, sería mejor declarar las
01:12:53
vidas, o sea, declarar las vidas sin asignarle un valor y luego tú irle asignando los valores
01:13:01
dependiendo de si le afecta la bala, no le afecta, es mucho más cómodo de eso que ir poniendo que
01:13:05
restas o que sumas. Claro, tú declaras esa bala y luego tendrás que ir sumando o restando daño, y
01:13:11
daño puede ser un número ya establecido o uno aleatorio, que también se pueden hacer números
01:13:17
aleatorios. Vale. Hablar de la tarea cero, ¿no? Por un lado, ¿no? Sí, sí. Vale, esa tarea ya os digo que no va a salir de
01:13:22
momento ni de broma, si nunca habéis estado, pero si lo que quiero es que vayáis intentando resolverla
01:13:32
para con lo que vayamos viendo tal, ¿vale? Que hay cosas que no se ha explicado, ni se ha abierto el tema, ni
01:13:37
está todavía en el tema, ¿vale? Pero que es para que os pongáis con ello. Vale. Entonces, variables, el
01:13:43
concepto de variables ya vais viendo que es referenciar valores para moverlos por el código en
01:13:49
distintos momentos, ¿vale? En esencia es eso. Esto se va complicando, por supuesto. Vamos a la tarea 1, ¿vale?
01:13:54
Después de hacer ese prefab de la nave, que en principio no había mayor problema ya, quien lo
01:14:01
haya intentado pues le da alguna pista de algo que puede fallar, pero en principio es tener esa nave.
01:14:07
Lo segundo que pide es instanciar la nave, ¿vale? Instanciar más allá, que evidentemente si vamos a
01:14:12
usar variables, por eso lo has explicado, lo que vamos a hacer es una operación, que es, ya esto lo pone
01:14:17
en el tema, que es hacer una operación que es instanciar el objeto por código, ¿no? Para eso se
01:14:22
usa, al arrancar el juego, se puede poner aquí la operación instantiate, ¿vale? De todas las que hay.
01:14:28
Vais a ver que IntelliSense también nos va dando distintos iconitos, ya iré explicando mejor qué es
01:14:34
cada cosa, ¿vale? Pero en este caso, por ejemplo, es de un método o una función. Método y función, si lo iréis
01:14:42
escuchando mucho, son sinónimos. A veces diré métodos y a veces diré función, ¿vale? Y cuando me pongo
01:14:48
encima, vais a ver que IntelliSense, cuando me voy poniendo con la selección de la palabra, nos da más
01:14:56
ayudas aquí, nos da muchas ayudas siempre, ¿vale? Aquí ahora mismo nos dice, ahi va, bueno, pero
01:15:02
cuando a veces no salga, empezad a escribirlo otra vez, porque si no se pierde. Os ponéis
01:15:08
encima y pone instantiate, ¿vale? Pone como cosas que está heredando de estas librerías que os he dicho que
01:15:14
había aquí arriba, ¿vale? Y llegamos hasta la palabra instantiate y dentro de paréntesis pasan cosas, ¿vale?
01:15:20
Y pone más cuatro sobrecargas. Ahora vemos qué es eso. Os he dicho, cuando hay algo que lleva
01:15:26
una palabra, ¿vale? Y luego unos paréntesis, como aquí el estar, es una acción. En este caso, estar
01:15:32
es al arrancar lo que tengas dentro del bloque. Ahora vamos a hacer una, que esto son cosas que
01:15:38
tenemos que ir aprendiendo, es al arrancar, ¿vale? Dentro voy a instanciar un objeto, ¿vale? De momento
01:15:43
me da fallo, porque es verdad que esta operación, a diferencia de la de estar, hasta que, por ejemplo,
01:15:51
no le dices qué objeto, no sabe qué hacer. Y cuando no sabe qué hacer, estos programas se vuelven
01:15:55
muy locos y te dan error y dice, mira, yo hasta que no me digas qué tengo que hacer, pues no me voy a
01:16:00
ejecutar, ¿no? Entonces, cuando abrimos llave, una vez ya hemos puesto por completo la instrucción en el
01:16:04
debug log, vuelvo un segundo al debug, ¿vale? Hemos dicho, es la clase debug que dentro tiene la
01:16:11
operación log. Al dar a log, yo sé que es una operación que debe tener unos paréntesis para,
01:16:16
en este caso, en esta operación, definir qué tiene que mostrar el mensaje, ¿no? Y vais a ver que a
01:16:24
veces salen aquí, en el desplegable, dos flechitas, ¿vale? Una misma operación, una misma palabra que
01:16:29
esconde detrás operaciones, puede variar en el contenido de estos paréntesis, ¿vale? Debug log
01:16:37
puede, como hemos hecho hasta ahora, solo mostrar un mensaje, lo que pongamos ahí como mensaje, y
01:16:43
fijaos que, como nos va enseñando lo que tiene que ir dentro, tiene la misma lógica que cuando hemos
01:16:49
declarado la variable. Primero te dirá qué tipo de variable o de objeto tiene que tener dentro, y
01:16:55
luego cómo ha llamado, digamos, el software, el código, a ese mensaje. Es decir, ahora mismo, en
01:17:02
el debug log que hemos hecho hasta ahora, está diciendo que dentro tiene que haber un elemento
01:17:11
de tipo objeto, que dentro de Unity se querría decir cualquier tipo de variable, ¿vale? Y aquí
01:17:15
ha puesto un nombre, igual que hacíamos nosotros, genérico, que lo ha puesto el programador para que
01:17:22
sepamos que lo que hay que meter es el mensaje, ¿vale? Esto no significa nada, simplemente que nos está
01:17:25
dando la ayuda de que es un mensaje, ¿no? Si le damos aquí a lo que se llama sobrecarga, nos dice
01:17:30
hay otra opción que, aparte de poder introducir el mensaje separado por una coma, podemos meter un
01:17:35
contexto, ¿vale? Esto aquí no lo voy a hacer con esta operación, lo voy a hacer con la de instanciar.
01:17:40
Cuando yo abro el paréntesis de instanciar, hay hasta 10 de lo que se llaman sobrecargas, que son,
01:17:45
a esta palabra, esta acción, puedes hacer uso de ella hasta de 10 formas diferentes, y veis que
01:17:51
cada una, entre el paréntesis, va poniendo distintas opciones, cada una con sus peculiaridades, que ahora
01:17:58
vamos a ver, ¿vale? Si vamos a la primera, dice, pues tú aquí me puedes meter un objeto que se llama
01:18:04
original, ¿vale? Y abajo incluso pone una descripción, pone clona el objeto original y devuelve
01:18:10
un clon, ¿no? Es decir, que coge un objeto y lo clona en la escena, ¿vale? Bueno, pone el original es un
01:18:16
objeto que ya tengas, del que quieras hacer una copia, que en este caso va a ser el prefaz que
01:18:25
tenemos de la nave, ¿vale? Entonces, simplemente para que sepáis, vais a ir viendo que hay distintas formas
01:18:29
de operar con estos métodos, ¿vale? Y lo que hagamos normalmente va a variar dependiendo de lo que
01:18:35
pongamos aquí. Aquí, de la forma rápida, vamos a decir que lo que vamos a poner dentro de
01:18:42
este paréntesis es el prefab que va a instanciar, es decir, ahora mismo este código se va a
01:18:49
ejecutar donde esté este objeto empty, que hemos creado antes, y ahí vamos a generar un clon
01:18:56
del prefab que tenemos aquí preparado, de esta navecica que tenemos aquí preparada. Y claro, aquí
01:19:02
es donde empieza ya la cabeza a dar vueltas y decirle, vale, hasta ahora hemos hecho variables
01:19:10
que he creado aquí, le he dicho que son cinco, una palabra, pero ¿cómo meto yo aquí dentro? Pues que es
01:19:14
un prefab, ¿no? ¿Cómo meto aquí la nave, no? Vale, cuando vayamos avanzando en el temario, vamos a
01:19:20
ver que aparte de números enteros, de strings de cadena de texto o de floats, por ejemplo, hay más,
01:19:29
pero bueno, esos son como los más usados a nivel de primitivas de variable, hay otras que apelan
01:19:38
a conceptos que están dentro del juego. Uno, por ejemplo, es, y con mayúscula, esto ya veréis que se
01:19:44
puede escribir con y sin mayúscula, un transform, ¿vale? Un transform, veis que nos lo marca y dice
01:19:53
es una clase, bueno, y guarda la posición, rotación y escala de un objeto. Cuando generamos una variable
01:19:59
de tipo transform, por ejemplo, la lógica es igual que la que hemos hecho anteriormente. Hemos dicho,
01:20:05
primero hay que decir el tipo de variable que estamos creando y luego le damos un nombre nosotros
01:20:12
que queramos, pues posición referencia, ¿vale? Punto y coma. Ahora mismo vale cero porque no hay
01:20:17
nada, ¿vale? Pero tenemos aquí una posición de referencia de donde queremos que se instancie la
01:20:25
nave, ¿vale? Y voy a hacer otra cosa, ahora lo explico, que es que también se puede crear una variable de
01:20:32
tipo GameObject, que lo que va a hacer es que en su interior se va a poder guardar un objeto,
01:20:39
en este caso un prefab y va a ser mi prefab, por ejemplo, ¿vale? Ahora mismo lo que tenemos es, aunque no
01:20:44
sepamos muy bien qué quiere decir esto, una variable que por el tipo que es esta caja lo que va a
01:20:52
guardar son GameObjects que tenemos en la arcena. Está configurado, con estas librerías que
01:20:58
tenemos aquí, va a permitir, y de hecho fijaos que cuando leemos esto pone UnityEngine.GameObject
01:21:03
y os he dicho siempre va de lo general a lo concreto, ¿no? UnityEngine, si os fijáis, está aquí abierto, por eso
01:21:10
no hay que volver a abrirlo y gracias a esta librería, pues aquí tenemos este GameObject y cuando
01:21:17
metamos algo en esta caja vamos a referirnos a esta caja con mi prefab, ¿vale? ¿Qué tal? Ahora vemos cómo
01:21:23
seguimos, pero ¿más o menos me vais siguiendo? Sí, más o menos. Aquí hemos generado una caja que ahora
01:21:32
veremos cómo va a guardar el objeto para poder usarlo bajo el nombre en mi prefab, ¿vale? Y luego como
01:21:41
vamos a querer que esta instancia se ubique donde nosotros le digamos, pues hemos generado otra
01:21:47
variable de tipo transform y con transform es que podemos guardar los valores de
01:21:54
posición, rotación y escala de un objeto. De hecho, no es extraño que dentro de los componentes haya
01:22:01
uno que se llama transform que justo se ocupa de esos tres conceptos. Si nosotros
01:22:10
conseguimos que en una variable se guarde el transform, guardará todo lo que hay adentro, ¿vale?
01:22:16
Entonces ya podremos decirle a través de código, oye, lo que me genere es por donde esté este
01:22:22
transform y nosotros hemos guardado la posición de, en este caso esto, pero puede estar variado, ¿vale?
01:22:26
Entonces, para coger ciertos... A ver, voy a guardar... Y de hecho, así me sirve para adelantarlo,
01:22:31
normalmente va a haber variables de todos los tipos de componentes. Por ejemplo, esto también ya veremos
01:22:39
qué es. Meto un BoxCollider, voy metiendo aquí distintos componentes y veis que he generado
01:22:46
un nuevo tipo de transform que podré guardar la información de transform, pero también va a
01:22:50
existir, por ejemplo, el de RigidBody, que es el que antes os he enseñado que da gravedad, que hace
01:22:55
actuar al motor de físicas, ¿no? Y si yo empiezo a escribir aquí, no es casualidad que haya un objeto, un
01:23:00
tipo de variable que se puede llamar RigidBody, y esto lo llamo mi gravedad, el nombre que queramos.
01:23:06
Este último es gravedad. Yo voy a poder dirigirme a los distintos componentes guardándolos en su
01:23:12
propia caja, ¿vale? Hay que hacer alguna operación más, pero dentro de esta variable de esta caja voy
01:23:18
a poder meter cualquier cosa que esté dentro de RigidBody. Luego podré acceder a todas estas
01:23:24
propiedades. O BoxCollider, pues también voy a poder hacer cajas que se refieran a lo que haya
01:23:31
dentro de BoxCollider. Y aquí, pues BC de BoxCollider. Que os vaya sonando que estos son
01:23:37
componentes. Cuando aparecen además con este colorcito verde, que es el mismo de la clase, al
01:23:43
final, fijaos la lógica que CalculusTut, si nos fijamos, no deja de ser otro componente. Es un
01:23:50
nombre de componente. Esto es lo que se llama una clase en programación. Y las clases en
01:23:58
programación se pueden usar para incorporarlo como componentes. Entonces, todo componente, al final,
01:24:03
lo que es, es una clase que podemos referenciar aquí. Es decir, que si yo me meto, esto simplemente
01:24:09
espero que os ayude a ir comprendiendo. Si damos con la tecla control sobre algunas palabras, os
01:24:17
deja meteros dentro. ¿Veis que cambia el cursor? Y me puedo meter dentro. Y aquí hay un montón de
01:24:24
cosas que ya ha programado alguien, y por eso están las librerías, preparando el componente. En este
01:24:29
caso, GameObject. Pues ya hace muchas cosas, pero que ya están hechas por el programador. Entonces,
01:24:36
que vaya al padre, ahora aquí. Y Transport también tendrá sus historias ya preconfiguradas, etc.
01:24:45
Entonces, estas clases, aunque aquí veamos estos componentes con muchas opciones, esto es porque
01:24:52
ya hay un código que dice, quiero que enseñes... Bueno, no sé cuál lo había metido, pero mira,
01:24:58
por ejemplo, Cámara. Todo esto alguien ha hecho un código para que vaya enseñando cada uno de los
01:25:04
elementos. Al final, ahí. Y veréis que no me lo estoy inventando. Cuando aquí ponga Cámara,
01:25:08
y puedo llamarle Mi Cámara, ponerle un nombre, y aquí me meto. Y cuando me meto, habrá opciones
01:25:14
como... Es que hay tantas que no voy a poder verlo. Pero, por ejemplo, Fill of View. Y hay
01:25:21
ya opciones preconfiguradas. Pues si nos fijamos aquí, va a haber alguna que es Fill of View. Bueno,
01:25:28
todo esto se está viendo porque alguien lo ha programado antes para que ya estén
01:25:34
constituidas y tengan ciertos comportamientos. Esto, evidentemente, simplemente para que vaya
01:25:38
viendo qué clase y componente son sinónimos, en cierto modo, y aparte se pueda hacer cajas
01:25:44
variables con los valores que ya tienen estas clases. Entonces, ahora mismo lo que me interesa
01:25:50
es la clase que me permite guardar GameObjects, que son objetos, y también voy a decir una posición,
01:25:59
voy a crear una posición y, por tanto, voy a usar que la caja Transform también lo puedo
01:26:05
usar, el componente Transform de otro objeto. Hasta aquí, ¿qué tal? ¿Más o menos?
01:26:10
Vale, no sé si voy rápido o al contrario, si eso me decís. Entonces, claro, aquí a diferencia de
01:26:20
antes, no podemos hacer un igual y cinco o nave prefab, no se puede. Se puede hacer con código más
01:26:27
adelante, pero bastante más complejo que hacer una asignación por el igual. Entonces, aquí hay que
01:26:35
empezar a hablar de lo que, y esto está en el tema cero también, lo que se llaman los ámbitos de las
01:26:40
variables. Vais a ir viendo, si cogéis otro código, empezáis a ver que muchas veces le iréis
01:26:46
palabras como privado, private o público, que aquí ya viene uno, por ejemplo, porque al final
01:26:53
estos códigos llegarán momentos que queremos que se comuniquen entre sí. Es decir, imaginaos que yo
01:27:00
he puesto a cálculos un componente y luego el personaje tiene su propio script con su vida,
01:27:07
de 100, y es cálculo la que se ocupa de coger de otro componente la vida del personaje y en otro
01:27:14
objeto, en otro script, hacer operaciones. Entonces, digamos que cuando se vaya complicando el tema,
01:27:21
habrá que ir intercomunicando los distintos scripts y los códigos, pero no siempre nos va a
01:27:25
interesar que todo se comunique con todo, porque a lo mejor va a haber personajes con sus scripts,
01:27:32
va a haber enemigos con sus scripts, va a haber una pared que podemos romper con sus scripts y
01:27:38
todas tienen vida, digamos, cada uno la suya respectiva. Si al final empezamos a poner variables
01:27:43
como vida, porque no nos acordábamos, si todos los scripts diferentes tienen vida, al final nos
01:27:48
podemos equivocar. Podemos poner vida y referirnos a la vida de otro personaje. Entonces, para limitar,
01:27:55
esto es como una explicación así un poco chusca, pero bueno, a veces no nos interesa que los
01:28:00
distintos elementos se puedan meter unos dentro de otros. Entonces, para eso existe lo que se
01:28:06
llaman los ámbitos de acceso. ¿Eso qué significa? Que cuando vamos generando tanto clases como
01:28:13
variables, incluso como métodos, acciones, podemos decirle que algo se pueda ver desde fuera de este
01:28:23
script o no. Y esto básicamente significa que cuando generamos cualquier variable, igual que
01:28:30
os he dicho que una variable sin valor vale a cero, normalmente cuando declaramos una variable es
01:28:37
privada. Es decir, que sólo se va a ver dentro de esta clase. No lo va a poder ver otro código.
01:28:42
Aquí también, aunque no lo ponga, también hay un private. ¿Veis que no da error aunque lo escriba?
01:28:48
Porque se supone que por defecto lo pone como privado, para que sea restrictivo. Sin embargo,
01:28:53
en ciertos momentos nos puede interesar que una variable sea pública y lo puedan ver otros objetos.
01:29:01
Y en Unity no es sólo que lo puedan ver otros scripts. En Unity es que también sea público
01:29:08
desde el inspector de Unity. Voy a hacer una cosa. Voy a borrar, voy a comentar. En vez de borrar,
01:29:13
para tenerlo preparado, comento de un segundo. Si luego quiero usar, digo para que no dé error,
01:29:19
si en cualquier momento quiero recuperar cualquier cosa, quito el código y lo tengo ahí. Es una
01:29:23
práctica muy común, comentar para dejar de usar algo. Entonces, ahora mismo si me meto,
01:29:28
si me meto en el script CalculusTut, sólo hay un campo aquí, que es script, que viene por defecto,
01:29:35
cuando metemos un script para definir qué script es el que estamos asociando. No permite hacer nada.
01:29:41
Pero fijaos, y aquí ya va a empezar a abrirse un mundo de posibilidades, que si yo en vez de decir
01:29:47
que algo es privado, lo pongo como público, es decir, que puedan acceder otros scripts a este
01:29:54
elemento. Si yo lo pongo público y guardo, vais a ver que ahora dentro de este script se ha abierto
01:30:00
otro campo nuevo que se llama miPrefab. Voy un segundo aquí, que es el nombre de la variable.
01:30:09
Veis que él ya interpreta que aunque sea mayúsculas y minúsculas, lo separa bien con
01:30:14
sus mayúsculas, bien escrito, que está hecho todo a propósito. Y aquí deja un espacio que
01:30:19
podemos rellenar con algo que sea un GameObject. Haciendo públicas las variables es como, por
01:30:25
ejemplo, en este componente, en este código, alguien hace que aquí se puedan meter tres variables
01:30:31
llamadas posición, que luego además se referirá a ellas para hacer ciertas operaciones. Si, por ejemplo,
01:30:36
el transform, digo que sea público también, pues cuando lo hago público y guardo vais a ver que,
01:30:42
esperad un segundo que está cargando, pues está la posición de referencia y está esperando algo
01:30:51
que sea de tipo transform. Entonces, con esto lo que vamos a poder hacer es, desde el propio
01:30:56
inspector, arrastrar elementos. La mainCamera la meto en las dos. Fijaos, importante antes de
01:31:11
seguir, que aunque estoy arrastrando la misma cámara, en cada uno sale un iconito, porque en
01:31:20
cada uno está guardando un tipo de información. En uno está guardando la caja del GameObject,
01:31:26
porque es de tipo GameObject, y en otra, recordad que el componente transform tiene este icono,
01:31:30
está guardando la información de transform de este objeto. Aunque estemos arrastrando el mismo
01:31:35
objeto en cada una de las variables, dentro de esta caja de esta pieza de Lego, está guardando
01:31:40
una información distinta, que nosotros ya iremos usando a conveniencia. Entonces, esta es la forma
01:31:45
más rápida, las hay más, y de hecho en ciertos momentos esto es muy básico, digo que se tendrá
01:31:50
que buscar de otra forma, es la forma en la que tenemos para llenar estas cajas de la información
01:31:56
que nos importe. Ahora mismo, si tenemos aquí un Instantiate, y vuelvo a escribir el paréntesis
01:32:03
para que veamos, aquí el primer método dice Object, que es sinónimo de GameObject, aquí
01:32:11
podemos meter el objeto que queremos que se instancie, y ahora lo bueno es que si ponemos
01:32:18
aquí mi prefab, esa variable que hemos llenado con algo en este momento, a través del inspector,
01:32:22
ahora se va a instanciar algo cuando arranque. Es verdad que ahora mismo lo he hecho así de la
01:32:29
explicación, pero mi prefab lo que instancia es una cámara, que no es lo que me interesa. Yo lo que
01:32:34
voy a querer instanciar es la nave prefab. Voy a Cálculos, y el prefab lo puedo arrastrar a MainCamera,
01:32:38
y veis que se ha guardado aquí el objeto de nave prefab. ¿Esto qué significa? Voy a guardar
01:32:45
también aquí, voy al código, y aquí le estoy diciendo, en esta nave de mi prefab, al hacerlo
01:32:51
público a través del inspector, he guardado ese prefab, y cuando yo instancio, ahora sí que sabe
01:32:58
qué objeto es el que tiene que instanciar, porque se lo he atribuido ahí. Cuando guarde, vais a ver que...
01:33:04
Cuando guarde, al darle a Play, no está en ningún lado, pero me genera una copia... bueno, perdonad,
01:33:12
que como aquí le he metido a la nave antes un Rigidbody y tal para explicarlo, voy a quitar
01:33:19
dentro del prefab todo lo que le he añadido de componentes que ahora mismo no me interesa que
01:33:24
tengan, como el VoxCollider y el Rigidbody. Se ha auto guardado, salgo y vuelvo. A ver, detengo,
01:33:29
y cuando arranca el juego, porque está en el Start, me genera esta nave aquí. Así es como
01:33:36
ha sabido el programa que es esta nave la que tiene que hacerse, una copia. Si yo en vez de
01:33:43
la nave pongo el prefab cubo, pues sin hacer nada más, ya cuando le dé al Play, lo que se
01:33:49
va a instanciar es el cubo, no la nave. ¿Hasta aquí bien?
01:33:54
Ya empieza a ser mucho. Todo esto lo explica Álvaro en su vídeo, que aparte de que lo esté
01:34:02
explicando, si habéis visto todo lo que hay que ver, ya sale. Lo estoy diciendo un poco más
01:34:09
pausado para que se vaya entendiendo. Y para acabar, de las últimas cosas que voy a decir,
01:34:14
lo bueno que tiene esto es que como cada método tiene sus sobrecargas, el primero te lo origina
01:34:21
en el punto de origen de donde se está generando el script. Es decir, yo me pongo aquí y le digo
01:34:29
mi prefab como estaba haciendo y yo no tengo control de dónde se instancia, más allá de que se
01:34:36
instanciará donde esté el objeto padre, que es el que instancia. Es decir, yo ahora me pongo en el
01:34:41
0,0. Por cierto, cuando generéis un nuevo elemento, como un empty, cuidado que según dónde tengáis la
01:34:47
navegación, no lo genera en el punto de origen. Veis que yo genero uno nuevo y me lo he puesto en el
01:34:55
20, menos 1, menos 6. Si queréis empezar a hacer todo desde el 0, es muy buena práctica siempre
01:35:00
crear el objeto, a menos que lo hagáis a posta, claro, y luego reseteáis para que esté en el punto de origen.
01:35:06
Ahora mismo cálculos, que es el objeto que tiene aquí, veis que tampoco está en el origen y yo cuando
01:35:11
arranco el juego me lo está generando en una posición que tampoco es la que me interesa, que sería
01:35:18
la del origen. ¿Por qué? Porque si recordáis, cuando yo he hecho el cubo estaba movido del 0,0
01:35:24
y cuando he instanciado sin decirle un punto de referencia, que es lo que he hecho ahora en el código,
01:35:31
porque no le he dicho nada referente a posición, lo intentará hacer en el 0,0 pero lo está moviendo
01:35:36
en relación a lo desplazado que esté ya el prefab, lo que os he dicho antes de la boquilla y si lo
01:35:42
movíamos. Entonces si yo este prefab lo guardo y vuelvo aquí y lo vuelvo a lanzar el juego,
01:35:47
me lo deja en el 0,0. Ahora sí que está en el 0,0 este cubo. Si yo quisiera decir un punto del espacio
01:35:57
donde se puede ubicar el objeto, pues por ejemplo hago aquí un objeto que es la boquilla de la
01:36:07
pistola. De hecho, voy a hacer algo visual para que sea más fácil de detectar. Hago
01:36:15
este cilindro que es la pistola que se va a ir moviendo durante el juego y en un momento X voy
01:36:22
a querer que en este punto, cuando le dé a la barra espaciadora por ejemplo, se instancie la bala.
01:36:28
Este objeto está en unas coordenadas que no son el 0,0. Si yo ahora mismo le digo que se instancie
01:36:33
la bala en algún punto, pues lo mismo se va a instanciar en el 0,0. Pero si yo vuelvo otra
01:36:40
vez a cálculos y le digo la posición de referencia quiero que sea la del cilindro, que la voy a
01:36:49
llamar boquilla pistola boquilla. Cuando voy a cálculos, yo si arrastro boquilla a la posición,
01:36:54
yo quiero que instancie el cubo, va a instanciar en la posición de la boquilla. Estoy preparando
01:37:01
esto. Entonces, como esta posición, este transform, lo está cogiendo de la boquilla, hay otra opción
01:37:07
que decirle vale quiero que me lo hagas en... al ponerle coma veis que se pueden ir añadiendo más
01:37:14
parámetros y ahora la sobrecarga que me abre es la 2, que es la que permite meter dos valores.
01:37:19
Incluso si pusiera tres comas significa que puedo meter tres distintos valores, pero el que está
01:37:24
configurado para que lleve dos es una que es el objeto original y otra que es cuál es el padre
01:37:31
y la posición donde se va a generar, que es esta posición referencia. Cierro el paréntesis, guardo
01:37:37
y vais a ver que a diferencia de antes, ahora sí que cuando se ejecute el juego
01:37:45
la bala se ha hecho hija de la boquilla y además está en la misma posición que la boquilla, ya no
01:37:54
se hace en el 0,0. Entonces veis que de esta forma podemos ir relacionando, ir cogiendo la
01:38:01
información de uno y de otro e irla usando nuestro antojo. Habrá que ir conociendo poco a poco los
01:38:07
métodos, las acciones que podemos hacer, pero bueno esto es un poco como la base de ir moviendo
01:38:13
datos de un lado a otro mediante código. Solo me queda una cosita muy corta por explicar y por mí
01:38:19
por hoy creo que ya estoy y creo que tenéis información suficiente para hacer la práctica.
01:38:25
Me quedan dos cosas y ahora os pregunto qué tal. Imaginaos que yo en este Instantiate en vez de
01:38:30
hacerlo en Start lo pongo en Update. Corto y pego la línea y guardo. ¿Qué es lo que va a hacer? Pues
01:38:35
que va a generar una copia cada frame. Aquí se van haciendo millones. Esto normalmente no va a
01:38:41
interesar porque va a colapsar el juego de tantas copias que está haciendo, pero veis que dependiendo
01:38:50
de dónde se ubique pues hace la operación una vez al comienzo, otra durante cada fotograma y hay
01:38:55
más métodos de tiempo. Pero bueno estos son como los básicos que vienen. Luego última cosa. Os he
01:39:01
dicho antes que por nivel de protección, para que no se pueda acceder a una variable desde
01:39:08
varias variables que a lo mejor se llaman igual y luego un código muy grande, esto por defecto si
01:39:13
no ponemos nada al declarar una variable es privado. Yo lo he puesto público para que se vea en el
01:39:17
inspector. Lo he vuelto a hacer privado. Ojo que lo privado no existe y ahora no es solo que no
01:39:22
exista sino que ahora se ha perdido la referencia de los objetos. Es decir que ahora hago esto y
01:39:30
no se va a instanciar nada porque ha dejado de pasarse la información. Pero hay otra operación
01:39:36
digamos híbrida que es que yo puedo seguir queriendo. Esto es un poco para que veamos
01:39:42
si lo vais cogiendo. Que es que teniendo la misma protección privada, que otro script no se pueda
01:39:49
meter a esta variable, que sí que permita que se pueda operar con ella desde el inspector de Unity
01:39:57
para pasar los objetos. Esa operación es metida entre estos corchetes, lo que
01:40:05
se llama un SerializeField, campo serializado. Se pone antes del tipo de variable que es donde
01:40:12
se ponen los ámbitos. Y ahora las dos van a seguir siendo de tipo
01:40:19
privado. Lo puedo poner incluso de manera explícita aquí escrito. Pero siguen siendo privados cuando
01:40:25
veamos cómo se accede a otros scripts. No se va a poder acceder así de forma fácil, pero sí
01:40:33
que permitimos que aparezcan aquí para poder hacer este traspaso de información de elementos. Ojo,
01:40:40
veis que cuando he borrado y lo vuelto a poner están vacíos. Muchas veces va a dar error que
01:40:48
de pronto vamos a ver aquí algo vacío y pensamos que está. Este es el peligro que tiene de trabajar
01:40:53
desde el inspector. Por eso muchas veces se hace todo con código, que eso funciona siempre si está
01:40:57
bien hecho. Entonces habría que volver a decirle en cálculo, la boquilla es lo que voy a usar de
01:41:02
posición de referencia. Ahora la nave, por ejemplo, va a ser el prefab que se va a instanciar el objeto,
01:41:07
guardo y al ejecutar pues ya la boquilla va a tener, como está en el update, se va a estar
01:41:13
haciendo la nave en el sitio. Lo primero casi me va a interesar meter esto en el Start y ya está.
01:41:19
Más o menos lo que se os pide la práctica está todo explicado. Desde luego instancia y luego
01:41:28
tiene más sobrecargas. Podría poner otra coma. Incluso antes de decirle podemos poner si se
01:41:32
instancia en un punto concreto, con una rotación concreta, aunque coja la posición de manera
01:41:39
independiente. Bueno, pues ya hay más sutileza, pero esto ya es demasiado por hoy. Último de todo,
01:41:45
para que os vayáis haciendo la cabeza, y esto lo va a poner muchas veces en los temas, si ponéis
01:41:52
cualquier método, cualquier propiedad en Google, por ejemplo Instantiate, y ponéis Unity, os va a
01:41:59
remitir a la API o al manual de Unity. Y aquí es donde os da una explicación, esto está en inglés,
01:42:06
no está en español normalmente, de cuántas sobrecargas hay, su uso, descripciones, ejemplos,
01:42:14
cuando no sepáis cómo funciona algo, a medida que vayáis cogiendo más soltura, iréis entendiendo
01:42:22
mejor qué pone aquí, pero esto va a ser vuestro manual de uso frecuente y que hay que ir revisando
01:42:29
cuando tengamos problemas. De hecho, si en cualquier momento le dais al interrogante de un componente
01:42:36
concreto, por ejemplo el Transform, al darle se ha abierto la otra pantalla, pero me ha abierto aquí
01:42:43
la aplicación de Transform, con eso podéis ir viendo la ayuda. Está a veces demasiado extensa,
01:42:49
pero da mucha información útil. ¿Qué tal? Paro ya, dudas que os pueda quedar pendientes.
01:42:54
Todo bien. Si está todo bien, por hoy creo que no vamos mal. Otro día veremos más operaciones
01:43:03
también de números, pero bueno, esto ya lo iremos usando todo. Pero si os quedáis ya con la idea de
01:43:22
que es una variable, que es esto de público-privado así, grosso modo, para captar elementos, pues mira,
01:43:26
la tarea ya la podéis ir haciendo. La 1, la 0 todavía no. Si no hay dudas, pues los dejamos
01:43:32
por hoy. Voy a dejar de compartir un segundillo. No sé si me veis la cámara todo el rato
01:43:43
mientras estoy hablando o no. No sé si cuando comparto se ve, la verdad. No, vale. Bueno, tampoco
01:43:53
es muy importante creo que me veáis. Pues por mi parte poco más por hoy. Estamos con los de
01:43:59
prácticas, haciendo tutorías y vamos alternando. En dos semanas imagino que habrá la siguiente,
01:44:08
que además ya habré abierto el nuevo tema. En esa me centraré más en cosas de la unidad 0,
01:44:13
mientras vais leyendo la unidad 2, pero porfa, ir poniéndoos con los temas que están ya abiertos,
01:44:18
sobre todo el 1 en este momento y el 0, pues poco a poco también ir viendo qué cuenta ahí.
01:44:23
Que muchas cosas de ese tema, vamos, las hemos visto ahora. ¿Dudas? ¿Algo más?
01:44:28
No, todo bien.
01:44:37
Perfecto, chicos, pues lo dejamos por hoy, ¿vale?
01:44:38
Muchas gracias.
01:44:43
Venga, muchas gracias a vosotros.
01:44:44
Hasta luego.
01:44:46
Hasta luego.
01:44:47
Chao.
01:44:48
- Subido por:
- Daniel M.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 48
- Fecha:
- 16 de noviembre de 2023 - 20:10
- Visibilidad:
- Clave
- Centro:
- IES CIFP a Distancia Ignacio Ellacuría
- Duración:
- 1h′ 44′ 49″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 621.90 MBytes