[UNITY] ¿Como lidiar con múltiples niveles?

marod

Buenas a todos.

Mi pregunta es sencilla, necesito saber como lidiáis vosotros con los juegos tipo Angry Birds o CandyCrush a la hora de cargar múltiples niveles pequeños.

Lo primero que se me ocurre es crear un nivel por cada escena pero me parece una barbaridad hacer eso, ya que por ejemplo si tengo 100 niveles, tener 100 escenas para un nivel es demasiado.

El juego sería 2D por tiles y enfocado a Web, así que la segunda opción que intuyo sería la de leer los niveles de algún sitio, un archivo XML o algo y luego cargarlos en runtime. ¿Alguna solución efectiva o información que me pueda guiar?

Muchas gracias.

FernandoA

En Be the Fly hice todo el juego en una única escena, con un controlador de estados para saber en donde está el jugador en cada momento. Pero es un juego arcade con un único escenario, con lo que tiene más sentido hacerlo así.

En Volumetris tengo una escena para el menú principal, otra para la seleccion de mundos, UNA PARA CADA MUNDO (por ahora hay 3 mundos, así que 3 escenas) y UNA PARA CADA NIVEL (por ahora creo que voy por 120 niveles, así que 120 escenas).

Todo depende de como quieras enfocar el juego. Si va a ser un juego con niveles separados, puedes hacer perfectamente una escena por nivel, aunque sean miles (de hecho, para eso tiene las escenas Unity).

1 respuesta
valdes86

Otra opción un poco mas fea es que separes en la escena unos niveles de otros y muevas la cámara de un lado a otro de la escena para cada nivel pero salvo casos muy particulares (cuando entras en una tubería en un Super Mario o algo así) no lo veo, mejor como te dice #2

B

Y no te renta crear un único nivel/scene, donde le pasas por argumento, el nivel en el que estás.
Con este nivel, randomizas el número de monstruos por escena, tipo de monstruos, plataformas, items y demás objetos que consten los niveles.

Al igual, puedes hacer que los niveles de 1-9 tengan un BG igual, luego cargas una scene de entrefase para pasarlo a 11-19, 20-21 y ya les metes diferentes.

2 respuestas
kanc

#4

Lo malo es que dependerá del tipo de juego que quiera hacer. Un juego procedural te hace perder mucho "poder" de diseño. Tampoco nos ha contado de que va el juego y lo mismo los niveles los quiere scriptados.

1 respuesta
B

Claro, no es lo mismo uno que otro. Al final dependerá de lo que realmente quiere que sea.

Los candy crash al final se basan en generar partidas aleatorias con un nº porcentual de fichas que salgan en la pantalla y el esparcimiento que tengan sobre esta. A mayor disparidad, mayor dificultad.

marod

#4 #5 Creía que lo había puesto en el primer post, perdón. El juego es de género puzles en 2D, por lo tanto el crear los mapas procedurales no nos iba mucho, porque sí queríamos meter un poco de level design en los niveles, así que eso lo descartamos rápidamente.

kanc

Hola,

Con la nueva info añadida, yo creo que vas bien encaminado. Puedes tener un unico nivel como escena de Unity y leer de un fichero (XML, Json o texto plano que lo tengas formateado como tu quieras) la informacion para generar el nivel.

Si utilizas por ejemplo XML, esto es mas de .net que de Unity

        
XmlDocument doc = new XmlDocument(); doc.Load(Application.persistentDataPath + "\\fichero.xml");

Un json lo puedes cargar como assets de texto y la verdad es que no se si Unity tiene funciones nativas para leer json, pero habia una libreria por ahi... http://wiki.unity3d.com/index.php/SimpleJSON

Tambien puedes necesitar un singleton que te haga de Game Manager donde tengas la informacion persistente que necesites (por ejemplo que nivel cargar, aunque podria estar en la info del nivel, en plan, cual es el anterior y el siguiente nivel). Si no lo has usado nunca mirate DontDestroyOnLoad de Unity.

No se, esto es un poco a voleo, no se si te ayuda en algo.

Mucha suerte

DanielParra

#1
Hola!

Yo te recomiendo una sola escena y con un "GameManager" generes el puzle en cuestión. Para los puzles tienes varias opciones:
Una opción es cargar la configuración del nivel desde un archivo externo, ya sea XML o JSon y currarte un sistema que sepa interpretar esto y generar el nivel (más trabajo de programación).
Otra opción es tener una lista de los prefab de los puzles e instanciarlos cuando quieras cargarlo, cada puzle tendría los scripts necesarios para autogestionarse (lo mismo que tendrías que crear si utilizas la primera opción), esta opción tiene menos trabajo de programación pero más trabajo de diseño ya que vas a tener que crear todos los puzles desde Unity.

En ambos casos, las cosas que se compartan entre puzles deberías de tenerlas en prefabs e instanciarlas al cargar/crear el puzle, no cometas el error de crear partes u objetos iguales en distintos puzles ya que si te toca cambiarlo tendrás que ir puzle por puzle modificandolo, sobretodo en la segunda opción. En el caso de la primera, si tienes configuración que se comparte también deberías de tenerla en otro fichero a parte, para que no te toque cambiarlo en todos los puzles (archivos).

Un saludo!

1 respuesta
12 días después
valdes86

siguiendo a #9, recuerdo haber trasteado alguna vez con ficheros de texto plano con descriptores para generar mapas constantes para plataformas 2D. Seria leer el fichero e interpretarlo para generar el mapa. Lleva mas curro de mano pero luego te despreocupas, solo necesitas una escena y el GameManager se ocupa de todo, limpia mapa, selecciona fichero, dibuja mapa y lo deja listo para empezar e implementar nuevos mapas es solo escribir un fichero nuevo, luego las actualizaciones de mapas no son pesadas.

Eso si, yo solo me arriesgaría a esto si los mapas tienen muchas cosas que son constantes (en un plataformas 2D la mayoría es suelo, agujeros en el suelo, alguna plataforma, algún enemigo y algún power up) vamos, todo prefabs

-Edit-
#1 Buscando un ejemplo de lo que te decia encontre esto:

marod

Al final me decanté por usar un Plugin gratuito de Unity, Tiled2Unity, que fácilmente me convierte los mapas de Tiled a un Prefab en Unity, así también ahorro en optimización porque en vez de tener un GameObject por cada tile del mapa, simplemente se crea un Mesh y mete la textura ahí. Además de que poniendole los colliders en Tiled, me los parsea también en Unity, así que perfecto.

Eso sí, la idea de tener un Prefab por cada mapa no me mola nada, pero bueno, me ha ahorrado muchos quebraderos de cabeza.

Gracias a todos por contestar.

1 respuesta
DanielParra

#11 Posiblemente has optado por la mejor opción xD

B

Yo lo que hago es tener un asset que almacena una clase guardando su vector3 y el material que usa. Pero claro son mapas de no más de 200 cuadros en total.

Usuarios habituales