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.
Desafio
MédioMova as configurações do herói para um recurso de dados.
- Em
HeroData.cs, escrevapublic class HeroData : ScriptableObjectcomstring heroName,float moveSpeedeColor colorpúblicos. - Coloque
[CreateAssetMenu(menuName = "Heroes/Hero Data")]na linha acima dele. - Em
Hero.cs, substitua os três campos porpublic HeroData data;e leiadata.heroName,data.moveSpeededata.colorno 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
1Componentes, não hierarquias
Componentes pequenosUm script base de inimigoComponentes abstratosComponentes trabalhando juntosRevisão: torre modularRevisão: canhão duplo4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de LootRevisão: Sorteie o Loot2Interfaces no Unity
IDamageableInterfaces e TryGetComponentGetComponentsRevisão: tecla de interaçãoRevisão: mais próximo ao alcance5ScriptableObjects
Ativos de DadosAtributos da ArmaConfigurações CompartilhadasSalve o VentoOndas como DadosRevisão: Banco de ItensRevisão: Comprar na LojaPratique por conta própria: Playground de Unity