En este tutorial, crearás un rompecabezas de plataformas construyendo dos objetos de jugabilidad comunes:
Un interruptor de placa de presión.
Un cubo de física que reaccione al jugador.
Usarás diseño de niveles y mecánicas de juego como el tiempo, la física y el daño para ajustar la dificultad del rompecabezas e introducir consecuencias para las acciones del jugador.
Antes de empezar
Este tutorial asume que ya conoces los siguientes temas que se han tratado en las secciones anteriores de El diseño de una aventura de puzles:
Materiales
Blueprints
Variables
Interfaces de blueprint
Modo Reproducir en el editor
Necesitarás los siguientes recursos creados en Cómo crear una llave.
M_BasicColor_Blue
Una aproximación al diseño de la jugabilidad
Independientemente del género, una jugabilidad cautivadora hace sentir algo a los jugadores; la emoción de enfrentarse a otro jugador o la comodidad de un simulador de granja. Esa respuesta emocional hace que los jugadores se involucren más. Si un juego no es atractivo, es menos probable que los jugadores sigan jugando, lo que puede afectar al éxito de tu proyecto.
Como persona que diseña videojuegos, tu trabajo consiste en diseñar la jugabilidad a través del diseño de niveles y las mecánicas de juego. Aunque puedes diseñar un nivel de forma intuitiva, para este tutorial usaremos fórmulas que permiten visualizar el proceso.
Diseño de niveles
A través del diseño de niveles, puedes aumentar o disminuir la dificultad de una tarea. Por ejemplo, en un juego de plataformas, saltar a una plataforma es una tarea. Si colocas una plataforma en el límite superior de la distancia de salto de un personaje, aumentas la dificultad para alcanzar la plataforma y completar la tarea.
Sin embargo, si fallar no tiene consecuencias, es probable que incluso una tarea de alta dificultad haga que el jugador no sienta riesgo alguno.
La sensación de seguridad es útil en las secciones de tutoriales de la jugabilidad, donde el jugador puede aprender a usar los controles sin consecuencias.
Sin embargo, una sensación constante de seguridad puede no ser útil para tu juego. Por ejemplo, sin tensión, una pelea contra un jefe puede parecer aburrida, lo que provocaría falta de interés por parte del jugador.
Para que el jugador sienta tensión, podrías introducir consecuencias usando la mecánica de juego de daño.
Mecánicas del juego
El daño representa numéricamente las posibilidades que tienes de perder algo valioso, como por ejemplo:
Equipamiento
Potenciadores
Progreso en el nivel
Un personaje jugable o un compañero no jugable.
La dificultad de la tarea combinada con la gravedad de las consecuencias puede afectar a la tensión que siente la persona que juega:
Las tareas innecesariamente difíciles con pocas consecuencias pueden frustrar al jugador.
La cantidad de tensión al realizar una tarea puede afectar la cantidad de satisfacción que siente el jugador cuando cumple una condición de victoria. La satisfacción crea una motivación para seguir jugando, sobre todo si se combina con una recompensa.
Una condición de victoria es aquella que el jugador debe cumplir para completar una tarea.
Crea un interruptor
Un interruptor es un objeto de jugabilidad que produce un efecto cuando algo interactúa con él.
Si aprendes a crear un interruptor, podrás diseñar funciones de jugabilidad, como pulsar un botón para abrir una puerta. En este caso, usarás el interruptor para cambiar de color en las colisiones con actores en el juego.
Crea con lógica
Tu interruptor se activará cuando un objeto o jugador se superponga con él. Antes de empezar a compilar, vamos a elaborar un borrador de la lógica que impulsa esta interacción respondiendo a las siguientes preguntas: ¿qué tiene que pasarle a quién y cuándo?
Aquí tienes un desglose de la lógica del interruptor:
Durante el tiempo de ejecución, el interruptor está desactivado.
Si un jugador pisa el interruptor, se activa.
Si un jugador levanta el pie del interruptor, se desactivará.
Dado que el interruptor tiene dos estados (activado y desactivado), puedes usar materiales para visualizar cada estado en tiempo de ejecución. Durante las pruebas, se verificará rápidamente que la lógica funciona correctamente.
Crear materiales
Para el estado apagado del interruptor, usarás M_BasicColor_Blue y para el estado encendido crearás un material emisivo.
Un material emisivo emite luz.
Para crear el material emisivo, sigue estos pasos:
En el explorador de contenido, ve a AdventureGame > Diseñador > Materiales, haz clic derecho y selecciona Material.
Dale al nuevo material el nombre
M_EmissiveColory haz doble clic sobre él para abrir el editor de materiales.En el grafo de material, haz clic derecho y busca Parámetro vectorial. Haz clic para rellenar el grafo y nómbralo
Color. Esto controla el color de la luz del material.En el nodo Color, haz doble clic en la muestra de color para abrir el selector de color.
Elige tu propio color o configúralo como
sRGB hexadecimal 27F774FFpara seguir.Haz clic derecho y busca dos nodos más: uno de constante y un nodo de multiplicación.
Conecta el nodo Color con el pin A del nodo Multiply. Después, conecta la constante al pin B del nodo Multiply. Por último, conecta el nodo Multiply al pin Color emisivo del nodo M_EmissiveColor.
El valor de la constante controla la potencia emisiva o el brillo del material. Ajústalo como prefieras o ajústalo en
25para seguir el ejemplo.Guarda y cierra el material.
Ahora tu carpeta Materiales debería tener este aspecto:
Dado que M_EmissiveColor es el único material emisivo de este tutorial, no es necesario que crees ninguna instancia. Sin embargo, las instancias de materiales son una forma elegante de mantener la modularidad de tu proyecto y que funcione de forma eficiente en un entorno de desarrollo.
A continuación, compilarás el interruptor.
Configura una clase de blueprint
El interruptor será un blueprint que consiste en una malla estática y una colisión de caja. La colisión de caja detectará el contacto con el jugador, lo que activará y desactivará los estados del interruptor.
La colisión es la detección de dos objetos que entran en contacto durante el tiempo de ejecución. Las colisiones de caja, junto con las esferas y las cápsulas, son volúmenes que se usan para realizar estas detecciones. Por ejemplo, una caja de impacto es un ejemplo de uso de formas de colisión para detectar un ataque correctamente.
Para empezar, sigue estos pasos:
En el explorador de contenido, ve a AdventureGame > Diseñador > Blueprints y crea una nueva carpeta llamada
Activation.Dentro de Activation, haz clic derecho para crear una nueva clase de blueprint.
En el cuadro de diálogo Seleccionar clase padre, selecciona Actor.
Dale al nuevo blueprint el nombre
BP_Switchy haz doble clic sobre él para abrirBP_Switchen el editor de blueprints.En la pestaña Componentes, crea una malla estática haciendo clic en Añadir, busca el
cuboy selecciónalo.Nómbralo
Interruptor.En el panel Detalles, en Transformar, ajusta la escala de Interruptor a
2.0,2.0y0.1.En la pestaña Componentes, crea una colisión de caja haciendo clic en Añadir y busca
Colisión de caja.Nómbrala
Activador.En el panel Detalles, en Ubicación, ajusta el valor Z de la colisión de caja en
200.En Escala, ajusta su escala a
1.5,1.5y5.0. Esta colisión de caja es más gruesa que la malla estática para capturar fácilmente las colisiones.Guarda y compila el blueprint.
Tu carpeta de blueprints debería quedar así:
Para no perder trabajo si falla la compilación, guarda el blueprint y luego compílalo después de realizar cualquier cambio significativo.
A continuación, crearás variables para controlar el comportamiento del interruptor.
Crea variables
Mediante variables, BP_Switch puede hacer referencia al material que acabas de crear. En lugar de codificar un material en particular en el interruptor, puedes intercambiar materiales sobre la marcha (lo harás más adelante en este tutorial).
De momento, crea las siguientes variables en BP_Switch:
Nombre de la variable | Clase | Valor por defecto | Explicación |
OnMaterial | Interfaz de material |
| El color del interruptor cuando está activado. |
OffMaterial | Interfaz de material |
| El color del interruptor cuando está desactivado. |
En la pestaña MyBlueprint, debajo de VARIABLES, crea dos nuevas variables haciendo clic en el botón + dos veces.
Dale a uno el nombre
OnMaterialy al otroOffMaterial.Selecciona Interfaz de material (referencia a objeto) como tipo de pin.
Selecciona OnMaterial. En el panel Detalles, junto a Categoría, crea una nueva categoría llamada
Configuración.Haz clic en Compilar para acceder a su valor predeterminado. En Valor predeterminado, selecciona
M_EmissiveColor. Esta variable ya está lista por ahora.Selecciona OffMaterial. En el panel Detalles, añádela a la categoría Configuración.
En Valor predeterminado, selecciona
M_BasicColor_Blue.Guarda y compila.
Ahora que el blueprint puede hacer referencia a los materiales, usarás la lógica para indicarle al interruptor cuándo usarlos.
Implementa tu lógica
Deberías tener una colisión de caja, una malla estática y dos materiales. Ahora la lógica del interruptor se puede escribir como:
Durante el tiempo de ejecución, debería mostrarse OffMaterial en el interruptor.
Si el activador detecta una colisión, entonces establece el material de Interruptorcomo OnMaterial.
Si el activador deja de detectar colisión, configura el material de Interruptorcomo OffMaterial.
Para compilar esta lógica, usarás una secuencia de comandos de construcción para indicarle a BP_Switch que use OffMaterial en tiempo de ejecución:
En la pestaña Secuencia de comandos de construcción, arrastra desde el pin Ejecución del nodo Construction Script y busca Set Material (Switch). Haz clic para crearlo.
En el nodo Set Material, arrastra desde el pin Material y busca Get OffMaterial. Selecciónalo.
Guarda y compila.
Te encargarás del resto de la lógica del grafo de eventos. Para indicar al interruptor que se active y desactive al superponerse, sigue los pasos que se indican a continuación:
En el grafo de eventos, elimina los nodos Event BeginPlay, Event ActorBeginOverlap y Event Tick. No los necesitarás.
En la pestaña My Blueprint, debajo del encabezado Componentes, haz clic derecho en Activador y selecciona Añadir evento > Añadir OnComponentBeginOverlap.
Repite este proceso para añadir también un nodo OnComponentEndOverlap.
Desde el pin Ejecución del nodo OnComponentBeginOverlap(Trigger), arrastra y busca Set Material (Switch).
Desde el pin Material del nodo Set Material, arrastra y busca Get OnMaterial.
Desde el pin Ejecución del nodo OnComponentEndOverlap(Trigger), arrastra y busca Set Material (Switch).
Desde el pin Material del nodo Set Material, arrastra y busca Get OffMaterial.
Por ahora has terminado con el interruptor. Guarda y compila.
Tu grafo de la secuencia de comandos de construcción debería tener este aspecto:
Tu grafo de eventos debería tener este aspecto:
Ahora puedes probar tu proyecto para ver si el interruptor funciona correctamente.
Arrastra una instancia de BP_Switch desde el explorador de contenido hasta Sala 1. Haz clic en el menú de tres puntos de la barra de herramientas del modo de reproducción y selecciona Ubicación actual de la cámara. Esto garantiza que entres en el modo PIE desde tu posición actual en el visor, en lugar de tener que recorrer todo el nivel para probar una sola función.
En el modo PIE, cuando pisas el interruptor, debería iluminarse. Al levantar el pie, debería volver a ser azul.
Las ventajas del desarrollo modular
Supongamos que quieres dos interruptores en lugar de uno, pero que el segundo interruptor se ilumine en rojo en lugar de en verde. Podrías compilar un nuevo interruptor con la misma lógica y asignarle un material rojo, pero eso llevaría tiempo de desarrollo y generaría más gastos generales para tu proyecto.
La sobrecarga hace referencia al gasto de recursos (potencia de procesamiento, tiempo, cantidades de almacenamiento, etc.).
Dado que las plataformas (ordenadores y consolas) tienen una potencia de procesamiento finita, los desarrolladores de juegos suelen querer trabajar de forma modular para reducir los gastos generales.
Como ya has usado blueprints y variables para compilar tu interruptor, ya estás trabajando de forma modular. Veamos tu trabajo en acción:
Abre
BP_Switchen el editor de blueprints haciendo doble clic sobre él en el explorador de contenido.En Variables, selecciona OnMaterial y haz clic en el icono del ojo para abrirlo.
Selecciona OffMaterial y haremos lo mismo de otra forma; en el panel Detalles, activa Editable por instancia. Verás que se abre el icono del ojo; ahora es una variable pública.
Guarda, compila y ciérralo.
Ya deberías tener una instancia de BP_Switch en el nivel, así que arrastra para añadir una segunda instancia. Con cualquiera de los interruptores seleccionados en el visor, el panel Detalles mostrará una nueva categoría de IU llamada Configuración. Es la categoría de variable que creaste en Cómo crear variables. Configuración muestra tus variables públicas como parámetros que puedes cambiar sobre la marcha desde el visor.
Prueba a cambiar los materiales por los que quieras y probar cómo reaccionan los interruptores en el modo PIE. Como verás, cada instancia de tu interruptor puede contener materiales de activación y desactivación únicos sin tener que crear nuevos interruptores desde cero, lo que acelera tu desarrollo y reduce la sobrecarga.
Si quieres que tu visor sea exactamente igual al nuestro, elimina la segunda instancia de tu interruptor antes de continuar con este tutorial.
Crea activaciones únicas y múltiples
Tu interruptor se enciende y apaga indefinidamente. En algunos casos, conviene activarlo solo una vez. Por ejemplo, en un pasillo que lleva al botín, puede que te interese un interruptor que active una trampa que el jugador deba evitar. Si el jugador evita la trampa y recoge el botín, el interruptor no debería activar la trampa de nuevo.
En lugar de descartar lo que ya has compilado, añadirás un booleano para permitir un solo uso de tu modificador.
Nombre de la variable | Clase | Valor por defecto | Explicación |
ActivateOnce | Booleano | False | Determina si este interruptor debe poder activarse repetidamente o solo una vez. |
Para ello, deberás seguir los siguientes pasos:
En el editor de blueprints de
BP_Switch, en Variables, haz clic en el botón + para añadir una nueva variable.Llámala
ActivateOncey establece que el tipo de pin sea Booleano.En el panel Detalles, marca la casilla Editable por instancia.
Haz clic en el menú desplegable junto a Categoría y selecciona Configuración.
Haz clic en Compilar para acceder al valor predeterminado de la variable y comprueba que esté sin seleccionar. Esto significa que ActivateOnce no estará activado por defecto para este blueprint.
En el grafo de eventos, haz clic derecho y busca un nodo Branch.
Desde el pin Condición del nodo Branch, arrastra y busca Get ActivateOnce.
Arrastra el pin Ejecución del nodo On Component End Overlap (Trigger) hasta el pin Ejecución del nodo Branch. Debería desconectarse del nodo SetMaterial.
Conecta el pin Falso del nodo Branch con el pin Ejecución del nodo Set Material. Esto significa que cuando el objeto se aleja del interruptor, se toma una decisión: si ActivateOnce es Verdadero, el interruptor deja de detectar colisión. Si ActivateOnce cambia a Falso, el interruptor funcionará indefinidamente.
Guarda, compila y cierra el blueprint.
Selecciona
BP_Switchen el visor. En el Detalles, debería aparecerActivateOnce como casilla de verificación activa para esta instancia. Actívala para ver cómo funciona.
Tu grafo de eventos debería tener este aspecto:
Haz clic en Reproducir para probar tu variable en modo PIE. Con ActivateOnce activado, el interruptor debería permanecer iluminado incluso después de alejarte de él.
Activa interruptores con físicas
Más adelante en este tutorial, tu jugador tendrá que mantener pulsado el interruptor mientras se desplaza por el resto del nivel. Para ello, crearás el segundo objeto de jugabilidad de este rompecabezas: el cubo de física. Esto incorpora la mecánica del juego, la física, en el rompecabezas que diseñes.
Para crear un cubo de física con blueprint, sigue estos pasos:
En el explorador de contenido, ve a AdventureGame > Diseñador > Blueprints > Activation, haz clic derecho y crea una nueva clase de blueprint.
En el cuadro de diálogo Seleccionar clase padre, selecciona Actor.
Llama al nuevo blueprint
BP_Cube.Haz doble clic sobre él para abrir
BP_Cubeen el editor de blueprints.En la pestaña Componentes, crea una malla estática haciendo clic en Añadir, busca el
cuboy selecciónalo.Llama a la malla
Cube.En el panel Detalles, en Malla estática, busca y selecciona SM_ChamferCube.
Establece la ubicación Z en
50.0.En Materiales, establece que Elemento 0 sea
M_BasicColor_Blue.En Física, activa Simular física. Este ajuste activa el uso del motor Chaos Physics de UE, lo que permite que el cubo reaccione a los empujones del jugador.
Guarda y compila.
Para probar las función, arrastra una instancia de BP_Cube a tu nivel, cerca del interruptor. Pulsa Reproducir para entrar en el modo PIE y usa las teclas alfabéticas WASD para colocar BP_Cube en un interruptor y activarlo.
Depuración
Si empujas el cubo contra el interruptor, este se encenderá, pero es posible que detectes un problema. Si te alejas del interruptor, este se desactiva aunque el cubo siga superponiéndose con él.
Fíjate en la lógica actual para encontrar el error:
Si el activador deja de detectar una colisión, configura el material de Interruptorcomo OffMaterial.
Para solucionar este problema, indica al activador que compruebe si hay actores superpuestos antes de continuar:
Si el activador deja de detectar una colisión y no hay actores que se superpongan con él, configura el material de Interruptorcomo OffMaterial.
Para realizar este ajuste en tus blueprints, sigue estos pasos:
Haz clic derecho en
BP_Switchen el editor de blueprints y crea un nodo Branch.Arrastra desde el pin Condición, busca y crea un nodo Is Empty (Array).
En el pin Matriz objetivo del nodo Is Empty, busca y crea Get Overlapping Actors (Trigger).
Selecciona Actor para Filtro de clase.
Conecta esta lógica a los nodos existentes arrastrando desde el pin Falso del primer nodo Branch y conéctalo al pin Ejecución del segundo nodo Branch.
Conecta el pin Verdadero del segundo nodo Branch al pin Ejecución del nodo Set Material.
Guarda y compila.
Tu grafo de eventos debería tener este aspecto:
Para ajustar los ajustes de colisión de Activador, sigue estos pasos:
En la pestaña Componentes, selecciona Activador.
En el panel Detalles, debajo del encabezado Preajustes de colisión, elige Personalizado en el menú desplegable.
En el desplegable Colisión habilitada, selecciona Colisión habilitada (consulta y física).
En el desplegable Tipo de objeto, selecciona WorldDynamic.
Junto a WorldDynamic, marca Ignorar.
Guarda y compila.
Entra en modo PIE para probar tu solución. El interruptor debería permanecer iluminado mientras cualquier actor se superponga con él, independientemente de si uno se desplaza o no.
Crea funcionalidad adicional
Hasta ahora, has creado un interruptor que se activa y se desactiva. Eso es excelente para visualizar si el interruptor está funcionando correctamente, pero podría ser más útil. A continuación, usarás el interruptor para activar otros objetos dentro del nivel.
Primero, crearás una interfaz de Blueprint con dos funciones; cada una representa el estado activado y desactivado del interruptor. Estas funciones se usan como eventos que se señalan entre objetos.
En el explorador de contenido, ve a AdventureGame > Diseñador > Blueprints > Core, haz clic derecho y selecciona blueprint. Luego, selecciona Interfaz de Blueprint.
Dale a la interfaz el nombre
BPI_Interaction. Haz doble clic para abrir la ventana Interfaz de Blueprint.En el panel My Blueprint, ya debería existir una nueva función. Nómbrala
fnBPISwitchOn.Haz clic en Añadir y luego en Función para crear una segunda función. Nómbrala
fnBPISwitchOff.Tu interfaz está completa. Guarda, compila y ciérrala.
A continuación, crearás una matriz que contenga todos los objetos que quieras que se activen con el interruptor. En este tutorial, usarás una matriz para gestionar qué objetos activa tu interruptor, en lugar de crear una lógica única para cada objeto nuevo.
Nombre de la variable | Clase | Valor por defecto | Explicación |
InteractObjectList | Matriz de actores | Nada | La matriz de actores que activa este interruptor. |
En la pestaña My Blueprint de
BP_Switch, debajo de VARIABLES, haz clic en el botón + para crear una nueva variable.Nómbrala
InteractObjectListy establece que el tipo de pin sea Actor (Object Reference).En el panel Detalles, junto a Tipo de variable, establece que el tipo de contenedor sea Matriz.
Para convertirlo en un parámetro de la IU, marca Editable por instancia y añádelo a la categoría Configuración.
Guarda y compila.
Usando la lógica, le indicarás al interruptor que itere a través de cada objeto de la matriz (que actualmente está vacía) y lo señalará mediante la interfaz BPI_Interaction que creaste antes. Para ello, usarás un nodo For Each Loop.
Para ello, deberás seguir los siguientes pasos:
En el grafo de eventos, arrastra desde el pin Ejecución del nodo Set Material (del nodo On Component Begin Overlap) y busca For Each Loop.
Para indicar para qué objetos realizar el evento, arrastra el pin Matriz del nodo For Each Loop y busca Get InteractObjectList.
Por último, arrastra el pin Cuerpo del bucle del nodo For Each Loop y busca fnBPISwitchOn. Este es el evento al que estás llamando.
Conecta el pin Elemento de matriz del nodo For Each Loop con el pin Objetivo del nodo fnBPISwitchOn.
Lo mismo se debe hacer para On Component End Overlap (Trigger). Para acelerar el proceso, selecciona el nodo For Each Loop and Interact Objeto List y cópialo con clic derecho > Copiar o Ctrl + C. Pulsa Ctrl + P para pegarlo en el grafo.
Conecta el pin Ejecución del nodo Set Material con el pin Ejecución del nodo For Each Loop.
Desde el pin Cuerpo del bucle de For Each Loop, arrastra y busca fnBPISwitchOff. Conecta el pin Elemento de matriz con el pin Objetivo.
Por ahora has terminado con el interruptor. Guarda, compila y ciérralo.
Tu grafo de eventos debería tener este aspecto:
Ya has sentado las bases para activar una lista única de objetos en tu nivel por cada instancia de tu switch. En el siguiente tutorial, crearás el tercer objeto de jugabilidad de este desafío: una plataforma móvil.