Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

A 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 Beam com três campos públicos: color (um Color), range e angle (floats). Ela deve aparecer no Inspector.
  • Substitua os seis campos separados por dois campos Beam, wide e focused. 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 definir color, range e spotAngle de 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;
    }
}
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