En esta serie de tutoriales, has usado el diseño de niveles y las mecánicas de juego para diseñar la jugabilidad de tus jugadores. Los rompecabezas, las llaves y las puertas que has creado forman parte de un bucle de jugabilidad.
Un bucle de jugabilidad es una serie de acciones que el jugador repite y que constituyen el núcleo de tu jugabilidad.
Todavía tienes que cerrar el bucle del nivel que has compilado. En este tutorial, compilarás una pantalla de victoria que informe al jugador de que ha completado el nivel actual. También compilarás un punto de transición de nivel que verifique una condición de victoria y lleve al jugador al siguiente nivel.
Una vez que hayas completado tu nivel, explorarás formas de ampliar todo lo que has aprendido en estas instrucciones.
Una condición de victoria es un objetivo que el jugador debe cumplir para completar una tarea de jugabilidad, una misión, un nivel o un juego. El bucle de jugabilidad debe proporcionar los medios para cumplir la condición de victoria. En los juegos no lineales, es posible que tengas más de una condición de victoria.
Antes de empezar
Este tutorial parte de que ya conoces los siguientes temas tratados en las secciones anteriores de Cómo diseñar una aventura de rompecabezas:
Blueprints de widget
Blueprints
Variables
Volúmenes de colisión
Modo Reproducir en el editor
Recursos padre e hijo
Necesitarás los siguientes recursos de Trampas y daños:
Blueprint de widget
WBP_ElipressedScreenClase de blueprint
BP_KeyEnumeración
Enum_KeyType
Crea el final del nivel
Aunque ya hayas terminado de crear la jugabilidad principal de tu nivel, el punto de transición es una buena oportunidad para ofrecer a los jugadores una forma interesante de terminar tu nivel. En este caso, compilarás una plataforma de salto para lanzar a los jugadores a una plataforma elevada. Posteriormente, colocarás el punto de transición de nivel en la plataforma.
Construye una plataforma
Para construir una plataforma elevada en una de tus salas, usa las mallas estáticas SM_Cube y SM_Cylinder en la carpeta LevelPrototyping > Meshes.
El nivel del tutorial de ejemplo utiliza una plataforma cuadrada de 3.5 m con cuatro columnas que tiene este aspecto:
Si quieres copiar estas piezas ocultas en tu nivel, copia el fragmento de abajo. Si has estado siguiendo el nivel de muestra, estas formas aparecerán cerca de la esquina trasera de la sala 3. Puedes moverlas como quieras.
Para copiar la plataforma, sigue estos pasos:
Haz clic en Copiar el fragmento completo.
Command LineBegin Map Begin Level Begin Actor Class=/Script/Engine.StaticMeshActor Name=StaticMeshActor_785 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_785'" Begin Object Class=/Script/Engine.StaticMeshComponent Name="StaticMeshComponent0" Archetype="/Script/Engine.StaticMeshComponent'/Script/Engine.Default__StaticMeshActor:StaticMeshComponent0'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_785.StaticMeshComponent0'" End Object Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_785.StaticMeshComponent0'" StaticMesh="/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_Cylinder.SM_Cylinder'" StaticMeshImportVersion=1 bUseDefaultCollision=False StaticMeshDerivedDataKey="STATICMESH_FD1BFC73B5510AD60DFC65F62C1E933E_228332BAE0224DD294E232B87D83948FQuadricMeshReduction_V2$2e1_6D3AF6A2$2d5FD0$2d469B$2dB0D8$2dB6D9979EE5D2_CONSTRAINED0_100100000000000000000000000100000000000080FFFFFFFFFFFFFFFFFFFFFFFF000000000000803F00000000000000803F0000803F00000000000000003D19FC1626C9B2485E57DB4B8EC731318B8215AE8D46FAD400000000010000000100000000000000010000000100000000000000000000000100000001000000400000000000000001000000000000000000F03F000000000000F03F000000000000F03F0000803F00000000050000004E6F6E65000C00000030000000803FFFFFFFFF0000803FFFFFFFFF0000000000000041000000000000A0420303030000000000000000_RT00_0"En Unreal Editor, garantiza que el visor o el esquematizador sea el panel activo, y pulsa Ctrl + V.
A continuación, añadirás una plataforma de salto que lance al jugador a la plataforma.
Usa la plataforma de salto
Aunque podrías crear una plataforma de salto desde cero, te llevaría bastante tiempo. En un entorno de desarrollo, donde el tiempo suele ser limitado, puede resultar útil importar recursos prefabricados (prefabricados) en lugar de crear los tuyos propios. Elegir un prefabricado que encaje con el estilo visual de tu juego puede acelerar el desarrollo sin que destaque.
En este tutorial, usarás un recurso que viene con la plantilla de primera persona BP_JumpPad.
Para integrar BP_JumpPad, sigue estos pasos:
En el explorador de contenido, dirígete a LevelPrototyping > Interactable > JumpPad.
Arrastra una instancia de
BP_JumpPada tu nivel, frente a la plataforma. Si quieres que coincida con la posición exacta que aparece en este tutorial, establece la ubicación deBP_JumpPadcomo1790,-1460,10.
Tu nivel ahora debería parecerse a esto:
Es hora de poner a prueba tu trabajo. Primero, asegúrate de que todos los BP_Enemy tengan una velocidad máxima de 0. Esto garantiza que no tengas que lidiar con enemigos en movimiento mientras pruebas.
Haz clic derecho en el visor y selecciona Reproducir desde aquí para probar el nivel desde tu posición actual. Sube a la plataforma de salto e intenta llegar a la plataforma.
Observa cómo, incluso con el impulso de la plataforma de salto, tu personaje jugable no puede llegar a la plataforma. Puedes solucionar esto ajustando el parámetro Velocidad de la plataforma de salto.
Al igual que las muchas variables editables que has creado en tus blueprints, el parámetro Velocidad es una variable preestablecida que se puede editar en una instancia para el recurso de la plataforma de salto.
Para ajustar la velocidad, sigue estos pasos:
Selecciona
BP_JumpPaden el visor.En el panel Detalles, fija la velocidad (Z) en
1000.
Ahora, prueba tu nivel de nuevo. Deberías poder saltar a la plataforma.
A continuación, crearás una pantalla de victoria que se mostrará cuando el jugador complete el nivel.
Crea una pantalla de victoria
Crearás una pantalla de victoria usando un blueprint de widget, similar a la pantalla de fin de partida WBP_EliishedScreen que creaste en Trampas y daño. Dado que estas dos pantallas son tan similares, usarás WBP_EliishedScreen como punto de partida.
Para crear una pantalla de victoria duplicando tu pantalla de fin de partida, sigue estos pasos:
En el explorador de contenido, ve a AdventureGame > Diseñador > Blueprint > Widgets.
Haz clic derecho en
WBP_ElipressedScreeny luego haz clic en Duplicar.Dale al nuevo blueprint de widget el nombre
WBP_WinScreeny haz doble clic en él para abrirlo en el editor de widgets. Ahora tu carpeta Widgets debería tener este aspecto:Para cambiar el mensaje, haz clic en el widget Texto en la jerarquía.
En el panel Detalles, bajo el encabezado Contenido, junto a Texto, escribe
¡Nivel completado! …Cargando el siguiente nivel.en el campo de texto.Bajo el encabezado Apariencia, junto a Color y Opacidad, haz clic en la muestra de color para abrir el selector de color. Elige el color que más te guste o establece el valor de sRGB hexadecimal en
FFE000FFpara seguir el ejemplo.El texto en pantalla de victoria es más corto, por lo que puedes aumentar su tamaño para que ocupe más espacio en la pantalla. En el encabezado Fuente, cambia el valor de Tamaño a
72o al tamaño que creas que es más legible.Guarda, compila y cierra el editor de widgets.
A continuación, crearás un punto de transición de nivel.
Crea una transición de nivel
Una transición de nivel carga el siguiente nivel. Hay muchas maneras de activar una transición de nivel; cuando un jugador termina una escena, recoge un objeto o llega al final de un nivel.
En este tutorial, la transición de nivel será un blueprint que se activa cuando ocurren dos cosas:
El jugador se superpone con la transición de nivel.
Se cumple la condición de victoria.
Para crear un nuevo blueprint, sigue estos pasos:
En el explorador de contenido, Ve a AdventureGame > Diseñador > Blueprints.
Haz clic derecho y selecciona Nueva carpeta. Dale a esta carpeta el nombre
LevelTransition.Dentro de la carpeta LevelTransition, haz clic derecho y selecciona Clase de blueprint para crear un nuevo blueprint.
Selecciona Actor como la clase padre.
Llama a este nuevo blueprint
BP_LevelTransitiony haz doble clic sobre él para abrirlo en el editor de blueprints.
Ahora tu carpeta LevelTransition debería tener este aspecto:
Al igual que con los otros blueprints que has creado hasta ahora, tu transición de nivel necesita lo siguiente:
Una malla estática que el jugador puede ver durante el tiempo de ejecución.
Una forma de colisión que detecta cuándo el jugador colisiona con ella.
Lógica para potenciar la interacción.
Primero compilemos la malla y la colisión de caja, y luego pasemos a la lógica.
Para crear una malla estática y una forma de colisión, sigue estos pasos:
En la pestaña Componentes de
BP_LevelTransition, haz clic en el botón Añadir y buscaCubopara crear una nueva malla estática.Dale a esta malla estática el nombre
TransitionPoint.Con TransitionPoint seleccionado, en el panel Detalles, fija Escala en
3.0,3.0y0.1. Su tamaño se adapta a la plataforma final del nivel de muestra; puedes cambiar el tamaño del tuyo para que funcione mejor en tu nivel.De vuelta en la pestaña Componentes, selecciona DefaultSceneRoot. Haz clic en el botón Añadir y busca
Colisión de cajapara crear una forma de colisión.Dale a la colisión de caja el nombre
LevelTrigger.Con LevelTrigger seleccionado, en el panel Detalles, fija Escala en
4.0,4.0,2.0. Establece su posición Z en55.0.Si la forma de la colisión de caja no es la correcta, asegúrate de que no sea un hijo de TransitionPoint.
Guarda y compila.
Compila con la lógica
BP_LevelTransition debería hacer cinco cosas en secuencia:
Comprobar el solapamiento.
Verificar la condición de victoria.
Deshabilitar la entrada del jugador.
Mostrar la pantalla de victoria.
Cargar el siguiente nivel.
Paso a paso, vamos a crear la lógica que permita estas interacciones.
Comprueba si hay superposición
Para compilar lógica que compruebe si hay superposición, sigue estos pasos:
En la pestaña MyBlueprint de
BP_LevelTransition, en la sección Variables, haz clic en el botón + para crear una nueva variable y nómbralaOtherActor.Establece el tipo de pin en Actor (referencia a objeto).
En el grafo de eventos, elimina los tres nodos de evento existentes. No los necesitarás.
En la pestaña Componentes, haz clic derecho en LevelTrigger y haz clic en Añadir y Evento > Añadir OnComponentBeginOverlap. Esta función comprueba cuándo un objeto se superpone con la forma de colisión.
Desde el pin Ejecución, arrastra y crea Set Other Actor.
Conecta ambos pines de Otro actor.
A continuación, compilarás una lógica que verifique la condición de victoria.
Verifica la condición de victoria
En este tutorial, la condición de victoria será recopilar las tres llaves. El motivo por el que se ha elegido esta condición concreta es anticiparse y evitar acciones de los jugadores que puedan romper el juego.
Por ejemplo, si la condición de victoria era que el jugador llegara a la transición de nivel y un jugador encuentra una forma de traspasar las paredes de la sala, podría pasar por alto todo tu nivel. Al usar las llaves como condición de victoria, el jugador debe completar tu bucle de juego, incluso si encuentra la forma de traspasar las paredes y las puertas.
Aunque es imposible predecir todos los errores, un diseño que sea previsor puede evitar que los jugadores rompan tu juego.
Para crear una matriz para almacenar los datos de las llaves, sigue estos pasos:
En la pestaña MyBlueprint de
BP_LevelTransition, haz clic en el botón + para crear una nueva variable y nómbralaHeldKeys.Establece el tipo de pin en Enum Key Type y el tipo de contenedor en Matriz.
En el pin Ejecución del nodo Set, arrastra y crea un nodo fnBPIGetKeys.
Desde el pin Objetivo, arrastra y crea Get Other Actor.
Desde el pin Ejecución de fnBPIGetKeys, arrastra y crea Set Held Keys.
Conecta los pines de la matriz de ambos Held Keys.
Para crear un tipo de llave de enumeración para establecer una condición de victoria, sigue estos pasos:
Crea una variable nueva y nómbrala
RequiredKeys. Esta es tu condición de victoria.Asegúrate de que el tipo de pin sea Enum Key Type y que el tipo de contenedor sea Matriz.
En el panel Detalles, activa Editable por instancia y establece que Categoría sea
Configuración.Compila el blueprint para obtener acceso al valor predeterminado. Haz clic en el botón + para añadir tres elementos nuevos a la matriz.
Haz clic en los menús desplegable de índice y establece que los índices sean amarillo, azul y rojo.
Crearás un booleano para verificar si se cumple o no la condición. Un For Each Loop with Break recorrerá un ciclo a través de la matriz HeldKeys para buscar cada llave y se interrumpirá si falta alguna.
Para compilar una lógica que compruebe si faltan llaves, sigue estos pasos:
Crea una variable nueva y nómbrala
FoundAllKeys.Establece el tipo de pin en Boolean y el tipo de contenedor en Único.
Desde el pin Ejecución de SetHeldKeys, arrastra y crea un For Each Loop with Break.
Desde el pin Matriz del bucle For Each, arrastra y crea un nodo Get Required Keys.
Desde el pin Cuerpo del bucle del bucle, arrastra y crea un nodo Branch.
Desde el pin Condición, arrastra y crea un nodo Contains Item (Array).
Desde el pin Matriz objetivo del nodo Contains, arrastra y crea un nodo Get Held Keys.
Conecta el pin Elemento por encontrar del nodo Condición con el pin Elemento de matriz del nodo Loop.
Desde el pin Verdadero del nodo Branch, arrastra y crea Set Found All Keys. Haz clic en la casilla de verificación junto a FoundAllKeys para establecerlo como verdadero.
Desde el pin Falso del nodo Branch, arrastra y crea Set Found All Keys. Deja la casilla de verificación en blanco y conecta el pin Ejecución al pin Break del nodo For Each Loop.
Tienes que seguir tres pasos más en la secuencia que vimos antes, pero solo si el jugador tiene todas las llaves:
Deshabilitar la entrada del jugador.
Mostrar la pantalla de victoria.
Cargar el siguiente nivel.
Si quieres usar el resultado de FoundAllKeys para iniciar una secuencia lógica, sigue estos pasos:
Desde el pin Completado del nodo For Each loop, arrastra y crea un nodo Branch.
Arrastra desde el pin Condición y crea Get FoundAllKeys.
Desde el pin Verdadero del nodo Branch, arrastra y crea un nodo Sequence.
Como necesitas compilar tres acciones en esta secuencia, haz clic en el botón Añadir pin.
Vamos ahora con el siguiente paso de la secuencia: la desactivación de la entrada del jugador.
Deshabilita la entrada del jugador
Mientras se muestra la pantalla de victoria, deshabilitar la entrada del jugador evita que los jugadores se muevan y reciban daño no deseado.
Para deshabilitar la entrada del jugador, sigue estos pasos:
Desde el pin Luego 0 del nodo Sequence, arrastra y crea un nodo Disable Input.
Desde el pin Objetivo del nodo Disable Input, crea Get Other Actor.
Desde el pin Controlador de jugador, arrastra y crea un nodo Get Player Controller.
A continuación, compilarías la lógica para mostrar la pantalla de victoria.
Muestra la pantalla de victoria
Para mostrar tu widget WBP_Winscreen, sigue estos pasos:
Desde el pin Luego 1 del nodo Sequence, arrastra y crea un nodo Create Widget.
Establece la clase en WBP_WinScreen.
En el pin Ejecución del nodo Create Widget, arrastra y crea un nodo Add to Viewport.
Conecta el pin Valor devuelto de Create Widget con el nodo Target de Add to Viewport.
¿Ves algún problema con esta lógica? Por ahora, vas a seguir compilando el paso final sin solucionar el problema. Más adelante, harás una prueba de juego del nivel para descubrir el problema y compilar una solución.
Carga el siguiente nivel
En este tutorial, usarás tu nivel actual como marcador de posición para el siguiente nivel. Cuando estés diseñando tu propio juego, el punto de transición debería llevar a los jugadores a un nivel completamente nuevo.
Para compilar lógica que cargue el nivel actual, sigue estos pasos:
Desde el pin Luego 2 del nodo Sequence, arrastra y crea un nodo Open Level (by Object Reference).
Desde el pin Nivel de Open Level, arrastra y busca Promocionar a variable. Esto forzará la creación de una variable de tipo World.
También puedes crear esta variable a través de la pestaña MyBlueprints, pero el pin de tipo World puede ser difícil de localizar.
Con la variable World seleccionada, en el panel Detalles, cámbiale el nombre a
NextLevel.Añádela a la categoría Configuración y activa Editable por instancia.
Compila tu blueprint para acceder al valor predeterminado de la variable y establécelo en el nivel que quieras cargar. Si estás siguiendo este tutorial, configúralo como
Lvl_Adventurepara que recorra en bucle el nivel actual.Guarda y compila.
Es hora de poner a prueba tu trabajo. Arrastra una instancia de BP_LevelTransition a la plataforma elevada. Luego facilítate el acceso a las llaves para cumplir la condición de victoria. Para ello, puedes colocar en la misma sala instancias de las llaves de color amarillo, azul y rojo que creaste en Cómo crear una llave.
Ahora tu nivel debería tener el siguiente aspecto:
Haz clic derecho en el visor y selecciona Reproducir desde aquí para probar el nivel desde tu posición actual. Si saltas a la plataforma y activas la transición de nivel, verás que la pantalla se congela y se abre el siguiente nivel sin que el jugador tenga tiempo de leer el mensaje de la pantalla de victoria.
Resolverás este problema en la siguiente sección.
Crea un retraso
Este tutorial usa Abrir nivel para cerrar el nivel actual y abrir el siguiente como una nueva instancia del juego. Durante la carga, la opción Abrir nivel congela el juego. Dependiendo del sistema del jugador, puede congelarse durante demasiado poco tiempo (para leer la pantalla de victoria) o demasiado mucho tiempo (como si el juego se hubiera bloqueado).
Muchos juegos, incluso los que usan transmisión de niveles, utilizan pantallas de carga para que el jugador sepa que el juego funciona correctamente y que debe esperar. Las pantallas de carga también resuelven otro problema: los tiempos de espera largos, frecuentes o aburridos pueden interrumpir la inmersión y causar frustración. Las pantallas de carga suelen incluir sugerencias, animación o audio para captar la atención del jugador mientras no esté jugando.
Para solucionar este problema técnico con el diseño, crearás un retraso intencionado que consiga lo siguiente:
Igualar los tiempos de carga para todos los jugadores.
Garantizar que el jugador tenga tiempo suficiente para leer la pantalla de victoria.
Ocultar los tiempos de carga dando al jugador algo que mirar.
Sigue estos pasos para insertar un retraso:
Abre
BP_LevelTransition. En la pestaña MyBlueprint, haz clic en + para añadir una nueva variable y nómbralaLevelLoadDelay.Establece el tipo de pin como Float.
En el panel Detalles, activa Editable por instancia y establece que Categoría sea Configuración.
Compila el blueprint para obtener acceso al valor predeterminado. Retraso en la carga del nivel establecerá la cantidad de tiempo que quieres que dure el retraso. Para seguir, ajústalo en
5.0segundos.En el grafo de eventos, ve hasta el nodo Sequence. Para insertar un retraso, arrastra desde el pin Luego 2 y crea un nodo Delay.
En el pin Duración, arrastra y crea un nodo Get LevelLoadDelay.
Guarda, compila y cierra tu blueprint.
Tu grafo de eventos de BP_LevelTransition final debería tener este aspecto:
Ahora, prueba tu nivel de nuevo. Cuando superpongas el punto de transición de nivel, debería mostrarse la pantalla de victoria, el fondo debería desenfocarse y la entrada del jugador debería estar desactivada durante cinco segundos antes de que tu personaje jugable aparezca en el siguiente nivel.
Antes de probar tu nivel por última vez, recuerda sacar las llaves de la sala 3 y fijar la velocidad máxima de BP_Enemy en 200.
Del concepto a la creación
Echemos un vistazo al boceto que creamos en Configuración del proyecto y esbozo de nivel comparado con el nivel final. Desde el diseño inicial, hemos cambiado el diseño de nivel y el bucle de jugabilidad para corregir errores, crear nuevas funciones o solucionar limitaciones que las personas que prueban el juego han descubierto durante el desarrollo.
Al esbozar tu nivel, trabajar de forma modular, resolver problemas técnicos con el diseño y mantener tus recursos organizados, puedes ser flexible cuando las limitaciones o las nuevas funciones cambien el curso del desarrollo de tu juego.
Al completar esta pista de aprendizaje, has pasado de un nivel conceptual a una demo jugable. Ahora ya dispones de los bloques de creación para diseñar más que un nivel. Puedes combinar interruptores, trampas, llaves, puertas y enemigos de formas ilimitadas para diseñar nuevos bucles de jugabilidad a tu propio estilo. Cuando se conectan entre sí, cada nivel se convierte en parte de un proyecto mucho más grande; un juego completo.
Proyecto de ejemplo
A continuación tienes un enlace para la descarga del proyecto final que puedes compilar usando esta serie de tutoriales de documentación. Puedes usar este proyecto de ejemplo para ver cómo quedaría tu proyecto final o como referencia para ver cómo compilamos y diseñamos el proyecto.
(Tamaño de la descarga: 75 MB)
Para abrir el proyecto, descomprime el archivo y mueve la carpeta adventuredesigner al directorio de proyectos de Unreal (de forma predeterminada, se encuentra en C:\Users\Nombre de usuario\Documentos\Unreal Projects).
Siguiente
Para seguir trabajando en tu nivel añadiendo materiales, iluminación, efectos de posprocesamiento, sonido y efectos visuales, prueba la serie de tutoriales de pistas de artista:
Art Pass for a Puzzle Adventure Game
Learn how you can apply art workflows with materials, sounds, and visual effects to the Puzzle Adventure game.
Si quieres aprender más sobre la creación de otro blueprint, continúa con este módulo adicional de la serie de tutoriales de pistas de diseñador:
Bonus: Generar nuevos cubos
Añade una nueva mecánica a tu juego de aventuras y rompecabezas en la que los actores BP_Cube se generen hasta un límite especificado.
Si quieres empaquetar tu proyecto como programa independiente para probar y compartir, consulta la siguiente documentación:
Crear paquetes de proyectos en Unreal Engine
Crear paquetes de proyectos en Unreal Engine para su distribución