Menu
CoddyTech

Assets de dados

Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 19 de 50.

Um jogo de fazenda cultiva cenouras e abóboras. Uma cenoura cresce por 30 segundos e é vendida por 5 moedas; uma abóbora cresce por 90 segundos e é vendida por 40. Esses números pertencem à cultura, não a uma planta específica: como campos do Inspector em um script Plant, cada cenoura em cada cena guarda sua própria cópia de 30 e 5, e uma alteração significa ter que encontrar todas elas. Um ScriptableObject mantém dados como esses em um asset, um arquivo no projeto para o qual qualquer número de objetos pode apontar. Sua classe deriva de ScriptableObject em vez 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] coloca a classe no menu Create da janela Project. Clique com o botão direito na janela Project, escolha Create > Farm > Plant Data, e o Unity cria um asset chamado NewPlant; renomeie-o para Carrot, selecione-o e digite Carrot, 30 e 5 em seus campos no Inspector. Um asset Pumpkin é criado da mesma forma. A classe fica em um arquivo com o mesmo nome, PlantData.cs, assim como acontece com um MonoBehaviour.

O comportamento fica em um MonoBehaviour com um campo do tipo do asset. Arraste o asset Carrot para esse campo, e o script lê os números por meio dele:

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;
        }
    }
}

Um ScriptableObject não está em nenhum GameObject nem em nenhuma cena. Ele não tem Transform, e o Unity nunca chama seu Update ou Start: ele armazena dados, e o Plant contém o comportamento. Quando 200 cenouras apontam para o único asset Carrot, definir seu growTime como 25 altera os 200. No código, uma instância é criada com ScriptableObject.CreateInstance<PlantData>(), nunca com new.

challenge icon

Desafio

Médio

O Hero percorre a arena usando as setas. Seu nome, velocidade e cor são campos do script Hero, e cada novo herói teria que copiá-los novamente. Mova-os para um asset:

  • Em HeroData.cs, escreva HeroData, um ScriptableObject com os campos públicos heroName (uma string), moveSpeed (um float) e color (uma Color). Adicione a ele [CreateAssetMenu] com o nome de menu Heroes/Hero Data.
  • Em Hero.cs, substitua os três campos por um único campo público data do tipo HeroData e use os valores do asset onde o script usava os próprios valores.

O projeto tem um asset Knight criado com esse menu (Knight, velocidade 3, vermelho), e o Inspector o coloca no campo data do Hero. Pressione Play e movimente o Knight pela arena, depois Check.

Experimente você mesmo

using UnityEngine;

// HeroData: o nome, a velocidade e a cor do herói, como um ScriptableObject
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Arquitetura de jogos no Unity