Hoy vamos a aprender sobre los “ScriptableObjects” en C# y Unity.
En Unity, uno de los problemas más comunes al desarrollar un juego es cómo manejar y organizar grandes cantidades de datos (estadísticas de personajes, configuraciones de armas, información de niveles, etc.). Usar prefabs o clases puras puede volverse caótico. Por eso, Unity ofrece una solución poderosa y elegante: los ScriptableObjects.
En este tutorial aprenderás a:
- Qué es un ScriptableObject
- Cómo crearlos y usarlos
- Casos prácticos: enemigos, armas, ítems
- Cómo editarlos en el Inspector
- Beneficios frente a otras soluciones
Tutorial de Unity Nivel: Principiante.
7.1 ¿Qué es un ScriptableObject?
Un ScriptableObject es una clase especial en Unity que almacena datos de manera serializable y editable en el Inspector, sin necesidad de instanciarla como GameObject en la escena. Es como un “asset de datos” que puedes guardar en tu proyecto y usar en cualquier parte de tu juego.
Para poder diferenciar un ScriptableObject de un script común con MonoBehaviour tenemos lo siguiente:
Característica | MonoBehaviour | ScriptableObject |
---|---|---|
Necesita GameObject | Sí | No |
Se ejecuta en escena | Sí | No |
Reutilizable por muchos objetos | Limitado | Sí |
Ideal para | Comportamiento | Datos |
7.2 Implementando un ScriptableObject
Para crear un ScriptableObject primero hay que crear un script que defina las características que este debe tener.
Así que, primero creamos el archivo EnemigoData.cs
using UnityEngine; [CreateAssetMenu(fileName = "NuevoEnemigo", menuName = "Juego/Enemigo")] public class EnemigoData : ScriptableObject { public string nombre; public int vida; public float velocidad; public Sprite retrato; }
Ya con esto hecho, procederemos a hacer lo siguiente para tener listo a nuestro ScriptableObject (en otras palabras, necesitamos crear una instancia en el editor), así que:
- Haz clic derecho en un espacio vacío dentro del contenido de la pestaña “Project” (es la parte donde se muestran las carpetas de los assets que usas para tu proyecto).
- Selecciona: Create > Juego > Enemigo.
- Se crea un asset editable de tipo EnemigoData con el nombre por defecto “NuevoEnemigo”.
Ahora vamos a crear un script que le de uso a nuestro ScriptableObject.
Creamos Enemigo.cs
using UnityEngine; public class Enemigo : MonoBehaviour { public EnemigoData datos; private int vidaActual; void Start() { vidaActual = datos.vida; Debug.Log($"Soy {datos.nombre}, tengo {datos.vida} de vida y me muevo a {datos.velocidad}."); } void Update() { transform.Translate(Vector3.left * datos.velocidad * Time.deltaTime); } }
Cómo usarlo en la escena:
- Crea un prefab de enemigo (GameObject con script Enemigo.cs).
- En el Inspector, arrastra un asset de EnemigoData al campo datos.
- Puedes usar el mismo script en diferentes enemigos, cada uno con su propia configuración.
Otro Ejemplo con ScriptableObjects, “Sistema de armas”
Creamos ArmaData.cs
[CreateAssetMenu(fileName = "NuevaArma", menuName = "Juego/Arma")] public class ArmaData : ScriptableObject { public string nombre; public int daño; public float velocidadDisparo; public GameObject prefabProyectil; }
Después generamos el ScriptableObject correspondiente
Ahora creamos Jugador.cs
public class Jugador : MonoBehaviour { public ArmaData armaEquipada; void Update() { if (Input.GetButtonDown("Fire1")) { Disparar(); } } void Disparar() { Instantiate(armaEquipada.prefabProyectil, transform.position, Quaternion.identity); Debug.Log($"Disparo con {armaEquipada.nombre}, daño: {armaEquipada.daño}"); } }
Con esto puedes cambiar fácilmente de arma solo arrastrando otro ScriptableObject al jugador.
Otros ejemplos que son útiles, pueden ser:
Lista de enemigos (OlaDeEnemigos.cs)
[CreateAssetMenu(fileName = "NuevaOla", menuName = "Juego/OlaDeEnemigos")] public class OlaDeEnemigos : ScriptableObject { public EnemigoData[] enemigos; }
Luego puedes hacer que un spawner recorra esta lista para generar enemigos según la ola.
ScriptableObject como archivo de Configuración
[CreateAssetMenu(fileName = "ConfigJuego", menuName = "Juego/Configuracion")] public class ConfiguracionJuego : ScriptableObject { public float volumenMusica; public float sensibilidadMouse; }
Lo cargas en un SettingsManager.cs y puedes tener un solo asset central para toda la configuración.
7.3 Conclusión
Los ScriptableObjects son una herramienta poderosa para cualquier desarrollador de Unity que quiera organizar su código y datos de manera modular, escalable y reutilizable. Usarlos correctamente puede marcar la diferencia entre un proyecto caótico y uno profesional. Piensa en ellos como “archivos de configuración con superpoderes” que cualquier parte de tu juego puede leer.
Ventajas de usar ScriptableObjects:
- Evitan duplicación de datos
- Fácil de editar sin entrar al código
- Ahorra memoria, porque puedes compartir el mismo asset en múltiples objetos
- Ideal para diseñadores o equipos multidisciplinarios
- Facilita testing y modularidad
Comparación frente a prefabs y clases normales
Recurso | Reutilizable | Editable en tiempo real | Independiente de escena |
---|---|---|---|
Clase normal | No | No | Si |
Prefab | Si | Si (pero requiere GameObject) | No |
ScriptableObject | Si | Si | Si |
Y recuerda:
- Usa los ScriptableObjects preferentemente para datos inmutables
- Mantener lógica fuera del ScriptableObject (solo datos)
- Usar CreateAssetMenu para facilitar la creación
- Evitar modificar los ScriptableObject en tiempo de ejecución si será compartido
Ejercicios.
Para reforzar lo aprendido, es necesario practicarlo, por ello intenta realizar los siguientes ejercicios:
- Siguiendo los ejemplos de este tutorial, crea tu propio ScriptableObject para desarrollar un código sencillo que use su información para realizar operaciones aritméticas.
Este Tutorial de Unity termina aquí. Acompáñanos en el siguiente tutorial donde veremos “El patrón Factory”.
Siguiente Tutorial de Unity: “2.”
Unity Tutorial: “C# en Unity 2“
1. Los Métodos Clave de Unity
Ver más Tutoriales