#9 Pedestal en posición aleatoria. Random.Range

Información actualizada sobre esta entrada

Este artícu­lo pertenece a una serie que con­siste en hac­er un juego sim­ple en primera per­sona acer­ca de encon­trar obje­tos den­tro de un laber­in­to. Es una de mis primeras series de cuan­do empecé el canal, aho­ra he mejo­ra­do mucho este proyec­to y puedes descar­gar el códi­go fuente para impor­tar­lo en tu pro­pio proyec­to de Uni­ty. Algún día vamos a hac­er un remake de esta serie, suscrí­bete a mi canal para estar al tan­to del nue­vo con­tenido sobre Blender, Uni­ty y pro­gra­mación.

Sígueme en itch.io y descarga el código fuente de este proyecto

PUEDES TESTEAR ESTE JUEGO AQUÍ. TAL VEZ TARDE UN POCO EN CARGAR
🔻

MOVEMENT: WASD CAMERA LOOK: MOUSE

Introducción al artículo original

En este artícu­lo vamos a ver una estrate­gia para colo­car un obje­to en una posi­ción aleato­ria del laber­in­to usan­do el méto­do Random.Range y el pre­fab del pedestal con la espa­da que se creó en el segun­do artícu­lo del proyec­to, clic aquí para descar­gar los archivos y ver cómo con­fig­u­rar los prefabs.

No podemos colo­car el obje­to en cualquier posi­ción elegi­da al azar, debido a las pare­des del laber­in­to, que quizás en el futuro nos interese gener­ar­lo de man­era pro­ce­dur­al. Así que para lograr el obje­ti­vo debe­mos analizar la geometría de las piezas y pro­pon­er una solu­ción acorde.

Página principal del proyecto

Vídeo relacionado a este artículo


Tam­bién te dejo este video en el que hablo sobre Gen­eración de Datos Aleato­rios en Uni­ty, está divi­di­do en dos partes, en la primera vemos cómo gener­ar val­ores enteros y reales den­tro de uno o más inter­va­l­os y en la segun­da parte vemos cómo gener­ar otras estruc­turas de datos como Vector2, Vector3, Quater­nion y Color.

🟢 Gen­eración de datos aleato­rios parte 1
 

🟢 Gen­eración de datos aleato­rios parte 2
 

Descripción del problema

Nece­si­ta­mos que el pedestal con la espa­da incrus­ta­da que se obser­va en la figu­ra 1, pue­da apare­cer en cualquier parte del laberinto.

En el video 4 de la serie resolvi­mos un prob­le­ma sim­i­lar para colo­car al per­son­aje en una de las puer­tas al ini­ciar el juego. Aquí dejo el artícu­lo por si quieres echar un vistazo.

pedestal con espada instanciado aleatoriamente en un laberinto utilizando random.range unity
Fig. 1: El pedestal con la espa­da aparece en una posi­ción aleato­ria del escenario.
miniatura video 4 del juego del laberinto, colocar personaje aleatoriamente en escenario, unity
Fig. 2: En el video y artícu­lo 4 colo­camos al per­son­aje aleato­ri­a­mente en una de las puertas.

En el video 4 uti­lizamos emp­ty GameOb­jects para des­ig­nar posi­ciones pun­tuales en las cual colo­car el pre­fab del personaje. 

En este caso esta­mos bus­can­do una solu­ción un poco más com­ple­ja, primero vamos a ele­gir una de las piezas que com­pone­nen el laber­in­to. La pieza que eli­jamos será un dupli­ca­do de algu­na de las piezas que se obser­van en la figu­ra 3.

piezas simples que forman un laberinto para un prototipo en unity
Fig. 3: Estas son las piezas del laber­in­to en las que se puede caminar.

No bas­ta solo con ele­gir la pieza, nece­si­ta­mos obten­er una posi­ción den­tro de ella y esta posi­ción debe ser den­tro de una región en la que se pue­da cam­i­nar. Estas regiones las vemos en la figu­ra 4. 

piezas simples que forman un laberinto para un prototipo en unity
Fig. 4: En estas regiones podremos colo­car el pedestal.

Al analizar el prob­le­ma vemos que ten­dremos que tomar varias deci­siones aleato­rias y sería deseable que la solu­ción que pro­pong­amos sea inde­pen­di­ente de la can­ti­dad de piezas que ten­ga el laber­in­to. Es decir si agreg­amos más piezas de la figu­ra 4, estas se agreguen automáti­ca­mente al sis­tema de selección.

Estrategia propuesta — Definir segmentos

Dada una de las piezas de la figu­ra 4, somos capaces de trazar una o dos líneas inter­nas por donde el jugador puede cir­cu­lar den­tro de la pieza.

Con­sid­er­e­mos los extremos de estas dos líneas. En la figu­ra 6 están iden­ti­fi­ca­dos cua­tro pun­tos que serían los extremos de estos dos segmentos. 

Estos pun­tos podríamos rep­re­sen­tar­los con Emp­ty GameOb­jects como hijos de la pieza.

encrucijada de laberinto con texturas
Fig. 5: Pieza encru­ci­ja­da del laberinto.

encrucijada de laberinto con texturas, puntos extremos marcados
Fig. 6: En los extremos de la pieza colo­camos 4 puntos.

En la figu­ra 7 vemos dibu­ja­dos estos dos segmentos.

Entonces podríamos colo­car el pedestal con la espa­da en cualquier pun­to de uno de los segmentos.

encrucijada de laberinto con texturas, puntos extremos forman dos segmentos
Fig. 7: Estos pun­tos for­man dos seg­men­tos, hor­i­zon­tal y vertical.

En primer lugar ele­gire­mos uno de los dos seg­men­tos, supong­amos el seg­men­to B (figu­ra 8) for­ma­do por los emp­ty GameOb­jects B1 y B2.

Luego tomare­mos un pun­to aleato­rio entre los dos emp­ty GameOb­jects, figu­ra 9.

encrucijada de laberinto con texturas, uno de los segmentos se eligen al azar con random.range
Fig. 8: Supong­amos que elegi­mos el seg­men­to B.

encrucijada de laberinto con texturas, se elige un punto aleatorio del segmento con random.range
Fig. 9: Elegi­mos un pun­to aleato­rio del seg­men­to B.

Final­mente en ese pun­to elegi­do colo­care­mos el pedestal.

encrucijada de laberinto con texturas, posicion final donde se coloca el pedestal utilizando Random.Range
Fig. 10: En el pun­to elegi­do colo­care­mos el pedestal con la espada.

En el caso de las piezas del pasil­lo y calle­jón sin sal­i­da que solo tienen una direc­ción, hare­mos coin­cidir los pun­tos A y B, de esa for­ma ten­dremos dos seg­men­tos coin­ci­dentes, entonces podremos uti­lizar la mis­ma solu­ción que para las demás piezas.

pasillo de laberinto con texturas, tomaremos un punto aleatorio del segmento con random.range
Fig. 11: En el caso del pasil­lo hare­mos coin­cidir los seg­men­tos A y B.

Implementación de la estrategia

Hemos elab­o­ra­do un plan para colo­car el pedestal en algún pun­to inte­ri­or de algu­na de las piezas del laber­in­to. Aho­ra en base a esto vamos a resolver el problema.

Primero en la jer­ar­quía voy a sep­a­rar las piezas obstruc­ción de las demás, porque estas piezas no las vamos a con­sid­er­ar en nues­tra solución.

En la figu­ra 1 vemos selec­cionadas las piezas que vamos a utilizar.

prototipo de laberinto hecho en unity
Fig. 12: Selec­cionamos el laber­in­to y sep­a­ramos las piezas que obstruyen 

Nece­si­ta­mos encon­trar las ref­er­en­cias de estas piezas en nue­stro códi­go para poder ele­gir una de ellas. La for­ma más sim­ple de hac­er­lo es uti­lizar un Tag.

crear tag en unity, spawnpiece para las piezas en las que podremos colocar el objeto de manera aleatoria usando random.range
Fig. 13: Creamos el tag Spawn­Piece para las piezas que podrán con­tener al laberinto.

Voy a crear un Tag lla­ma­do "Spawn­Piece" y se lo voy a asig­nar a todas las piezas selec­cionadas en la figu­ra 12.

El video 2 de la Serie Fun­da­men­tal de Uni­ty nos mues­tra varias for­mas en las que podemos encon­trar las ref­er­en­cias de los GameOb­jects de la jer­ar­quía des­de un Script, aquí está el artícu­lo cor­re­spon­di­ente a ese video.

se seleccionan todas las piezas que pueden contener al pedestal
Fig. 14: Selec­cionamos todas las piezas que podrán con­tener al pedestal.

asignacion de tag a uno o mas gameobjects en unity
Fig. 15: A las piezas selec­cionadas se les asigna el tag SpawnPiece.

A con­tin­uación creamos el Script "Labyrinth­Piece" (pieza de laber­in­to) que estará asig­na­do a todas las piezas selec­cionadas en la figu­ra 12.

creacion de script en unity que se encargara de colocar un objeto en una posicion aleatoria del laberinto usando random.range
Fig. 16: Creamos un nue­vo Script lla­ma­do Labyrinth­Piece, que asignare­mos a las piezas que puedan con­tener al pedestal.

En el Script primero vamos a definir cua­tro GameOb­jects que serán los pun­tos A1, A2, B1 y B2. Los declar­amos como cam­pos seri­al­iz­ables para que aparez­can en el inspec­tor y podamos asig­nar­los manualmente.

definicion de campos serializados en script c sharp, unity
Fig. 17: Defin­i­mos cua­tro cam­pos tipo GameOb­ject para con­tener a los pun­tos de cada pieza.

Selec­cionamos cualquier pieza tipo Encru­ci­ja­da y le asig­namos el Script Labyrinth­Piece. En la figu­ra 19 vemos que en el inspec­tor apare­cen los cam­pos para los GameObjects.

prototipo de laberinto hecho en unity
Fig. 18: En la jer­ar­quía selec­cionamos la encrucijada.

ventana inspector de un gameobject perteneciente a un prototipo de laberinto hecho en unity
Fig. 19: Asig­namos el Script Labyrinth­Piece a la encrucijada.

A con­tin­uación vamos a crear los cua­tro emp­ty GameOb­jects que lla­mare­mos A1, A2, B1 y B2. En la figu­ra 20 vemos crea­do el primer pun­to. Obser­ven que está definido como hijo de un Emp­ty GameOb­ject lla­ma­do Spawn, que a su vez es hijo de la pieza encrucijada.

encrucijada de laberinto con texturas
Fig. 20: Creamos cua­tro emp­ty GameOb­jects como hijos de esta pieza.

Vamos a posi­cionar estos cua­tro obje­tos de acuer­do a la figu­ra 6, en los extremos de los seg­men­tos imag­i­nar­ios que rep­re­sen­tan el area cam­inable den­tro de la pieza.

encrucijada de laberinto con texturas
Fig. 21: Uti­lizan­do la per­spec­ti­va ortográ­fi­ca, posi­cionamos los emp­ty GameOb­jects, uno en cada extremo.

encrucijada de laberinto con texturas
Fig. 22: Uti­lizan­do la per­spec­ti­va ortográ­fi­ca, posi­cionamos los emp­ty GameOb­jects, uno en cada extremo.

Asig­namos estos obje­tos a sus respec­tivos cam­pos en el inspec­tor, den­tro del com­po­nente LabyrinthPiece.

Final­mente apli­camos los cam­bios. Esto es muy impor­tante porque los cam­bios los esta­mos apli­can­do sobre el Pre­fab de la encru­ci­ja­da, es decir que todas las encru­ci­jadas del laber­in­to aho­ra van a ten­er sus pro­pios obje­tos A1, A2, B1 y B2 y ten­drán asig­na­do el com­po­nente Labyrinth­Piece, con sus pro­pios pun­tos car­ga­dos en los campos.

ventana inspector de un gameobject perteneciente a un prototipo de laberinto hecho en unity
Fig. 23: Asig­namos los emp­ty GameOb­jects a los espa­cios en el inspector.

aplicar cambios en inspector para extender la configuracion a los demas prefabricados
Fig. 24: Apli­camos los cam­bios para que todas las encru­ci­jadas del esce­nario ten­gan esta mis­ma configuración.

Podemos com­pro­bar eso cheque­an­do cada encru­ci­ja­da en la jer­ar­quía y com­pro­ban­do que tiene estos pun­tos y el Script asignado.

ventana jerarquia en unity, gameobjects que representas piezas de un laberinto
Fig. 25: Al aplicar los cam­bios, todas las encru­ci­jadas del laber­in­to pasan a ten­er los obje­tos vacíos y el Script LabyrinthPiece.

Lo que sigue es repe­tir el pro­ce­so para las demás piezas. En la figu­ra 26 vemos la pieza en for­ma de T, este caso es sim­i­lar a la bifur­cación solo que uno de los seg­men­tos imag­i­nar­ios ten­drá su extremo en el cen­tro de la pieza.

prototipo de laberinto hecho en unity, piezas de laberinto en la jerarquia
Fig. 26: Emp­ty objects para la pieza bifurcación.

En la pieza del pasil­lo creamos solo los pun­tos A1 y A2. En la figu­ra 28 vemos que estos pun­tos tam­bién los asig­namos en los cam­pos B1 y B2 respectivamente. 

prototipo de laberinto hecho en unity, piezas de laberinto en la jerarquia
Fig. 27: Emp­ty objects para la pieza tipo pasillo.

ventana inspector de un gameobject perteneciente a un prototipo de laberinto hecho en unity
Fig. 28: Para la pieza del pasil­lo asig­namos los pun­tos A1 y A2 tam­bién a los cam­pos B1 y B2.

En la pieza de la esquina, figu­ra 29, los seg­men­tos imag­i­nar­ios ten­drán dos pun­tos coin­ci­dentes, podríamos crear solo tres Emp­ty GameOb­jects y uno de ellos asig­narlo por ejem­p­lo a A2 y a B1, pero opta­mos por crear los cua­tro puntos.

prototipo de laberinto hecho en unity, piezas de laberinto en la jerarquia
Fig. 29: Emp­ty objects para la pieza tipo esquina.

El caso de la pieza calle­jón sin sal­i­da es igual al del pasil­lo solo que con menor distancia.

En la figu­ra 31 vemos que en los pun­tos B1 y B2 repeti­mos los pun­tos A.

prototipo de laberinto hecho en unity, piezas de laberinto en la jerarquia
Fig. 30: Emp­ty objects para la pieza calle­jón sin salida

ventana inspector de un gameobject perteneciente a un prototipo de laberinto hecho en unity
Fig. 31: Para la pieza calle­jón sin sal­i­da asig­namos los pun­tos A1 y A2 tam­bién a los cam­pos B1 y B2.

Método para elegir posición aleatoria de la pieza — Random.Range

En el Script Labyrinth­Piece vamos a crear un méto­do públi­co que devolverá un Vector3 que indi­cará una posi­ción aleato­ria de la pieza.

Video sobre méto­dosArtícu­lo sobre métodos

La primera instruc­ción será declarar un Vector3 lla­ma­do posi­ción que será el que retornemos al final de la ejecución.

Recordemos que son dos seg­men­tos imag­i­nar­ios for­ma­dos uno por los pun­tos A1 y A2, otro por los pun­tos B1 y B2. Así que luego vamos a hac­er un if para ele­gir un seg­men­to o el otro. 

En el argu­men­to del if usamos Random.Value para gener­ar un número aleato­rio entre 0–1 y com­pro­bamos si este val­or es menor a 0.5f. Esto quiere decir que ten­dremos un 50% de prob­a­bil­i­dades de ele­gir el seg­men­to A y otro 50% de ele­gir el B.

Para ele­gir un pun­to aleato­rio del seg­men­to imag­i­nario for­ma­do por los pun­tos uti­lizamos el méto­do Vector3.Lerp, el cual hará una inter­po­lación lin­eal entre dos Vector3 que indiquemos.

El méto­do recibe tres argu­men­tos, los dos primeros son los Vector3 entre los cuales se inter­po­lará y el ter­cer parámetro es el pun­to de inter­po­lación que nos interesa.

Para ejem­pli­ficar la fun­ción de inter­po­lación con­sid­er­e­mos lo sigu­iente: si el ter­cer val­or del méto­do Lerp vale 0 ten­dremos un Vector3 igual al primer parámetro indi­ca­do. Si vale 1 ten­dremos un Vector3 igual al segun­do parámetro indi­ca­do. Y si vale 0.5f ten­dremos un Vector3 que estará situ­a­do exacte­mente en el pun­to cen­tral entre los dos Vector3 que indicamos como parámetros.

De esta for­ma usamos Random.Range para gener­ar un Vector3 que se encon­trará en algú­na posi­ción entre los pun­tos indi­ca­dos en los dos primeros parámet­ros del méto­do Lerp y ese vec­tor lo asig­namos al Vector3 posi­cion que habíamos definido al principio.

En una región del if uti­lizamos la posi­ción de los pun­tos A1 y A2. En la otra región del if hace­mos exacte­mente lo mis­mo pero con los pun­tos B1 y B2.

Final­mente devolve­mos el Vector3 position.

Todo esto que se explicó está resum­i­do en las 7 líneas del méto­do GetRan­dom­Po­si­tion en la figu­ra 32.

metodo publico en script c sharp para colocar objeto en posicion aleatoria usando Random.Range
Fig. 32: El méto­do GetRan­dom­Po­si­tion entre­gará una posi­ción aleato­ria den­tro de la pieza.

Aho­ra bien, esto que hici­mos era para el Script Labyrinth­Piece que está asig­na­do a cada pieza del laberinto.

En el Script Game­Con­trol vamos a crear un méto­do que se encar­gará de colo­car al pedestal en una posi­ción aleato­ria del laber­in­to y hará uso del méto­do públi­co de LabyrinthPiece.

Comen­zamos definien­do los cam­pos que se obser­van en la figu­ra 33 deba­jo del comen­tario "//Video 9". Estos son los cam­po y vari­ables que usare­mos para resolver el problema. 

definicion de campos serializados en script c sharp, unity
Fig. 33: En el Script Game­Con­trol defin­i­mos un array de GameOb­jects para las piezas del laberinto.

En la com­po­nente Game­Con­trol en el inspec­tor (asig­na­da al GameOb­ject Con­trol), rel­lenare­mos los cam­pos. En Spawn­Piec­eTag escribire­mos "Spawn­Piece".

ventana inspector de un gameobject, el campo spawn piece tag pertenece a todas las piezas en las que podremos colocar el objeto de manera aleatoria usando Random.Range
Fig. 34: Escribi­mos el nom­bre del tag que asig­namos en las piezas del laber­in­to, en este caso "Spawn­Piece"

En Object­ToFind asignare­mos el Pre­fab del pedestal con la espa­da, el cual es el obje­to a encontrar.

prefabs en unity, pedestal con espada y reloj de pendulo, estos objetos seran colocados en una posicion aleatoria del laberinto usando Random.Range
Fig. 35: Bus­camos el pre­fab del pedestal con la espa­da que hici­mos en el video 2 de la serie.

En la dis­tan­cia mín­i­ma por el momen­to escribi­mos el val­or 75. Luego ver­e­mos para qué se uti­liza esta variable.

ventana inspector de un gameobject perteneciente a un prototipo de laberinto hecho en unity
Fig. 36: Asig­namos el Pre­fab del pedestal al cam­po ObjectToFind.

No es nece­sario que el array Labyrinth­Pieces aparez­ca en el inspec­tor así que voy a remover el [Seri­al­ize­Field] selec­ciona­do en la figu­ra 37.

campos serializados, privados y publicos en un script c sharp para un prototipo de juego de laberinto en unity
Fig. 37: No es nece­sario que el array de GameOb­ject de las piezas del laber­in­to sea vis­i­ble en el inspector.
campos serializados, privados y publicos en un script c sharp para un prototipo de juego de laberinto en unity
Fig. 38: No es nece­sario que el array de GameOb­ject de las piezas del laber­in­to sea vis­i­ble en el inspector.
ventana inspector de un gameobject perteneciente a un prototipo de laberinto hecho en unity
Fig. 39: Al remover la línea Seri­al­ize­Field, el cam­po no aparece en el inspec­tor ya que es privado.

En el méto­do StartGame vamos a encon­trar todos los GameOb­jects de la jer­ar­quía que ten­gan el Tag que indicamos en el inspec­tor. Últi­ma instruc­ción del méto­do startGame en la figu­ra 40.

metodo start de script c sharp en unity para un prototipo de juego de laberinto
Fig. 40: En el méto­do Start de Game­Con­trol encon­tramos todos los GameOb­jects con el Tag indicado.

Luego declar­amos el méto­do PlaceOb­ject­ToFind (figu­ra 41) y lla­mamos este méto­do des­de el méto­do StartGame (figu­ra 42).

este metodo se encargara de colocar un objeto en una posicion aleatoria del laberinto usando Random.Range
Fig. 41: Defin­i­mos un méto­do pri­va­do que se encar­gará de colo­car el pedestal en algu­na pieza del laberinto.

metodo start game de script c sharp en unity para un prototipo de juego de laberinto
Fig. 42: Hace­mos la lla­ma­da des­de el méto­do StartGame, es decir, cuan­do el juego empieza el pedestal es colo­ca­do en el escenario.

Método PlaceObjectToFind

Lo que hare­mos con este méto­do será ele­gir una pieza aleato­ria del laber­in­to, ase­gu­rarnos que esa pieza está lo sufi­cien­te­mente lejos del jugador uti­lizan­do la vari­able "minDis­tance" que le asig­namos 70 en el inspec­tor. Si la pieza selec­ciona­da no cumple este req­ui­si­to volver­e­mos a ele­gir otra pieza. De esto se encar­ga el bucle While que se obser­va en la figu­ra 43.

Una vez que damos con una pieza que cumple los req­ui­si­tos, colo­care­mos el pedestal en un pun­to aleato­rio de su inte­ri­or. Para ello usamos una ver­sión del méto­do Instan­ti­ate, que recibe tres parámet­ros: El primero es el obje­to a encon­trar alma­ce­na­do en el cam­po "object­ToFind", el segun­do es la posi­ción que la recibire­mos automáti­ca­mente de la pieza del laber­in­to eje­cu­tan­do el méto­do GetRan­dom­Po­si­tion de la com­po­nente Labyrinth­Piece que tiene asig­na­da. El ter­cer parámetro es la rotación, aquí indi­care­mos: Quaternion.identity (una rotación identidad).

este metodo se encargara de colocar un objeto en una posicion aleatoria del laberinto usando Random.Range
Fig. 43: Instruc­ciones del méto­do PlaceObjectToFind.

Es impor­tante que guardemos la ref­er­en­cia de este nue­vo obje­to que hemos crea­do, lo hare­mos en "object­ToFind­In­stance" (últi­ma instruc­ción en la figu­ra 43). De esta for­ma cuan­do la par­ti­da se acabe podremos destru­ir este obje­to manualmente.

En el méto­do EndGame hace­mos la destruc­ción de la instan­cia del obje­to a encon­trar, figu­ra 44.

la instancia del objeto que fue colocado en una posicion aleatoria usando Random.Range
Fig. 44: En el méto­do EndGame se destruye la instan­cia del pedestal.

Al entrar en el modo juego y apre­tar el botón Start, todo parece fun­cionar cor­rec­ta­mente. El pedestal con la espa­da aparece en una posi­ción aleato­ria del laber­in­to, den­tro de una de las piezas.

prototipo de laberinto hecho en unity, pedestal con espada. el objeto es colocado en una posicion aleatoria del laberinto usando Random.Range
Fig. 45: Al entrar en el modo juego el pedestal es colo­ca­do en una de las piezas del escenario.

prototipo de laberinto hecho en unity, el objeto es colocado en una posicion aleatoria del laberinto usando Random.Range
Fig. 46: Podemos ver des­de la ven­tana edi­tor de qué pieza se trata.

Colocar objeto fuera de las piezas

Hay regiones del laber­in­to que se encuen­tran fuera de las piezas, por ejem­p­lo la que se encuen­tra resalta­da en la figu­ra 47. Podríamos estar intere­sa­dos en colo­car el obje­to en una posi­ción perteneciente a esta área. 

¿Cómo podríamos reuti­lizar lo que hemos hecho?

prototipo de laberinto hecho en unity. en una posicion aleatoria de estas areas colocaremos el objeto usando Random.Range
Fig. 47: Esta región puede ser un lugar donde quisiéramos que aparez­ca el pedestal.

Para empezar creamos un Emp­ty GameOb­ject y lo lla­mamos SpawnArea y lo ubi­camos entre las piezas del laberinto.

jerarquia de un prototipo de juego de laberinto hecho en unity
Fig. 48: Creamos un Emp­ty GameOb­ject y lo lla­mamos SpawnArea, esto nos per­mi­tirá colo­car el pedestal en otras partes del laberinto.

jerarquia de un prototipo de juego de laberinto hecho en unity
Fig. 49: Los cua­tro pun­tos de la región son hijos del GameOb­ject SpawnArea.

Luego creamos cua­tro emp­ty GameOb­jects para rep­re­sen­tar los pun­tos A1, A2, B1 y B2. Colo­camos estos obje­tos en los extremos de los dos seg­men­tos imag­i­nar­ios del area resalta­da en verde en la figu­ra 49.

prototipo de laberinto hecho en unity. en una posicion aleatoria de estas areas colocaremos el objeto usando Random.Range
Fig. 50: Vamos a crear 4 emp­ty GameOb­jects para uti­lizar en el script LabyrinthPiece.

Luego creamos un Pre­fab jun­to a las demás piezas del laber­in­to (figu­ra 51), porque puede que reuti­l­ice­mos este obje­to cam­bian­do de lugar los pun­tos internos.

prefabs en unity, piezas para crear un laberinto
Fig. 51: Tomamos el GameOb­ject SpawnArea y creamos un Pre­fab para reutilizar.

Luego le asig­namos la com­po­nente Labyrinth­Piece y colo­camos los pun­tos inter­nos en los cam­pos respectivos.

ventana inspector de un gameobject perteneciente a un prototipo de laberinto hecho en unity
Fig. 52: Asig­namos el Script Labyrinth­Piece al GameOb­ject SpawnArea.

No debe­mos olvi­dar asig­nar el Tag Spawn­Piece en el inspec­tor, de otro for­ma estas áreas no serán con­sid­er­adas a la hora de ele­gir una posi­ción para el pedestal. En mi caso, como se obser­va en la figu­ra 53, no lo había asig­na­do y estuve var­ios min­u­tos proban­do para que el pedestal apareciera en estas áreas.

ventana inspector de un gameobject perteneciente a un prototipo de laberinto hecho en unity, asignar tags
Fig. 53: Debe­mos recor­dar asig­nar el tag Spawn­Piece al GameOb­ject SpawnArea. Aplicar cambios.

Detalles

Al pro­bar el juego noté que la puer­ta tenía un tamaño bas­tante grande en relación al per­son­aje, así que la hice un poco más pequeña y apliqué los cambios.

prototipo de laberinto hecho en unity, puertas de entrada-salida
Fig. 54: Las puer­tas esta­ban demasi­a­do grandes en relación al personaje.

Otro prob­le­ma que detec­té es que había piezas con el Tag Spawn­Piece cuya región inte­ri­or resulta­ba inac­ce­si­ble para el jugador. En la figu­ra 55 obser­va una de estas piezas, si el pedestal aparece aquí, el jugador no podrá encontrarlo.

La solu­ción a esto es selec­cionar esta pieza y quitar­le el Tag Spawn­Piece, de esta for­ma la pieza no será considerada.

prototipo de laberinto hecho en unity
Fig. 55: Esta pieza se encuen­tra fuera del alcance del per­son­aje, el pedestal no tiene que apare­cer aquí.

ventana inspector de un gameobject perteneciente a un prototipo de laberinto hecho en unity, asignar tags
Fig. 56: Selec­cionamos esa pieza y en el cam­po tag selec­cionamos: "Untagged". No apli­camos los cambios.

Conclusión

En este artícu­lo logramos colo­car el pedestal en una posi­ción aleato­ria den­tro del laberinto.

Para hac­er­lo tuvi­mos que analizar el tipo de piezas que for­man el laber­in­to, estable­cer cier­tas reglas y plantear una estrate­gia que resuel­va nue­stro problema.

Hici­mos uso del pen­samien­to de pro­gra­mación ori­en­ta­da a obje­tos para crear una solu­ción flex­i­ble que se adapte a todos los tipos de piezas.

Como usual­mente ocurre, no hay un solo camino para resolver un prob­le­ma. Otra for­ma de abor­dar esta situación es hac­er un Bake de un Navmesh y tomar un pun­to den­tro de estas regiones.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Scroll al inicio
Secured By miniOrange