ScriptableObjects - Parte 5 - Helix Jump
Creando un juego estilo Helix Jump en Unity
¡Bienvenidos de nuevo al blog! Tras aprender los fundamentos de los ScriptableObjects en nuestras entregas anteriores, hoy aplicaremos estos patrones de diseño para desarrollar las bases de un juego arcade estilo Helix Jump. Verás cómo centralizar la configuración de los niveles y las estadísticas globales facilita la creación de múltiples etapas sin tocar código.
- Cómo configurar los parámetros de un nivel (número de pisos, colores, velocidad de giro) usando un ScriptableObject.
- Cómo controlar la rotación de la torre mediante deslizamiento (touch/mouse swipe).
- Cómo mantener una arquitectura limpia separando los datos visuales de la lógica de juego.
1. Paso 1: Configuración del Nivel (HelixLevelConfig.cs)
En un juego tipo Helix, cada nivel puede tener diferentes características: altura de la torre, colores de las plataformas o dificultad. En lugar de quemar estos datos en un script de escena, crearemos un ScriptableObject para configurarlos individualmente.
using UnityEngine;
[CreateAssetMenu(fileName = "LevelConfig", menuName = "ScriptableObjects/Helix/LevelConfig")]
public class HelixLevelConfig : ScriptableObject
{
[Header("Parámetros de la Torre")]
public int totalPlatforms = 15;
public float distanceBetweenPlatforms = 2f;
[Header("Dificultad y Velocidad")]
public float rotationSpeed = 200f;
[Range(1, 5)] public int gapSizeMultiplier = 2;
[Header("Diseño y Paleta")]
public Color towerColor = Color.cyan;
public Color safePlatformColor = Color.green;
public Color dangerPlatformColor = Color.red;
}
2. Paso 2: Controlador de la Torre (HelixTowerRotator.cs)
El núcleo de la jugabilidad en Helix es rotar la torre deslizando el dedo o el ratón por la pantalla. Crearemos un script sencillo que lea la velocidad de rotación desde nuestro archivo de configuración global o nivel:
using UnityEngine;
public class HelixTowerRotator : MonoBehaviour
{
[SerializeField] private HelixLevelConfig currentLevelConfig;
private float rotationSpeed;
private void Start()
{
if (currentLevelConfig != null)
{
rotationSpeed = currentLevelConfig.rotationSpeed;
}
else
{
rotationSpeed = 200f; // Valor por defecto si no hay SO asignado
}
}
private void Update()
{
// Detectar arrastre del ratón o toque en móvil
if (Input.GetMouseButton(0))
{
float mouseDeltaX = Input.GetAxis("Mouse X");
transform.Rotate(Vector3.up, -mouseDeltaX * rotationSpeed * Time.deltaTime);
}
}
}
3. Paso 3: Generación Dinámica de la Torre
Para construir la torre automáticamente basándonos en los datos del ScriptableObject, crearemos un generador simple. Crea un script llamado HelixTowerGenerator.cs y asígnalo a un GameObject vacío en la escena:
using UnityEngine;
public class HelixTowerGenerator : MonoBehaviour
{
[SerializeField] private HelixLevelConfig levelConfig;
[SerializeField] private GameObject platformPrefab; // Prefab de un piso cilíndrico con hueco
private void Start()
{
GenerateTower();
}
private void GenerateTower()
{
if (levelConfig == null || platformPrefab == null)
{
Debug.LogWarning("Falta asignar el LevelConfig o el Prefab de la plataforma.");
return;
}
float spawnY = 0f;
for (int i = 0; i < levelConfig.totalPlatforms; i++)
{
Vector3 spawnPosition = new Vector3(0, spawnY, 0);
GameObject platform = Instantiate(platformPrefab, spawnPosition, Quaternion.identity, transform);
// Opcional: Aquí puedes cambiar colores o escalas según levelConfig
spawnY -= levelConfig.distanceBetweenPlatforms;
}
}
}
4. Configuración en el Editor de Unity
- Haz clic derecho en tu proyecto:
Create > ScriptableObjects > Helix > LevelConfigy nómbraloLevel_01. - Personaliza los valores en el Inspector (ajusta los colores, la velocidad de rotación a
250y el número de plataformas a20). - Crea un GameObject vacío en tu escena principal, asígnale el script
HelixTowerRotatory elHelixTowerGenerator. - Arrastra tu archivo
Level_01a la ranuraCurrent Level Configde ambos scripts. - ¡Dale al Play y arrastra el ratón de izquierda a derecha para ver cómo gira tu torre proceduralmente!
5. Conclusión
Al utilizar un ScriptableObject para definir las propiedades del nivel, si en el futuro quieres crear el Nivel 2 con mayor velocidad y menos plataformas, solo tienes que duplicar el archivo Level_01 en tus Assets, cambiar sus valores y asignarlo al generador sin modificar una sola línea de código.
¿Te gustaría que en la siguiente parte añadamos la física de la pelota rebotando y la destrucción de plataformas por colores? ¡Déjalo en los comentarios!


Deja un comentario