Vamos a empezar por reformatear una parte de nuestro código para poder explicaros la aleatoriedad.
La verdad es que es muy cómodo esto de la tecla S, porque claro, pulsar la tecla y puedes testear
primero que la posición es la adecuada y segundo, que los animales son aleatorios.
Pero está claro que si dejamos que sea el usuario el que pawnee animales, igual no es pawnee a nada
y el tío vive más feliz que una perdiz.
Por tanto, lo que tenemos que forzar lo primero es que en base a algún criterio que ahora hablaremos
de ello, se ejecute este código.
Hasta ahora es dentro de la daiteke cuando el usuario decide pulsar la tecla S, pero yo creo que lo
adecuado sería basado en el tiempo que cada un segundo, cada dos segundos, cada tres segundos, cada
tiempo aleatorio.
Ahora que ya sabeis hacer tiempo aleatorio, os vais a hacer valores aleatorios.
Se expande un número determinado de enemigos 1, 2, 3 o 50.
Por tanto, vamos a empezar por reformatear este código y luego añadir la parte de la física que nos
va a dar la interacción.
Las colisiones, los choques y que de hecho, para los que queríais implementar el sistema de balas
en el juego de las naves o los coches o demás, será exactamente el mismo que veremos aquí mismo el
mismo.
También habrá que tener en cuenta un mensaje de game over si los animales llegan abajo del todo o lo
que sea, o se llega alguna condición de mover y así cerraremos el gameplay.
Vale, pues empecemos por el método de Spanic, método de Spanic, que es este trozo que tengo aquí
ya hace la función que toca.
El problema que tengo, si lo coloco dentro de la ley, es que voy a forzar que este código se ejecute
a cada fring.
Realmente la instancia acción no debería ser acada Frend debería ser cada vez que ocurra cierta condición
o que pasa una cantidad de tiempo, o que se hayan matado todos los enemigos o vete a saber tu que,
pero está claro que no debería depender de un frame.
Si no queremos que dependa de un frame, puede ir dentro de app.
La respuesta es no, porque estáis limitados a que todo el código deba ir ahí dentro.
Entonces, cuál es la función que vamos a utilizar?
Pues no será ninguna de la API de Unity, ni será el estar, ni será el aguay, ni el triguera, ni
ni nada de esto.
Será una función que vamos a crear nosotros y que le vamos a indicar a Unity.
Oye, llámala cada segundo, cada dos segundos, cada 5 segundos, cada x segundos.
Esto es lo que se llaman funciones invocadas.
Una función invocada es exactamente eso.
Tenemos una función que queremos que ocurra cada cierta cantidad de tiempo para llegar a ello.
Lo voy a hacer en varias fases.
La primera es la siguiente a ver, en heladerita esto funciona, va magnifico y no hay ningún problema.
Pero lo primero que he dicho es no puede ir en el Android.
No lo puedo ligar a un frame concreto.
Tiene que ser una función genérica.
Pues paso número 1 vamos a crear esa función.
Para ello fijaros que de momento teníamos el estar por un lado y por otro, vosotros en cualquier lado
de vuestro código podéis crear tantas funciones como queráis.
Yo normalmente suelo elegir que el inicio es para variables, para propiedades y que luego vienen funciones,
eventos y demás.
Y de hecho, casi siempre al principio dejo las de Unity estar a Android lo que sea.
Y no es hasta que no acaban todas estas, creo las mías propias.
Entonces, debajo de la doy y cuando digo debajo de ataque me refiero debajo de la llave que cierra
el adeu.
Si es la primera vez que programa descuidado que me he encontrado de todo en esta vida he encontrado
gente que me lo pone dentro de la doy.
No podéis tener funciones dentro de funciones y esperar que todo funcione correctamente.
Vale, entonces, después de la llave que cierra el ataque, cómo se cierra?
Utilizad Raider, veis las rayitas estas que se ven aquí?
Veis esta llave?
Si esta es la que abre y la seguís verticalmente, llegais a la que cierra?
Pues después de la que cierra aquí vais a crear vuestras propias funciones para crear una función.
Es como crear una variable nivel de protección público privado que va a devolver la función, va a devolver
un número, a devolver un string, no va a devolver nada a nombre de la función.
En este caso, qué creéis?
Que las funciones por regla general deben ser públicas o privadas públicas para poder usarlas?
Pues este es el caso donde va a ser privada para que nadie mas pueda.
Es todo al revés.
Por qué este método de esta clase?
El ayer es el único que tiene que ser capaz de escanear enemigos.
Nadie más tiene que ser capaz de escanear.
Entonces, si yo quiero que estas líneas de código que tengo por aquí solo las llame el input manager,
o sea, un manager y nadie más.
No me queda más remedio que declarar mi función como privada, porque si no desde el Player Controller
podría llamar a esta función y crear más enemigos desde un controller que no tiene ningún sentido.
Ya os dije que ante la duda, intentad que todo quede lo más protegido posible, que si realmente no
necesitáis exponer públicamente una variable, no lo hagáis.
Y en este caso, como al único que le importa cómo se expandían enemigos es el propio manager.
Esta función debe ser privada para que nadie más sea capaz de invocarla en ningún momento.
Entonces, playboys es la palabra reservada cuando se ejecuta todo esto y de hecho aquí lo podéis ver.
Aquí generamos algún número entero, algún string, algún vulcano, generamos algo que haya que guardar
o sólo es tu por un enemigo?
Por ahí ya está.
No generamos nada, no devolvemos un resultado al final de la operación.
Por tanto, esta es la palabra reservada bait boite, boitel ingleses.
Vacío y vacío significa no hagas nada, no devuelvas nada.
Podría ser que devolvieran algo.
Por ejemplo, podríamos devolver un número entero.
Podríamos devolver un string?
Podríamos devolver un float.
Habrá casos en los que habrá que crear funciones o métodos que devuelvan cosas.
Este no es el caso.
Este no va a devolver absolutamente nada.
Y luego el nombre del método.
Esto es lo que va a hacer.
Va a generar un enemigo aleatorio, de hecho, un animal aleatorio.
Vamos a llamar a la función recordad, empieza en mayúsculas siempre Camel Keys para nombrar funciones
yen here to spawn random animal.
Entonces fijaros que habéis creado una función privada para que sólo la use el propio manager que no
va a devolver nada y cuyo nombre es Spawn Random, que me he comido la n animal para poder spamear este
enemigo o este animal.
Necesitamos algo aquí.
Necesitamos algún parámetro?
Necesitamos alguna información adicional.
De hecho, cuando yo he utilizado aquí el código dentro del Apdayc, he utilizado alguna variable especial
a la que no tenga acceso?
La respuesta es no, porque el spawn reiche es una variable de la clase y tengo acceso X ruandesa.
Este valor es pomposo, es una variable de la clase cero, es un número boss, lo utilizo por aquí abajo.
Enemigos Tengo acceso a enemigos.
Animal índex Tengo acceso a Animal índex.
Tengo acceso a todo.
No necesito ningún parámetro adicional.
No necesito ninguna ayuda para suministrarse aquí dentro del paréntesis.
Por tanto, en este caso tenemos una función que no necesita de nada y no devuelve nada.
Solo hace cosas, pero no las devuelve.
Y lo que hacemos es vamos a copiar todo el código que habíamos dejado en el interior del input get it
down que de s.
Vamos a cortar y lo voy a copiar dentro de un random.
Fijaros que al final lo que acabo de hacer es todo lo que antes hacía dentro del IF Input Get Down.
Ahora lo hace un método llamado Spawn Random Animal.
Aquí en particular es muy importante sobre todos los que es la primera vez que programa o no tenéis
mucha experiencia.
Esto sí que es importante que os quede claro de buenas a primeras es los modificadores de privacidad,
publicidad.
Recordad que por defecto no poner nada y privado en lo mismo.
Recordad que sobran en general la palabra playboy.
Veidt quiere decir que no vais a devolver nada si aquí le pusiera string.
El método véis que se me queja, que se me pone aquí de color rojo porque le he dicho vas a devolver
un string.
Entonces, claro, si tengo que devolver un string al final del método, en algún lado tengo que hacer
un returned.
Hola, que hace?
Le tengo que devolver un string.
Si tuviera que devolver un número con decimales float.
Pues no puedo devolver un string voice que se me pone de color rojo porque esto no es un número decimal
tres coma catorce quince nueve dos seis cinco.
F Necesito devolver una condición booleana públic o vull y devuelve una condición booleana true o Fool's
verdadero o falso.
Veis que si vais a devolver algo primero, la cabecera lo tiene que tener claro.
Y segundo, al final del método tenéis que devolver esa cosa y eso es importante si no vais a devolver
nada, si no os hace falta absolutamente nada al final del método.
Pues lo que hemos dicho.
Bait y no devuelve nada.
Se acabó y vale.
Evidentemente si queréis recuperar lo que teníamos antes, cuando se pulsa la tecla s generar un enemigo
aleatorio.
Ahora dentro de estas llaves de Lir ya no hace falta escribir todo este código.
Veis que me hace bastante.
Basta invocar a la función Spawn Random Animal porque es un rando Mãnimas.
Ya es Parnia el animal, entonces lo único que necesito es dentro de este hacer un spawn random animal
que aquí ha aparecido Novais y así recuperaría la función aquí.
Esto es muy importante porque lo que estáis es ante las puertas de la programación orientada a objetos,
que lo que intenta es encapsular los comportamientos dentro de clases y que cada una de los comportamientos
sea auto constructivo.
Es decir, yo aquí voy a tener un método que me va a ser capaz de escanear un animal aleatorio y lo
voy a utilizar cuando al inicio, cuando pulse la tecla S cada 5 segundos, cada vez que desaparezcan
los enemigos, cada vez que ocurra algo, cuando puedo invocar a esta función, cuando me dé la gana,
realmente, dependiendo de cuando la invoque, aparecerá un tipo de gameplay u otro.
Pero entendéis esto?
Es un proceso que las primeras veces es muy duro, porque esto implica un nivel de abstracción, implica
un nivel de tener que crear una función que tiene un nombre, un apellido, tiene la cabecera y que
hace algo.
No entendéis esto se vale, pues una vez que lo tenemos, fijaros que ahora, tal cual lo acabo de hacer,
lo único que he hecho ha sido refactorización reescribir el código que antes iba a piñón dentro del
ADAPT en una función externa y que la estoy llamando dentro del ataque como antes.
El resultado es que si ahora guardo y le doy al play lo mismo que ocurría antes, seguirá pasando.
Ahora no nos lo habéis cargado.
Tranquilos.
Entonces, cuando yo vengo aquí al play le doy el mismo modo.
Cuando le doy a la tecla S Seguirán bajando enemigos aleatoriamente.
No lo habéis cargado, sólo lo habéis movido de sitio.
Vale.
Es como cuando cambias el cambias de armario y la ropa manga larga pasa a ser manga corta.
Pues lo mismo.
Antes teníais la ropa guardada aquí y ahora la tenéis guardada aquí abajo, pero es exactamente lo mismo.
Ahora bien, todavía necesito escanear con la letra S, que no es lo que quiero, verdad?
Por tanto, esta cosa que tenemos aquí ha estado muy bien mientras nos ha acompañado, pero no quiero
escanear con la letra S.
Por tanto, estas tres líneas de código pueden desaparecer si desaparecen.
El update que hace ahora nada es totalmente inútil.
Está vacío el cargo,
pero yo quiero que se invoquen enemigos, por ejemplo, cada cada segundo o cada dos segundos o cada
x segundos.
Pues lo que vamos a hacer es lo siguiente vamos a crear aquí dos variables que va a ser Privat float
start Dilthey dos segundos.
Este será el tiempo mediante el cual al inicio no va a pasar nada.
Dos segundos para concienciarnos de que empieza el juego y otra que será Float Spawn.
Interval el intervalo de tiempo cada cuánto queréis generar un nuevo enemigo.
Por ejemplo, 1,5 segundos.
Gracias a estas dos variables que tenemos aquí, ahora podré esperar dos segundos al principio respirar,
concienciarse, mostrar la pantalla de título, cualquier cosa que durante esos dos segundos no va a
ocurrir nada.
Y después de esos dos segundos, cada 1,5, cada 1,5, cada 1,5, cada 1,5, irá apareciendo un nuevo
enemigo en pantalla.
Entendéis para ello?
Esto es realmente sencillo.
No tiene ningún misterio.
Sólo hay que llamar a la función Invoke Rising.
Hay dos.
Invoke es el primer Invoke.
Es para invocar una función, para llamar a una función después de un intervalo de tiempo.
Y el invoke repiten es la que queréis.
Es invocar a la función repetidamente una vez tras otra, cada vez que se cumple un intervalo de tiempo.
Veis que aquí os aparecen los parámetros nombre del método, tiempo y ratio o tiempo de repetición.
Lo veis que necesita tres cosas para funcionar donde se involucre petting.
Entre paréntesis le pasamos tres cosas.
Primero, nombre del método, cómo se llama?
El método que queréis invocar es honrando.
Que para eso lo habéis creado entonces, entre comillas dobles de string.
Con lo que hay es la palabra spawn random ánima.
Esto simplemente es invocar a este método al spawn rando homãnima en coma.
El segundo parámetro es el tiempo que hay que esperar hasta la primera llamada.
Es lo que yo he llamado el estar Dilthey y el tercero y último es el ratio de repetición.
El tiempo de repetición es un intervalo cada cuánto quiero llamar al método susodicha.
Por tanto, fijaros Invoke, repiten al final del estar lo que va a hacer es cuando arranque el juego.
La primera vez que arranque llamar al método Spawn Random Animal después del estar Dilthey.
Después de dos segundos de cortesía, cada spawn interval cada uno coma cinco segundos.
El resultado es guardáis y os vais al editor.
Basta que le dais al play y no hacer absolutamente nada.
Yo no voy a utilizar la tecla S Voice al Play, ahí están las 5 vacas.
éstas deberían ir apareciendo, pues aparece un perro, aparece otro perro, aparece una cabra, otro
perro, un alce.
Ves que van apareciendo los enemigos?
Queréis que salgan más a menudo?
Recordad vuestro spawn manager tiene la variable hecho privada.
Ya tiene la variable que he hecho privada.
Spawn interval quereis que sea más difícil?
Spawn interval lo bajáis a 0,1 segundos, entonces ahora cada 0,1 segundos después de los 2 iniciales
de cortesía saldrá un bicho.
Fijaros que ahora esto será un festival de animales.
Después de los 2 segundos de cortesía, fijaros ahí.
Empiezan a aparecer todos a saco y se convierte en un juego mucho más difícil.
Por supuesto, lo entendéis?
Si en particular dejadme hacer un poco de limpieza, porque aquí a ver que la variable, por ejemplo,
Animal Index sea pública, ya no tiene ningún sentido.
Es un contador que utilizo internamente para generar aleatoriamente.
Puede ser privado private.
Y lo contrario, a lo mejor no a pesar de que haya hecho privados.
El tiempo de inicio y el spawn interval, a lo mejor estos dos los quereis ajustar desde el editor hasta
que os quedan los valores que os gustan.
Entonces esto serían los casos perfectos donde yo pondría el modificador que era Liset FIL para que
aparezca en el editor de Unity y podáis serializada.
Podáis ajustar el valor, incluso acordaros que vimos el líder el otro día en el Reintsch.
Aquí lo podéis poner.
Mira el estar Tilley que sea un mínimo de dos segundos y un máximo de 5 segundos, por ejemplo.
Y el otro el spawn interval.
Pues mira que pueda bajar hasta un mínimo de 0,1 segundos y máximo 3 segundos.
Entonces fijaros que así vosotros podéis modificar ese spawn interval o podéis modificar el estar Dilthey
y tener el campo a pesar de ser privado, a pesar que solo el spawn manager podrá acceder a él accesible
en el editor para mover el líder en cuestión.
El resultado es que si guardáis éste o vais al editor, aparece bueno.
Desaparecerá el Animal Index, porque lo he puesto privado y deberían aparecer estos dos que acabamos
de decir los dos días del inicio y del final.
No veis el estar Dilthey, el Interval?
Estáis aquí al play.
Y una vez que lo tenéis después del Pilay, el espacio intervalo de las suyas.
Y si lo queréis reducir o lo queréis aumentar o lo que sea.
Aquí tenéis el líder, la mar de monos que se encargan de hacer todo esto por vosotros, como podéis
ver aquí.
Entonces aquí puedes jugar con los parámetros y cuando tenéis claro cada cuánto queréis esperar, cada
cuántos enemigos queréis que salgan, etcétera, etcétera, etcétera.
Aquí podéis dejar los valores finales en el código.
Vale, pero bueno, que lo podéis dejar así con líder, porque os ayudará mucho a hacer a que sea más
fácil la configuración.
Fijaros que también a medida que vamos automatizando todo, primero, el programador tiene que hacer
menos cosas de cada vez.
Ya no tengo que pulsar la letra S para que salgan enemigos.
Lo acabo de automatizar.
Cada vez me puedo centrar más en cómo se tiene que jugar al juego que en el apartado técnico que lleva
a la creación de la escena.
Esto lo entendemos?
Si preguntas, no?