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.
Desafio
MédioO 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, escrevaHeroData, um ScriptableObject com os campos públicosheroName(uma string),moveSpeed(um float) ecolor(uma Color). Adicione a ele[CreateAssetMenu]com o nome de menuHeroes/Hero Data. - Em
Hero.cs, substitua os três campos por um único campo públicodatado 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
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
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens