En este tutorial, aprender谩 a crear y usar Objetos de secuencias de comandos en Unity. Los Objetos programables pueden ayudarlo a mejorar su flujo de trabajo, reducir la huella de memoria e incluso permitirle dividir la arquitectura del c贸digo.
De acuerdo con la documentaci贸n de
Unity , ScriptableObject es un c贸digo de clase que le permite crear Objetos Scriptable en el juego para almacenar grandes cantidades de datos compartidos que son independientes de las instancias de script.
Hay muchas razones para usar Objetos de secuencias de comandos en Unity. Pueden reducir la cantidad de memoria utilizada para cada prefabricado adicional, porque el Objeto Scriptable esencialmente sigue el patr贸n de dise帽o
Flyweight .
Otra ventaja de Scriptable Objects, que ser谩 el tema principal de este tutorial, es su uso para la transferencia de datos conveniente. Consideraremos esta propiedad como un ejemplo de creaci贸n de una tienda de comercio de espadas, que mostrar谩 los par谩metros, precios y descripciones de varias espadas.
Nota: este tutorial asume que est谩 familiarizado con el editor de Unity. Debe comprender c贸mo editar c贸digo en un editor de c贸digo y tener conocimientos b谩sicos de C #. Si necesita mejorar sus habilidades de Unity, consulte otros tutoriales de Unity .
Llegar al trabajo
Comencemos
descargando los materiales que necesitamos.
Descomprima el archivo descargado en un lugar conveniente para usted y abra el proyecto
Tutorial Object Starter-Starter en Unity.
Deber铆a ver la siguiente carpeta creada como parte de la adquisici贸n del proyecto:
- _Configuraci贸n : para el tutorial esta carpeta no es necesaria.
- Escenas : contiene una escena de Sword Merchant que cubriremos a lo largo del tutorial. Abre esta escena.
- Guiones : hasta ahora solo hay un gui贸n, pero durante el tutorial crearemos nuevos.
- Iconos de espada : contiene im谩genes fijas de espadas individuales.
- Prefabricados de espada : Contiene los prefabricados de todas las espadas en la escena del comerciante de espadas.
Crear un objeto programable
Para comenzar, ve a la escena del
comerciante de espadas . Deber铆a verse as铆:
Preparando Objeto Scriptable
隆Es hora de crear el primer objeto programable!
En la carpeta
Scripts , cree un nuevo script llamado
SwordData . Esta clase se utilizar谩 como contenedor para todos los datos de espada que se muestran en la tienda del comerciante de espadas.
Dentro de esta clase, comience por heredar de
ScriptableObject
lugar de
MonoBehaviour
:
public class SwordData : ScriptableObject { }
Esta acci贸n le dice a Unity que todav铆a queremos usar las caracter铆sticas y m茅todos de Unity, al igual que MonoBehaviour normal, pero ya no necesitamos adjuntar este script a GameObject. En cambio, se procesar谩 como cualquier activo normal, que se puede crear de la misma manera que se crea una prefabricada, una escena o un material.
Rellene el script con campos serializados, que contendr谩n todos los datos correspondientes a la informaci贸n que se muestra en la interfaz de usuario de Sword Merchant.
public class SwordData : ScriptableObject { [SerializeField] private string swordName; [SerializeField] private string description; [SerializeField] private Sprite icon; [SerializeField] private int goldCost; [SerializeField] private int attackDamage; }
- swordName :
string
, en la que se almacenar谩 el nombre de la espada. - description :
string
, en la que se almacenar谩 la descripci贸n de la espada. - icono : el sprite que contendr谩 el icono de la espada.
- goldCost :
int
para almacenar el valor de la espada en oro. - attackDamage :
int
para almacenar el da帽o al atacar con una espada.
Nota: SerializeField
En Unity, el atributo SerializeField le permite tener variables de script privadas disponibles en el Inspector. Le permitir谩 establecer valores en el editor sin proporcionar acceso a la variable desde otros scripts.
Cada espada requerir谩 su propia implementaci贸n 煤nica de Scriptable Object
SwordData . Pero antes de que podamos crear estas implementaciones, necesitamos agregar un objeto programable al men煤 de activos.
Agregue nuestro Objeto de
secuencias de comandos al Men煤 de activos agregando el siguiente atributo a la clase
SwordData :
[CreateAssetMenu(fileName = "New SwordData", menuName = "Sword Data", order = 51)] public class SwordData : ScriptableObject
- fileName : nombre predeterminado al crear el activo.
- menuName : nombre del activo que se muestra en el men煤 de activos.
- orden : colocaci贸n de activos en el men煤 de activos. Unity divide los activos en subgrupos con un factor de 50. Es decir, un valor de 51 coloca el nuevo activo en el segundo grupo del men煤 de activos.
Si todo se hace correctamente, puede ir a
Activos >> Crear y ver el nuevo activo de
Datos de espada en el men煤. Debe ubicarse en el segundo grupo bajo el activo Carpeta:
Tambi茅n puede hacer clic con el bot贸n derecho en la ventana Proyecto y tambi茅n ver el nuevo activo de Datos de espada:
Agregar datos
Organizaremos el proyecto creando una carpeta llamada
Objetos programables en la carpeta Scripts, y dentro de esta carpeta otra carpeta llamada
Datos de espada .
Dentro de la carpeta de datos de espada reci茅n creada, cree nuestro primer activo de datos de espada.
El nuevo activo de Sword Data a煤n debe tener el nombre de
archivo predeterminado previamente especificado
FileName . Seleccione un activo y dupl铆quelo seis veces (
Ctrl / Cmd + D ) para crear siete activos de datos de espada, uno para cada una de las espadas. Ahora cambie el nombre de cada activo de acuerdo con los prefabricados:
Haga clic en el primer activo de
Datos de espada en la carpeta Datos de espada y mire la ventana del
Inspector :
Aqu铆 vemos un activo en el que se almacenar谩 informaci贸n sobre una espada en particular. Completa la informaci贸n de cada espada. Intenta darles una descripci贸n 煤nica, valor en oro y da帽os durante un ataque. En el campo Icon Sprite, usa los sprites correspondientes ubicados en la carpeta
Sword Icons :
Felicidades Cre贸 un objeto programable y configur贸 varios activos con este objeto programable.
Usando Objeto Scriptable
Ahora comenzaremos a obtener datos de estos Objetos programables.
Primero, necesitamos agregar algunos m茅todos getter p煤blicos para que otros scripts puedan acceder a campos privados dentro del Objeto Scriptable. Abra
SwordData.cs y agregue lo siguiente en los campos agregados anteriormente:
public string SwordName { get { return swordName; } } public string Description { get { return description; } } public Sprite Icon { get { return icon; } } public int GoldCost { get { return goldCost; } } public int AttackDamage { get { return attackDamage; } }
Abra
Sword.cs y agregue el siguiente c贸digo:
[SerializeField] private SwordData swordData;
Esto es lo que agregamos con este c贸digo:
- El contenedor de datos para los datos de esta espada.
- OnMouseDown es una funci贸n incorporada de MonoBehaviour que se llama cuando el usuario presiona el bot贸n izquierdo del mouse.
- Ejemplos de c贸mo obtener datos de nuestro activo Objeto programable
Regrese a Unity y vaya a la ventana
Jerarqu铆a . Seleccione el objeto de juego 1_Longsword en el prefab espada. Agregue el activo de datos 1_Longsword apropiado a la variable Datos de espada del script Sword.cs en la ventana del Inspector:
Haga clic en Reproducir (
Ctrl / Cmd + P ) en el editor de Unity y luego haga clic en la espada m谩s a la izquierda:
La consola debe mostrar informaci贸n similar a los datos transferidos desde el activo Sword Data.
Los objetos programables facilitan la sustituci贸n de estos datos. Intente insertar diferentes Objetos con gui贸n de datos de espada en el campo Datos de espada de la espada.
Objetos de secuencias de comandos Eventable
Entonces, creamos un Objeto Scriptable, y viste c贸mo puedes acceder a sus datos dentro del juego. 隆Pero a煤n necesitamos integrar Sword Data con la interfaz de usuario!
Puede usar el patr贸n
Singleton r谩pido y sucio para esto. Sin embargo, ahora tenemos otras posibilidades ...
... a saber, objetos con secuencias de comandos! Los utilizaremos para crear c贸digo limpio y bien dividido.
En esta secci贸n, aprender谩 c贸mo crear eventos de juego usando la clase
UnityEvent .
Eventos de juegos y oyentes
En la carpeta Scripts, cree dos scripts:
GameEvent.cs y
GameEventListener.cs . Dependen unos de otros, por lo que para deshacerse de los errores, debe crear ambos.
using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "New Game Event", menuName = "Game Event", order = 52)]
Esto es lo que hace el c贸digo anterior:
- Agrega un GameEvent como un activo al men煤 de activos.
- GameEvent es un objeto programable, por lo que debe heredar de ScriptableObject.
- Lista de GameEventListeners que se suscribir谩n a GameEvent.
- M茅todo para llamar a todos los suscriptores de GameEvent.
- El 煤ltimo GameEventListener firmado ser谩 el primero llamado (煤ltimo en llegar, primero en salir).
- Llama a cada GameEventListeners de UnityEvent.
- Un m茅todo que permite a GameEventListeners suscribirse a este GameEvent.
- Un m茅todo que permite a GameEventListeners darse de baja de este GameEvent.
using UnityEngine; using UnityEngine.Events;
En el c贸digo que se muestra arriba, el proyecto contin煤a desarroll谩ndose:
- Requisito para usar la clase UnityEvent.
- El GameEvent al que se suscribir谩 este GameEventListener.
- La respuesta de UnityEvent que se generar谩 cuando el evento GameEvent lanza este GameEventListener.
- Enlace de un GameEvent a un GameEventListener cuando este GameObject est谩 habilitado.
- Enlace de un GameEvent desde un GameEventListener cuando este GameObject est谩 deshabilitado.
- Se invoca cuando se genera un GameEvent que hace que GameEventListener llame al evento UnityEvent.
驴Es dificil? 隆Nada, lo descubrir谩s con el tiempo!
Entrenamiento de editor
Regrese al editor de Unity y cree una nueva carpeta de
Game Events en Scripts >> ScriptableObjects. Luego crea siete eventos de juego desde el men煤 de activos, como lo hicimos para cada activo de Sword Data. Col贸quelos en la nueva carpeta Game Events.
Reemplace el c贸digo dentro del script
Sword.cs con las siguientes l铆neas:
[SerializeField] private GameEvent OnSwordSelected;
Este c贸digo agrega dos posibilidades a la tienda del comerciante de espadas:
- Generaci贸n de evento de juego al elegir una espada.
- Generaci贸n de eventos cuando haces clic en la espada.
Guarda el gui贸n. Ahora, en cada Objeto de juego de la Jerarqu铆a de la espada, conecta el evento OnSwordSelected correspondiente.
Cada espada ahora tiene un enlace al evento que se activa cuando se hace clic en la espada.
Integraci贸n UI
Ahora debe hacer que la interfaz de usuario funcione. Nuestro objetivo es mostrar los datos de espada correspondientes al hacer clic en cada espada.
UI Links
Antes de actualizar la IU, debe obtener un enlace a cada elemento de la IU. Comencemos creando un nuevo script llamado
SwordMerchant.cs y agregando el siguiente c贸digo a este nuevo script:
using UnityEngine; using UnityEngine.UI; public class SwordMerchant : MonoBehaviour { [SerializeField] private Text swordName;
Usando este c贸digo, agregamos lo siguiente:
- Una referencia al componente de texto del objeto de juego NameText .
- Enlace al componente de texto del objeto de juego DescriptionText .
- Enlace al componente Imagen del objeto de juego Sword_Icon .
- Enlace al componente de texto del objeto de juego GoldText .
- Un enlace al componente de texto del objeto de juego AttackText .
Los objetos del juego anteriores se encuentran en el
SwordMerchantCanvas >> SwordMerchantPanel de la ventana Jerarqu铆a. Agregue el script a GameObject
SwordMerchantCanvas y luego configure todos los enlaces:
Oyentes y respuestas de UI
Todas las espadas tienen un evento al que la UI puede suscribirse usando el script
GameEventListener . Agregue un
GameEventListener para cada evento OnSwordSelected a GameObject
SwordMerchantCanvas :
Como puede ver, nuestro Game Event Listener tiene dos campos: el evento del evento del juego que escucha y la respuesta que se genera cuando se genera el evento del juego.
En nuestro caso, la respuesta ser谩 actualizada por la interfaz de usuario. Agregue el siguiente m茅todo al script
SwordMerchant.cs :
public void UpdateDisplayUI(SwordData swordData) { swordName.text = swordData.SwordName; description.text = swordData.Description; icon.sprite = swordData.Icon; goldCost.text = swordData.GoldCost.ToString(); attackDamage.text = swordData.AttackDamage.ToString(); }
Este m茅todo recibe un activo de Datos de espada y luego actualiza cada campo de la IU con el valor del campo de Datos de espada correspondiente. Tenga en cuenta que
GoldCost y
AttackDamage devuelven un
int
, por lo que debe convertirlo en una cadena de texto.
Usando nuestro nuevo m茅todo, podemos agregar una respuesta a cada
GameEventListener .
Para cada respuesta que agregue, necesita un enlace a nuestro objeto de juego
SwordMerchantCanvas como el valor del campo
Ninguno (Objeto) . Despu茅s de eso, seleccione
SwordMerchant.UpdateDisplayUI en el men煤 desplegable a la derecha de la lista desplegable
Solo tiempo de
ejecuci贸n .
Tenga cuidado y use el activo correcto de Sword Data para cada evento
OnSwordSelected .
Ahora podemos comenzar el juego, hacer clic en la espada y ver que la interfaz de usuario se actualiza en consecuencia.
Como usamos Game Events, puedes simplemente
SwordMerchantCanvas , y todo seguir谩 funcionando, solo sin una interfaz de usuario. Esto significa que los prefabricados de espada est谩n separados de los
SwordMerchantCanvas .
驴A d贸nde ir despu茅s?
Si se perdi贸 algo durante la historia, puede
descargar el proyecto terminado , que se encuentra en los materiales del tutorial.
Si quieres seguir adelante, intenta hacer que cada espada reproduzca su propio sonido. Intente expandir los datos de la espada de objetos programables y escuche los eventos
OnSwordSelected
.
驴Quieres aprender m谩s sobre Unity? Echa un vistazo a nuestra
serie de videos de Unity o lee los
tutoriales de Unity .