Menu
CoddyTech

Activos de datos

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 23 de 64.

Un juego de granja cultiva zanahorias y calabazas. Una zanahoria tarda 30 segundos en crecer y se vende por 5 monedas; una calabaza tarda 90 segundos en crecer y se vende por 40. Esos números pertenecen al cultivo, no a una planta en particular: como campos del Inspector en un script Plant, cada zanahoria de cada escena tiene su propia copia de 30 y 5, y para hacer un cambio hay que encontrarlas todas. Un ScriptableObject guarda datos como estos en un asset, un archivo del proyecto al que puede hacer referencia cualquier cantidad de objetos. Su clase deriva de ScriptableObject en lugar de MonoBehaviour:

using UnityEngine;

[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
    public string plantName;
    public float growTime;
    public int sellPrice;
}

[CreateAssetMenu] incluye la clase en el menú Create de la ventana Project. Haz clic derecho en la ventana Project, elige Create > Farm > Plant Data y Unity creará un asset llamado NewPlant; cámbiale el nombre a Carrot, selecciónalo y escribe Carrot, 30 y 5 en sus campos del Inspector. El asset Pumpkin se crea de la misma manera. La clase va en un archivo con su mismo nombre, PlantData.cs, igual que un MonoBehaviour.

El comportamiento permanece en un MonoBehaviour que tiene un campo del tipo del asset. Arrastra el asset Carrot a ese campo y el script leerá los números a través de él:

public class Plant : MonoBehaviour
{
    public PlantData data;
    private float age;

    void Update()
    {
        age += Time.deltaTime;
        if (age >= data.growTime)
        {
            Debug.Log(data.plantName + " is ready, worth " + data.sellPrice);
            enabled = false;
        }
    }
}

Un ScriptableObject no está en ningún GameObject ni en ninguna escena. No tiene Transform y Unity nunca llama a sus métodos Update o Start: contiene datos, mientras que Plant contiene el comportamiento. Cuando 200 zanahorias hacen referencia al único asset Carrot, cambiar su growTime a 25 modifica las 200. En el código, se crea una instancia con ScriptableObject.CreateInstance<PlantData>(), nunca con new.

challenge icon

Desafío

Intermedio

Mueve la configuración del héroe a un recurso de datos.

  1. En HeroData.cs, escribe public class HeroData : ScriptableObject con string heroName, float moveSpeed y Color color públicos.
  2. Coloca [CreateAssetMenu(menuName = "Heroes/Hero Data")] en la línea de arriba.
  3. En Hero.cs, reemplaza los tres campos por public HeroData data; y lee data.heroName, data.moveSpeed y data.color en su lugar.

Pulsa «Jugar»: el Caballero rojo camina a velocidad 3. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

// HeroData: el nombre, la velocidad y el color del héroe, como ScriptableObject

Todas las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity