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.