MVC (Model-View-Controller) es un esquema que consiste en dividir los datos de la aplicación, la interfaz de usuario y la lógica de control en tres componentes separados para que cada uno de ellos pueda modificarse independientemente. El desarrollador
Cem Ugur Karacam compartió su experiencia de programación en Unity y habló brevemente sobre los Objetos Scriptables. Presentamos una traducción de su artículo publicado en dev.to.

Bienvenido a la primera parte de mi charla sobre la implementación de MVC en Unity utilizando objetos de secuencias de comandos. En este artículo escribí solo sobre los conceptos básicos del trabajo con Objetos programables, y en general el texto será simple y claro.
Primero, descubra lo que dicen los desarrolladores de Unity acerca de los Objetos de secuencias de comandos:
- Esta es una clase que se puede heredar para crear un objeto que no se debe adjuntar a otro objeto en la escena.
- El mayor beneficio de tal objeto creado será si lo usa solo para guardar datos.
Ahora es lógico preguntar: ¿por qué Objetos de secuencias de comandos?
Scriptable Objects es parte de la funcionalidad del motor de Unity, por lo que dichos objetos tienen muchas características integradas para trabajar con el editor.
Me gusta el enfoque utilizado al desarrollar proyectos en Unity. Puede crear sus propias herramientas y personalizar fácilmente las que están instaladas por defecto. Los objetos con secuencias de comandos amplían significativamente sus capacidades, ya que le permiten crear contenedores personalizados para datos y almacenarlos como activos en el proyecto.

La imagen de arriba es un ejemplo del uso del Objeto Scriptable en Unity. Un único archivo .asset creado en un proyecto puede contener información necesaria para el funcionamiento de varios sistemas y garantizar la preservación de su configuración. Si desea obtener más información, hay un excelente video en YouTube con una presentación sobre SO (Objeto con
secuencia de comandos ) llamado "
Derribar la tiranía MonoBehaviour en una gloriosa revolución de objetos con secuencia de comandos ".

Otro gran ejemplo se muestra arriba. Aquí, los objetos del juego hacen referencia a un objeto de Inventario, y el Sistema Guardar los gestiona a todos. Esta imagen es de otra excelente conferencia, "Arquitectura de juegos con objetos programables" (
Arquitectura de juegos con objetos programables ), le recomiendo que se familiarice con ella.
Otra gran característica es que cuando entiendes los Objetos de secuencias de comandos, lo más probable es que no quieras usar otros formatos de almacenamiento de datos, como JSON o XML, ya que SO es el formato más conveniente para almacenar datos en Unity.
Bueno, echemos un vistazo a los objetos con secuencias de comandos en acción.
using UnityEngine; public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; } public enum ItemType { Dagger, Axe, Sword, Staff }
Escribimos una clase llamada
ItemData
y varias propiedades típicas de los juegos de rol. A continuación, crearemos varios de estos elementos en el proyecto, obtendremos acceso a ellos desde el script y mostraremos los valores en la consola. Pero primero, agregue una línea importante a nuestro código.
using UnityEngine; [CreateAssetMenu] public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; } public enum ItemType { Dagger, Axe, Sword, Staff }
El atributo
CreateAssetMenu
que agregamos antes de la clase
ItemData
indica a Unity que queremos crear archivos .asset en los que nuestra clase se almacenará a través del menú. De lo contrario, no podremos hacer esto usando el botón derecho del mouse o el botón Crear en la carpeta del proyecto.


Cree una carpeta llamada
Items
e intente crear un objeto
ItemData
en esta carpeta.

Ahora escribiremos otro script llamado
Inventory
para trabajar con el archivo de datos.
using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; }
Agregue un método que generará información en la consola. También ejecutamos una verificación para no ir más allá de los límites de la matriz, sino evitar la matriz en un círculo.
using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; int index = 0; public void NextItemInfo() { if (index > inventory.Length) { index = 0; } Debug.Log("Item name: " + inventory[index].name); Debug.Log ("Attack power: " + inventory[index].attack); switch(inventory[index].type) { case ItemType.Axe: Debug.Log("Item type: Axe"); break; case ItemType.Dagger: Debug.Log("Item type: Dagger"); break; case ItemType.Staff: Debug.Log("Item type: Staff"); break; case ItemType.Sword: Debug.Log("Item type: Sword"); break; } index ++; } }
Asignaré una llamada a nuestro método a la barra espaciadora. En Unity, esto es muy fácil. Gracias a la clase
Input
, podemos verificar en el método
Update
si se ha presionado la tecla requerida.
using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; int index = 0; private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { NextItemInfo(); } } public void NextItemInfo() { if (index > inventory.Length) { index = 0; } Debug.Log("Item name: " + inventory[index].name); Debug.Log ("Attack power: " + inventory[index].attack); switch(inventory[index].type) { case ItemType.Axe: Debug.Log("Item type: Axe"); break; case ItemType.Dagger: Debug.Log("Item type: Dagger"); break; case ItemType.Staff: Debug.Log("Item type: Staff"); break; case ItemType.Sword: Debug.Log("Item type: Sword"); break; } index ++; } }
Es hora de volver al editor de Unity.
ItemData
nuestra matriz de
inventory
con archivos
ItemData
creados
ItemData
desde la carpeta
Items
. Pero primero, cree un objeto vacío en la escena y agréguele nuestro script de
Inventory
.

Ahora ejecutemos el proyecto y probémoslo.

Funciona! Y ahora quiero mostrarle que el Objeto Scriptable puede almacenar no solo datos, sino también métodos para trabajar con ellos. Por ejemplo, agreguemos un método para calcular el precio en la clase
ItemData
. Para obtener más información sobre esto, consulte los documentos
aquí y
aquí .
using UnityEngine; [CreateAssetMenu] public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; public float GetPrice() { return attack * 40; } }
Luego usamos nuestro nuevo método en la clase
Inventory
.
using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; int index = 0; private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { NextItemInfo(); } } public void NextItemInfo() { if (index == inventory.Length) { index = 0; } Debug.Log("Item name: " + inventory[index].name); Debug.Log ("Attack power: " + inventory[index].attack); switch(inventory[index].type) { case ItemType.Axe: Debug.Log("Item type: Axe"); break; case ItemType.Dagger: Debug.Log("Item type: Dagger"); break; case ItemType.Staff: Debug.Log("Item type: Staff"); break; case ItemType.Sword: Debug.Log("Item type: Sword"); break; } Debug.Log("Item price: " + inventory[index].GetPrice()); index ++; } }
Ahora reproduciremos todo y miraremos el resultado.

¡Los ejemplos de este tutorial están en
GitHub !
La primera parte de la historia llegó a su fin. En el próximo artículo, hablaremos sobre el uso de MVC en Unity. Pero, dado que ya estamos familiarizados con los Objetos de secuencias de comandos, agregaremos algunas características nuevas para que sea más genial y más difícil como lo hacen los verdaderos gurús de Unity.