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