Classes Serializáveis
Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 15 de 50.
Um script com muitas configurações gera uma lista longa e plana no Inspector. Uma classe C# simples pode agrupá-las: marque-a com [System.Serializable], e um campo dessa classe será exibido como uma lista expansível com o nome do campo, contendo os campos da classe. Uma classe pode ser usada por vários campos e vários scripts:
[System.Serializable]
public class Stats
{
public float speed = 2f;
public int damage = 10;
}
public class Enemy : MonoBehaviour
{
public Stats normal;
public Stats enraged;
private Stats current;
void Start()
{
current = normal;
}
void Update()
{
transform.Translate(0f, 0f, current.speed * Time.deltaTime);
}
public void Enrage()
{
current = enraged;
}
}O Inspector mostra duas listas expansíveis, Normal e Enraged, cada uma com Speed e Damage. Cada Enemy tem seus próprios dois objetos Stats, preenchidos no seu próprio Inspector, e o código os lê como normal.speed. Unity cria esses objetos quando carrega o script, então normal nunca é nulo, mesmo sem = new Stats(), e os inicializadores dos campos (2 e 10) são os valores iniciais de um novo Enemy. Uma struct funciona da mesma forma com o atributo, [System.Serializable] public struct Range { public float min; public float max; }, e, como Vector3, é copiada quando atribuída.
O atributo é necessário porque Unity salva apenas os tipos para os quais é instruído. Sem ele, a classe fica invisível no Inspector: não há lista expansível, os valores definidos ali não são salvos e Unity não cria o objeto, então normal.speed lança uma NullReferenceException. Dentro da classe, valem as regras habituais do Inspector: campos públicos ou campos privados com [SerializeField], nunca propriedades ou campos estáticos.
Desafio
FácilA lanterna do explorador tem dois feixes, e a tecla Espaço alterna entre eles: um feixe amplo e quente para olhar ao redor e um feixe branco frio e focado que alcança as profundezas da caverna. Flashlight.cs mantém as três configurações de cada feixe em seis campos separados. A cena já está configurada com as configurações agrupadas por feixe, e o script precisa corresponder a ela:
- Declare uma struct
Beamcom três campos públicos:color(um Color),rangeeangle(floats). Ela deve aparecer no Inspector. - Substitua os seis campos separados por dois campos Beam,
wideefocused. A cena define wide como uma cor quente, range 6 e angle 80, e focused como branco frio, range 15 e angle 25. - Faça
Apply()ler o Beam do feixe atual e definircolor,rangeespotAnglede Light com base nele. O restante permanece igual: a lanterna começa com o feixe amplo, e a tecla Espaço alterna os feixes.
Pressione Jogar, pressione Espaço para iluminar o fundo da caverna e, em seguida, Verificar.
Experimente você mesmo
using UnityEngine;
using UnityEngine.InputSystem;
public class Flashlight : MonoBehaviour
{
public Color wideColor = Color.white;
public float wideRange = 5f;
public float wideAngle = 60f;
public Color focusedColor = Color.white;
public float focusedRange = 10f;
public float focusedAngle = 30f;
private bool focusedOn;
private Light lamp;
void Start()
{
lamp = GetComponent<Light>();
Apply();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
focusedOn = !focusedOn;
Apply();
}
}
void Apply()
{
lamp.color = focusedOn ? focusedColor : wideColor;
lamp.range = focusedOn ? focusedRange : wideRange;
lamp.spotAngle = focusedOn ? focusedAngle : wideAngle;
}
}
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