Menu
CoddyTech

Ativos de Dados

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 23 de 64.

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 tem sua própria cópia de 30 e 5, e uma alteração exige encontrar todas elas. Um ScriptableObject mantém dados como esses em um asset, um arquivo no projeto para o qual qualquer quantidade 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 nos campos dele no Inspector. Um asset Pumpkin é criado da mesma maneira. A classe fica em um arquivo com o mesmo nome, PlantData.cs, assim como 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 mantém dados, e Plant mantém o comportamento. Quando 200 cenouras apontam para o único asset Carrot, definir seu growTime como 25 altera as 200. No código, uma instância é criada com ScriptableObject.CreateInstance<PlantData>(), nunca com new.

challenge icon

Desafio

Médio

Mova as configurações do herói para um recurso de dados.

  1. Em HeroData.cs, escreva public class HeroData : ScriptableObject com string heroName, float moveSpeed e Color color públicos.
  2. Coloque [CreateAssetMenu(menuName = "Heroes/Hero Data")] na linha acima dele.
  3. Em Hero.cs, substitua os três campos por public HeroData data; e leia data.heroName, data.moveSpeed e data.color no lugar deles.

Pressione “Jogar”: o Cavaleiro vermelho caminha na velocidade 3. Depois, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;

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

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

Pratique por conta própria: Playground de Unity