Conforme o desenvolvimento de um jogo avança é inevitável que os scripts que criamos também cresçam em tamanho e precisem de cada vez mais informação que serão inseridas através do editor. E isso faz com que se lembrar quais componentes precisam ser adicionados para o nosso script funcionar corretamente ou para que serve aquela propriedade torna-se cada vez mais difícil.
Ainda bem que a Unity possui uma série de atributos que podemos usar para facilitar a organização e melhorar a produtividade quando estivermos trabalhando no editor. E ao longo dos projetos que criei na engine me peguei usando com frequência certos atributos. Por esse motivo criei esta lista com os atributos que acho mais úteis.
SerializeField
Muitas vezes não queremos que o campo de uma classe possa ser acessado por outras classes, já que sua função é guardar informação relevante apenas para aquele objeto. Porém, para exibir o campo no editor precisamos torná-lo público, o que faz com que ele possa ser modificado por qualquer classe.
Podemos resolver isso ao marcar um campo privado com o atributo SerializeField. Isso faz com a Unity entenda que o campo marcado com esse atributo deve ser serializado e exibido no editor.
Em geral devemos sempre usar esse atributo quando queremos que algum campo seja exibido no editor e se quisermos dar a acesso a ele através de outras classes devemos usar as propriedades get
e set
.
using UnityEngine; public class Player : MonoBehaviour { [SerializeField] private int maxHitPoints; private int currentHitPoints; }
HideInInspector
Diferente do atributo anterior, o atributo HideInInspector esconde um campo público no editor. Esse atributo é útil quando precisamos que outras classes tenham acesso a informação de um campo, porém não queremos que ele seja modificado diretamente no editor, isso acontece geralmente com campos que são calculados durante o gameplay.
using UnityEngine; public class ScoreBoard: MonoBehaviour { [HideInInspector] public int score; }
Tooltip
O atributo Tooltip permite que uma mensagem seja exibida quando paramos o mouse em cima do nome de uma propriedade no editor. Este atributo é útil porque podemos explicar qual a função de uma propriedade para as pessoas que estão envolvidas no projeto. É especialmente útil quando o nome de uma propriedade só faz sentido dentro do jogo ou ter significados diferentes dependendo do contexto.
using UnityEngine; public class Player : MonoBehaviour { [SerializeField] [Tooltip("How much hit points the player should start")] private int maxHitPoints; }
Header
Quando um script tem um grande número de propriedades pode deixar o editor bastante confuso, dificultando o trabalho. Com o atributo Header podemos adicionar cabeçalhos, o que nos permite basicamente categorizar as propriedades e facilitar nosso trabalho quando estivermos procurando aquela uma propriedade que precisamos alterar o valor.
using UnityEngine; public class Map : MonoBehaviour { [Header("Map")] [SerializeField] private int width = 10; [SerializeField] private int height = 10; [SerializeField] private int numberOfRooms = 10; [Header("Rooms")] [SerializeField] private float roomWidth = 10; [SerializeField] private float roomHeight = 10; [SerializeField] private GameObject roomPrefab; [SerializeField] private GameObject roomBossPrefab; [SerializeField] private GameObject roomTreasurePrefab; [Header("Doors")] [SerializeField] private GameObject doorUpPrefab; [SerializeField] private GameObject doorDownPrefab; [SerializeField] private GameObject doorRightPrefab; [SerializeField] private GameObject doorLeftPrefab; }
Range
Quando a Unity exibe um campo do tipo int
ou float
no editor podemos inserir o valor que quisermos. Porém, nem sempre é isso o que queremos. Com o atributo Range podemos limitar o valor um campo entre dois números, além disso, quando marcamos um campo com esse atributo, um slider é exibido no lugar do espaço para digitar o número.
using UnityEngine; public class Player : MonoBehaviour { [SerializeField] [Range(1, 27)] private int invetorySize; }
TextArea
Já se pegou tentando digitar um texto mais longo no inspetor mas faltou espaço? O atributo TextArea resolve exatamente esse problema. Ele modifica os campos de texto para que fique mais fácil escrever textos que possuam mais do que uma frase. Além disso, podemos definir qual a quantidade mínima e máxima de linhas que podem ser exibidas no editor.
using UnityEngine; public class Player : MonoBehaviour { [SerializeField] [TextArea(1, 10)] private string backstory; }
RequireComponent
Quantas vezes você adicionou um script que você criou como componente e ao entrar no Play Mode recebeu uma mensagem de erro porque esqueceu de adicionar outro componente que é necessário. O atributo RequireComponent existe exatamente para evitar esse tipo de problema.
Com esse atributo podemos definir uma lista de componentes que o script que você criou precisa e que serão adicionados automaticamente toda vez que esse script seja adicionado a um GameObject. A única coisa que precisamos ficar atentos é que ele só funciona no momento em que o script é adicionado ao GameObject.
[RequireComponent(typeof(Rigidbody), typeof(Collider))] public class Player : MonoBehaviour { }
Conclusão
Com esses atributos à nossa disposição podemos organizar e melhorar a produtividade de todo mundo envolvido no projeto. Tem algum atributo que você costuma usar que deixei de fora dessa lista? Deixe no comentário!