El ScriptableObject es una clase que nos permite almacenar grandes cantidades de datos compartidos independientes de instancias de script. No confunda esta clase con la muy similar Seria- lizableObject, la cual es una clase del editor y llena un propósito diferente.
Considere por ejemplo que usted ha hecho un prefab con un script que tiene un arreglo de millones de enteros. El arreglo ocupa 4MB de memoria y su dueño es el prefab. Cada vez que usted instancia el prefab, usted va a obtener una copia de ese arreglo. Si usted ha creado 10 game ob- jects, entonces usted terminaría con 40MB de datos del arreglo para las 10 instancias.
Unity serializa todos los tipos primitivos, strings, arreglos, listas, tipos específicos para Unity tal como Vector3 y sus clases personalizadas con el atributo Serializable como copies perteneciendo al objeto en el cual fue declarado. Esto significa que si usted ha creado un ScriptableObject y almacena millones de enteros en un arreglo, entonces declara que el arreglo será almacenado con la instancia. Las instancias son pensadas en sus propios datos individuales. Los campos ScriptableObject, o cualquier campo UnityEngine.Object, tal como MonoBehaviour, Mesh, GameObject y así, son almacenados por referencia opuesto a un valor. Si usted tiene un script con una referencia al ScriptableObject con un millón de enteros, Unity va a solamente guardar una referencia al ScriptableObject en los datos de script. El ScriptableObject por el contrario, almacenada el arreglo. 10 instancias de un prefab que tiene una referencia ScriptableObject , que mantiene 4MB de datos, va a pesar en total 4MB y no 40MB como se discutio en el otro ejemplo.
El caso intencionado para utilizar el ScriptableObject es reducir el uso de memoria al evitar la copias de valores, pero usted también puede utilizarlo para definir conjuntos de datos conecta-bles. Un ejemplo de esto sería imaginar una tienda NPC en un juego RPG. Usted puede crear múltiples assets de su ScriptableObject ShopContents personalizado, cada uno definiendo un conjunto de items que están disponibles para compra. En un escenario dónde el juego tiene tres zonas, cada zona puede ofrecer diferentes tipos de items. El script de su tienda podría referenciar un objeto ShopContents que define qué items están disponibles.
A continuación vamos a importar un scriptable object desde la pestaña del Asset Store de Unity. Para ello deberemos abrir nuestra cuenta en la ventana Asset Store. Si no la tenemos abierta nos dirigimos a Window>Asset Store y la acoplamos a cualquiera de las ventanas que nos resulte comodo para interactuar con ella.
Una vez abierta nuestra tienda de assets deberemos entrar con nuestra cuenta de unity para poder descargar el paquete de los objetos scriptable que vamos a utilizar a continuación.
Deberemos de buscar nuestro objeto escriptable desde el buscador de assets que aparece con una lupa.
Ponemos scriptable object en cuadro de texto que se encuentra a la derecha de dicha lupa.
Elegimos el que aparece en la imagen. Es gratuito. Al clicar sobre el solo tendremos que dar a descargar
Una vez descargado, nos venimos a Unity y desde el menu Window>Package Manager y dentro de este elegir la opción de My assets e importar nuestro objeto escriptable a nuestro proyecto
Le damos primero a download y despues a Import. Dejamos que cargue y ya lo tenemos en nuestro proyecto para poder trabajar con él.
Ahora vamos a crear una carpeta donde almacenaremos estos objetos escriptables. Nos vamos a Assets y dentro creamos una carpeta a la cual llamaremos ScriptableObjects
Dentro de ella haremos tres carpetas una llamada Events otra Levels y otra Scenes. Aquí vamos
a guardar los objetos progamables, los assets que contienen los datos.
Luego nos vamos a la carpeta de Script y creamos las siguientes carpetas que aparecen en la imagen que hay a continuación. Tenéis el contenido de las carpetas dentro de la carpeta de material llamada Proyecto Final. Solo tendréís que arrastrar su contenido a estas carpetas que hemos creado. Desde el directorio de Assets del proyecto que está en formato Zip
Si abrimos la carpeta de GameArchitecture nos encontramos con estas carpetas que contienen los programas que van a definir el comportamiento de nuestro juego, el cambio de escenas, los diálogos entre personajes, los controles y movimientos de cada parte del juego.
Ahora abrimos la carpeta ScriptableObjects y en la subcarpeta Levels tenemos dos carpetas una llamada
House y la otra Town. Dentro de House vamos a crear un scriptableObject. Clic botón derecho
y elegimos la opción de ScriptableObject>Scene
Lo llamamos House tanto en el directorio como en el inspector
Y ahora vamos a hacer lo misom pero para añadir una entrada de nivel. Clic botón derecho>Create>Scriptable Object>Level>Level Entrance
Pasamos a llamar a este archivo House Entrance
Repetimos el proceso para Town, creamos dos scriptable Objects uno que sea de tipo scene y otro de tipo level Entrance.
Ahora añadimos tres entradas mas a nuestro Town. Ya que va a ver cuatro entradas a la escena de Town. Una entrada en el extremo izquierdo del mapa, otra entrada en el extremo derecho. Otra para entrar en la casa y una cuarta para acceder a un nivel de batalla de nuestro juego. Se ven en la siguiente imágen donde estarán colocadas cada vez que queramos llamar a otra escena desde estos objetos escriptables(programables)
Volvemos a la carpeta principal de Scriptable Objects y creamos con el botón derecho Create>Scriptable Object>Player Path
Ahora vamos a hacer que nuestras escenas carguen lo que necesiten. Para ello vamos a ver el script SceneInicializer, que se encuentra dentro de Scripts>Level
En la parte superior se nos carga lo que utiliza Unity para que se cargue la programación. En este caso el programa necesita usar los llamados UnityEngine que cargan una serie de funcionalidades a nuestro código. El más importante es el que pone UnityEngine.SceneManagement ya que este permite que podamos cambiar de escenas dentro de nuestro juego.
En estas líneas de código lo que estamos es creando el comportamiento de carga de escenas cuando nuestro Player pase por las entradas que definamos desde la escena Town cambie a la escena que le digamos desde las dependencias que pondremos desde la ventana Inspector.
Los ScriptableObjects son una característica poderosa de Unity que te permite crear objetos personalizados que contienen datos y funcionalidades reutilizables sin la necesidad de crear instancias de clases MonoBehaviour:
1. Crear un ScriptableObject:
1.1. Crear ScriptableObject:
- Crea una nueva clase que herede de
ScriptableObject
.
using UnityEngine; [CreateAssetMenu(fileName = "NuevoObjetoScriptable", menuName = "Scriptables/ObjetoScriptable")] public class ObjetoScriptable : ScriptableObject {public string nombre; public int valor; public Sprite icono; }
1.2. Añadir Datos:
- Define las variables y datos que deseas incluir en tu ScriptableObject.
2. Crear Instancia del ScriptableObject:
2.1. Crear Instancia:
- Haz clic derecho en el Assets, selecciona «Create» -> «Scriptables» y elige tu ScriptableObject.
- Configura los datos en la nueva instancia.
3. Utilizar el ScriptableObject en un Script:
3.1. Referenciar el ScriptableObject:
- Puedes referenciar tu ScriptableObject en cualquier script MonoBehavoir, como en un GameManager.
public class GameManager : MonoBehaviour { public ObjetoScriptable objetoScriptable; voidStart() { Debug.Log("Nombre del Objeto: " + objetoScriptable.nombre); Debug.Log("Valor del Objeto: " + objetoScriptable.valor); } }
3.2. Asignar el ScriptableObject:
- Arrastra y suelta la instancia del ScriptableObject en el campo público del inspector del GameManager.
4. Uso Avanzado: Listas de ScriptableObjects:
4.1. Crear una Lista:
- Puedes crear listas de ScriptableObjects en otros ScriptableObjects o en scripts MonoBehavoir.
public class ContenedorDeObjetos : ScriptableObject { public List<ObjetoScriptable> objetos = new List<ObjetoScriptable>(); }
4.2. Configurar y Utilizar la Lista:
- Configura y utiliza la lista de ScriptableObjects en el inspector o en tiempo de ejecución.
5. Beneficios de los ScriptableObjects:
5.1. Reutilización:
- Puedes reutilizar ScriptableObjects en varios lugares sin duplicar código.
5.2. Configuración en el Inspector:
- Puedes ajustar los datos de los ScriptableObjects en el inspector de Unity.
5.3. Fácil de Versionar:
- Los ScriptableObjects son serializables, lo que facilita el versionamiento y la colaboración.
5.4. Centralización de Datos:
- Puedes centralizar datos compartidos entre diferentes objetos y sistemas en un solo ScriptableObject.
6. Ejemplo de Configuración en el Inspector:
6.1. Añadir en el Inspector:
- Configura variables y atributos visibles en el inspector.
[CreateAssetMenu(fileName = "NuevoObjetoScriptable", menuName = "Scriptables/ObjetoScriptable")] public class ObjetoScriptable : ScriptableObject { [Header("Configuración del Objeto")] public string nombre; public int valor; publicSprite icono; }