Vamos a empezar por la posición mala, por la ubicación en la que se instancia los enemigos.
Aquí habéis visto que cuando he llamado a instancias le he pasado el enemigo, le he pasado la posición
y la rotación.
Si me vais a permitir que lo que es la posición, en lugar de tenerla aquí, la saque fuera una variable.
Fijaros, lo único que hago es dentro del género, un vector.
3.
Le voy a llamar a esto Spawn Box la posición de Spanic y la voy a igualar a lo que antes estaba dentro.
A toda esta cosa igual o aquí ya está.
Lo único que he hecho lo he sacado fuera en una variable para quebrar el instante.
Tomé la espada pocas veces que le he sacado fuera en una variable es para que sea más fácil de ver los
cambios que vamos a hacer.
Fijaros que ahora aquí no hay nada de aleatoriedad.
Esto es generar la posición donde va a aparecer el próximo enemigo.
Esta posición hasta ahora fijaros que no es aleatorio, es predecible, siempre va a ser la misma.
Lo que hay que hacer, hemos dicho, es aleatorio la coordenada X, que en lugar de ser cero esté entre
un mínimo y un máximo.
Si os acordáis, ayer ya vimos que para lo que era el control del player había unos límites entre los
que nos podíamos mover cómodamente, que era de entre 15 y 15.
Os acordáis?
Aquí podemos usar el mismo enfoque.
Podemos definir entre un mínimo y un máximo que queremos utilizar para el EXPANDING, de modo que aquí
arriba definimos dos variables nos vamos a definir con una privat float y le voy a llamar spawn range
en el eje de las X.
Si ayer utilizábamos 15 para el valor de movimiento, aquí voy a ser un poco más generoso y voy a ir
hasta 20.
Por qué?
Porque lo que quería era que el personaje se me quede en la pantalla, pero nadie me dice que no se
pueda haber un trocito de enemigo en el borde de la pantalla.
Entonces, a ser un poco más benévolo, voy a colocar Spawn Reiche en X igual a 20, que me servirá
precisamente para establecer los límites e incluso si queréis, es un buen momento para establecer aquí
privat float spawn position Z, que es la posición exacta, exacta, exacta en la que va a ver nuestro
Spanic.
Y aquí hay dos opciones o la ponéis a piñón 28 opción número 1 o no la configuras.
Y en el START hacéis exactamente esto que he hecho una vez.
Es decir, dentro del método estar, yo tomo el spawn position Z y lo igualo a la posición donde está
el manager.
Acordaros dis punto transform punto opposition punto z.
Lo veis de este modo?
Os vais a ahorrar cada vez tener que escribir esto que es muy largo y me da pereza porque todo esto
ahora pasa a ser de spambots.
Z Lo veis?
El objetivo al final es intentar evitar accesos innecesarios a variables.
Fijaros que aquí lo único que hago es spawn.
Posición Z Guardo la posición zeta donde está mi manager y la guardo una vez.
Luego esa variable la voy a utilizar constantemente dentro del ataque, como podéis observar aquí lo
que pasa que solo la guardo una vez y así, en lugar de tenerle que decir al manager cada vez Oye dónde
estás?
Oye, dónde estás?
No va a cambiar de posición el manager?
El manager no se mueve.
Guarda ese valor una vez y lo utilizáis.
Esto es fundamental.
La gran mayoría de chapuzas que conozco en Unity pasan por nunca cachear variables.
Cachear las es guardarlas.
Entonces, si vosotros siempre hacéis Transform Position Z, le estáis exigiendo al motor.
Oye tío, dame el transform, dame el positions, dame la Z de este bicho y se lo estáis pidiendo en
el Aboitiz se lo estáis pidiendo 60 veces por segundo o más si lo cacheda en una variable.
El motor ya no necesita pedirle al manager dónde estás?
Dónde estás?
Ya lo tienen.
Esta variable y esto es mucho más barato, es mucho más económico y gasta mucho menos recursos.
Batería y CPU a costa de espacio en disco.
Siempre os vais a probar, a probar, siempre vais a encontrar esta dicotomía que es espacio y performance
siempre.
Si queréis que algo sea rápido, no?
En disco, porque leer en disco es pesado.
guardáis muchos datos en disco, pues no los podés tener en tiempo real.
Siempre es una mezcla entre estas dos cosas.
Si vosotros queréis acceder a la última posición, a la última posición, porque necesitáis mucha precisión,
vais a necesitar de muchos recursos, de mucha RAM.
A lo mejor no con un objeto, pero cuando tengáis 20, 50, 000.
Si entonces siempre que podáis cachear valores de una variable, como he hecho aquí con este spawn position
CETA.
Esto es crítico y de hecho, si alguna vez os presentáis al examen de Unity.
Muchas de las preguntas acerca de este tipo de performance.
Cuál de los siguientes códigos es más optimo?
Siempre es el que evita acceder a cosas externas a cosas de fuera dentro de una de quien no ha podido
cachear en una variable, como hemos hecho nosotros en el estar siempre va a ser mucho más óptimo que
el otro o siguen nombrando muchas cosas para mejorar la calidad óptima de vuestro código?
Esto es una de las básicas.
Cualquier cosa que necesites acceder, cualquier cosa que necesitáis consultar siempre en una variable
en el estar y hacer uso de esa variable, siempre es mucho más barato.
Es más económico que cada vez que pases por el español.
Preguntar dónde estás Mãnager, dónde estás Mãnager, dónde estás?
Mandaria?
Queda claro esto es muy importante.
Vale, pues ahora que tenemos el respawn position zeta, la que no tenemos, está claro, es la X para
generar la X.
En este caso lo que vamos a usar es una variable random range.
La variable random range sirve para obtener números aleatorios, entonces la X ahora pasará a ser un
random con la R mayúscula punto salud.
Y hay que indicar aquí el rango entre qué número más pequeño y número más alto queréis obtener este
valor aleatorio.
De hecho, recordad que yo he colocado aquí Les Pawn Ranger X, que era 20.
La idea de ese 20 es que el número laudatorios se genere entre 20 y 20.
Por tanto, mi random range será desde menos Spawn Reiche X y Spawn Rains X hasta Spawn Range X.
Lo veis?
Por tanto, fijaros, la X será un número aleatorio entre menos spawn 20x y spawn raid x.
Entre nosotros un número entre 20 y 20 la Y griega será cero, no tendrá la altura y el spawn position
Z será la que estuviera al manager al inicio.
Fijaros también que aquí yo podría haber puesto Random Reiche entre 20 y 20.
Tal vez es más claro ahora, pero no es escalable.
El día de mañana el escenario cambia.
Queréis que el tamaño de Spanic sea mayor o menor?
Tener que venir a buscar el 20, cambiarlo por otro número, mientras que en este caso utilizáis a Spawn
Ranger X?
Pues es exactamente lo mismo.
Dime
si necesita de una librería que en teoría la habéis añadido automáticamente.
Pues si no se os añade automáticamente, es aquí un punto random.
En teoría debería salirte automáticamente.
Lo que pasa que como hay varias librerías random, puede ser que Setelich el sistema Unity.
Si es el random de System o el random de Unity Engine.
Entonces, en este caso, ante la duda, cuando no lo importas te debería dar un error y si no te lo
da es porque has importado la que no era.
Es que a mi no me lo da.
No me da ningún tipo de error.
Esto es porque él entiende que por defecto, si yo no le digo nada, es el random de Unity Engine.
El problema está cuando aquí me ha importado porque le ha dado la gana.
System System tiene una clase random que no es la que queremos y ésta es la que da problemas.
De hecho, ves que aquí está en rojo.
Ahora hice referencia ambigua.
No sé si es el random de sistema o el random de Unity Engine, como yo he importado y Unity ya ni ha
importado System.
Ambos tienen su random.
El que nosotros utilizamos siempre es el del motor.
El sistema lo vais a usar muy poco.
El sistema es cosa de sistema operativo, acceso a carpetas, accesos a caché, ficheros, visualización,
serialización y demás.
Lo normal es que el 99 por ciento utilizáis el motor, el Unity.
Por tanto, en tu caso, si te sale este error, borra lo que pone.
Ellos insisten y os insisten y ya te debería pillar automáticamente el de Unity Engine.
Si no, el truco que hace y Unity es indicar using la función random.
La que habéis visto antes.
E igual hay Unity ya en punto random.
Esto se llama Nîmes países.
Carota había cogido la de System.
En general, esto de aquí los países son muy útiles, porque si tú quieres que la clase random se llame
random, se llame Antonio Banderas.
Tú lo que haces es mirar mi librería.
Antonio Banderas será ya un punto random, en cuyo caso aquí, en lugar de invocar a Random, podríamos
utilizar a nuestro Antonio Banderas.
No tiene ningún sentido, pero se podría.
Podríais pasar todo el motor a castellano?
Podríais poner using aleatorio igual a esta cosa y hacer aleatorio y cambiar raich por rango, etcétera,
etcétera, etcétera y programar en castellano.
Si no lo hace, nadie lo podría hacer.
Que sepáis que esto se llama Naima Países.
Las librerías se llaman Nîmes países.
Entonces yo lo dejo en Rando Punto Rains y así vais a tener que cada vez que se genere un enemigo lo
hará en una posición aleatoria X en particular.
Fijaros que este vector que hemos hecho aparte lo único que hacemos es luego utilizarlo para la posición
del Spanic.
Lo veis aquí?
Solo lo utilizamos para esto.
Para nada más.
Realmente entonces en una primera fase, si ahora volvemos aquí y pulsamos varias veces la tecla S,
cada vez el enemigo que es Pawnee debería hacerlo en una coordenada X diferentes.
Estos son los cuatro que se generaban al inicio.
Si ahora pulso la mesa de la BAKAR, no sé dónde, en medio saco otro, a ver dónde me sale la siguiente
Bauçà no me sale.
Si no me sale es que se ha salido de la pantalla correcto.
Está fuera de la pantalla.
Voy a generar unas cuantas para que veáis que no os engaño, lo veis, que cada uno sale donde le da
la gana.
Ahora salen aleatoriamente.
Parece una estampida.
Entonces, cuando púlsares aquí la s.
La idea es esa que cada vez os van a salir los animales en una posición u otra.
Lo que pasa que todos son el mismo.
No hemos arreglado la mitad de la aleatoriedad, que era la aleatoriedad de la posición.
Ahora que os he contado esto, fijaros en un pequeño detalle la clase random range que acabo de utilizar.
Dejadme que saque en una variable más.
Dejadme poner aquí x RAM y éste X RAM será un float x RAM igual a lo que había dentro.
Sólo le he sacado en una variable con una variable por un motivo este random punto.
Raines cuando lo escribís.
Veis que la propia documentación me dice si me das un float mínimo y me das un flou máximo, yo te voy
a devolver un flou aleatorio entre el mínimo y el máximo.
Inclusive los dos lo veis mi entrada.
El spawn es un número float.
Si por tanto, como mi pawn reinicié x es un número decimal, le puedo poner aquí la f.
Si lo queréis enfatizar más, la respuesta a la posición aleatoria será un número con decimales entre
menos 20 y 20 se guardará en un flop.
Esto lo veis.
Sin embargo, el Random Reintsch tiene otra cosa muy útil.
Tiene un segundo método aquí abajo que pone Integer Min Integer Max y devuelve un número entero, es
decir, si lo que le dáis son números con decimales, él os genera un número aleatorio con decimales.
Si le dais un número entero, él os genera un número entero aleatorio entre el mínimo y el máximo.
De hecho, el mínimo e inclusive el máximo creo recordar que no lo mete.
No me cabe en teoría.
Por tanto, cuando quiero seleccionar el animal index que tenía por aquí, que es lo que tengo que hacer,
pues es muy simple este animal index tiene que ser un número aleatorio entre el mínimo y el máximo disponibles.
Correcto.
Por tanto, si pulsamos la tecla S hemos generado la posición aleatoria.
Pero es que ahora además podemos generar el animal index aleatorio porque el animal index es un número
entero y por tanto, lo único que debo hacer es asignarlo a Random Reintsch, lo que en este caso para
el Random Range no voy a utilizar números con decimales.
Voy a utilizar números enteros entre cero.
Y cuál es el último animal que puedo general que puedo generar?
El que está en la posición máxima de la raíz y la raíz tiene ocho posiciones, el octavo, octavo,
menos uno.
Por tanto, aquí hacemos el Spanic entre cero y como era esto, enemigos punto lek.
Entonces fijaros que aquí Animal Index va a ser un número entre cero y Emmys.
Leng nunca va a llegar al último, será menor stricto.
Y cómo le estáis generando vosotros por código?
Este CHEC que he puesto antes manual ya no tiene sentido.
Si yo genero un número aleatorio entre cero y mis leng, es posible que el número generado sea negativo.
No es posible que el número se pase de enemigo?
No, porque el propio método me va a devolver un número entero, porque las entradas son enteras entre
cero y la dimensión del número de enemigos.
Por tanto, aquel FLAC que habíamos puesto nosotros este CHEC, si el animal era mayor o igual que cero
menor que la longitud, me sobra si me sobra Elif.
Por supuesto, me sobra el asociado a S.I.
Porque nunca voy a caer en este error y esto significa que lo que antes eran variables gestionadas por
el programador, ahora son automáticamente manejadas por el código.
Yo no tengo que hacer absolutamente nada porque es el propio Código quien generará el índice aleatorio
del enemigo.
Random Range aplicado a flows os devuelve un número float aleatorio, un número con decimales perfecto
para posiciones rotaciones escala random range.
Utilizando números enteros me devuelve una posición entera ideal para posiciones.
Entendéis esto?
Por ejemplo, los típicos juegos donde al final del nivel te dan un minijuego que te puedes seleccionar
una caja u otra.
En una caja no hay vidas, en una hay una vida en una y cinco vidas.
El número de vidas puede ser un número aleatorio obtenido con un random raich, por ejemplo.
Vale, pues esto significa que si guardamos, venimos aquí y le damos al play.
Fijaros cada vez que le dé a la letra s me va a cambiar el animal.
De hecho, ves que aquí por defecto pone Animal Index Zero.
Cada vez que le dé me generará un animal diferente.
El cero cero uno uno dos cero.
Voy a ir generando.
Vais a ver que el número se va moviendo en la cajita, lo veis y veis que los animales que vienen cada
vez son diferentes.
La posición es aleatoria y los animales son todos diferentes.
Lo veis que cada vez aparece uno totalmente diferente al anterior.
Si por tanto dos niveles de aleatoriedad uno en el tipo de enemigo y otro en la posición en la que se
instancia el enemigo.
Pero esto sí que es muy importante.
Porque tú que me habías pedido?
Oye, yo quiero hacer un juego de naves donde los meteoritos aparezcan en posiciones aleatorias o no
sé qué obtienes una posición aleatoria en un borde de la pantalla o en otro borde que vaya en dirección
al enemigo o que vaya en dirección hacia abajo, a la izquierda, a la derecha o dirección también aleatoria.
Son dos random rindiese.
Al final tú decides los rangos en cuestión e incluso tengo cinco tipos de asteroides, 10 tipos de asteroides
o naves o lo que sea.
Eliges una u otra aleatoriamente.
Del mismo modo que he hecho yo aquí con el Animal Index, fijaros que lo que os enseño son técnicas
genéricas de desarrollo de videojuegos.
Aquí lo hacemos con un con un videojuego que es.
Pero que este código tú lo copias, lo pegas en tu videojuego, lo adaptas.
Como hemos visto, creas tu arráiz de cosas insustanciales y esto funciona.
Es mas, os acordais que antes os he dicho si quereis que un enemigo se genere muchas mas veces que
el otro, arrastrarlo a un monton.
Voy a poner aqui 40 al poner 40 el ultimo se ha copiado muchas veces lo veis?
Entonces como veis hay mucha probabilidad de que salga un perro y bastante, mucho menos que salga alguna
cosa que no sea un perro.
Lo veis?
Si le doy al play, cada vez me va a generar un bicho aleatorio entre 0 y 40.
Pero claro, como la gran mayoría son perros, pues fijaros el 9, el 37, el 38, el 22, el 12, el
17 al 19, el 17, el 3, el 39, generando veís que casi todos son perros porque hay muchos perros
y si aparecen alguno del otro.
Pero claro, por cada uno de los otros la probabilidad de sacar un perro es 10 veces más y esto lo podéis
hacer sobretodo si algún enemigo es más rápido que otro, es más fuerte que otro.
Tiene algunas características para cambiar el gameplay en un juego estilo orcos de Mordor o similares,
pues los orcos más débiles podrían ser los más frecuentes y a medida que son más fuertes, más complicados,
que sea más probable encontrarte un bicho de esas características.
Lo entendemos.
Si vale, perfecto.
Entonces os dejo esto con 4 enemigos como antes y ya tenemos oleadas de enemigos, ya tenemos balas,
tenemos muchas cosas, todavía nos falta alguna cosita.