Domínio da Serialização no Unity: Atributos SerializeField e Serializable

O motor Unity possui um sistema robusto de serialização que vincula diretamente os dados do seu código à interface do Editor. Por padrão, qualquer propriedade exposta no Inspector é automaticamente serializada. Isso significa que os valores configurados visualmente são persistidos em disco em formato binário junto com a cena ou prefab correspondente. Compreender como controlar esse comportamento é fundamental para a arquitetura de projetos.

Critérios para Serialização de Variáveis

1. Campos Públicos

Variáveis declaradas com o modificador de acesso public são automaticamente detectadas e serializadas pelo Unity, dispensando o uso de atributos adicionais.

2. O Atributo [SerializeField]

Boas práticas de encapsulamento ditam a restrição de escopo de campos de dados. Para expor variáveis private ou protected no Inspector sem torná-las acessíveis a outras classes, aplica-se este atributo:

[SerializeField]
private float movementSpeed = 5.5f;

3. Classes e Structs Personalizados

Tipos complexos criados pelo usuário que não herdam de MonoBehaviour são ignorados pelo serializador nativo. Para permitir que o Unity registre essas estruturas como dados persistíveis e exiba seus membros no Inspector, é necessário decorar a definição da classe ou struct:

[System.Serializable]
public class WeaponConfiguration
{
    public int baseDamage = 10;
    public float attackRate = 1.2f;
}

4. ScriptableObjects

Para armazenamento de dados complexos, independentes do ciclo de vida de GameObjects, a classe ScriptableObject oferece uma abordagem nativa projetada especificamente para serialização de ativos no projeto.

Restrições e Exclusões de Serialização

1. Modificadores de Acesso Restritos

Campos definidos como private, protected ou internal são excluídos do processo de serialização por padrão.

2. O Atributo [NonSerialized]

Em cenários onde uma variável pública é exigida por APIs externas, mas seus dados não devem ser salvos em disco (como caches de estado volátil), utiliza-se a marcação de exclusão:

[System.NonSerialized]
public bool isCurrentlyProcessing = false;

3. Modificadores de Estado

Variáveis marcadas com static, readonly ou const jamais serão serializadas. Isso ocorre porque esses dados pertencme ao tipo em si ou são imutáveis, não fazendo sentido persisti-los por instância.

4. Contornando a Limitação com Dictionary<TKey, TValue>

O serializador do Unity suporta nativamente coleções como List<T>, mas não procesas dicionários genéricos. Uma estratégia arquitetônica comum é serializar uma lista de estruturas de pares chave-valor e reconstruir o dicionário durante a inicialização do componante:

[System.Serializable]
public struct EnemyData
{
    public string enemyTag;
    public int healthPoints;
}

public List<EnemyData> enemyRegistryList = new List<EnemyData>();
private Dictionary<string, int> activeEnemyStats;

void Awake()
{
    activeEnemyStats = new Dictionary<string, int>();
    
    foreach (var data in enemyRegistryList)
    {
        if (!activeEnemyStats.ContainsKey(data.enemyTag))
        {
            activeEnemyStats.Add(data.enemyTag, data.healthPoints);
        }
    }
    
    // Libera a referência da lista original para otimização de memória
    enemyRegistryList = null; 
}

Formatação Automática no Inspetor

A interface do Unity aplica regras automáticas de formatação para facilitar a leitura dos campos expostos. Nomes de variáveis declarados no padrão camelCase ou PascalCase são divididos por espaços e capitalizados.

public int maximumShieldCapacity = 100;

Na interface gráfica do Editor, este campo será renderizado visualmente como: Maximum Shield Capacity.

Tags: Unity3D C# serialização ScriptableObject SerializeField

Publicado em 6-18 23:48