Atributos en programacion C#/Unity

En este articulo veremos unos cuantos atributos para mejorar el código en Unity.

Mostrar variables privadas en el inspector

Algo que pasa, es que las variables que queremos editar las ponemos publicas, lo cual es una mala practica de programación, entonces si la variable solo se usara dentro de ese script, debe ser privada. Entonces si tengo que editarla por el inspector como lo hago. Solo se hace lo siguiente:

 
[SerializeField] private int variable;
 


Ocultar variables publicas del inspector

Podemos hacer lo contrario, si por algún caso, la variable sera usada en otros scripts, pero, no se necesita en el inspector, la podremos ocultar así:

[HideInInspector] public string clave;


Texto informativo de variables en el inspector

Si queremos organizar las variables, se puede hace con un texto así:

 
[Header("Mensaje")]
public int var1;
public int var2;
 

Genera un texto antes de las variables en el inspector.

 

Recuadro de información

Este es diferente al anterior atributo, ya que al pasar el mouse por encima de la variable en el inspector, mostrara un texto nuestro, lo crearemos así:

 
[Tooltip("El numero de vidas")] public int vidas;
 


Limite para una variable numérica

Si queremos delimitar cual es el mínimo y máximo de una variable lo haremos así:

 
[Range(0,4)] public int ejemplo;
 

En el ejemplo limitamos la variable ejemplo a valores desde 0 a 4.

 
[Range(1f,3f)] public float ejemplo;
 

O así, para que sea un valor decimal.


Valor mínimo

Si queremos que la variable tengo un mínimo, haremos lo siguiente:

 
[Min(10)] public float variable;
 

En el ejemplo anterior, la variable, no puede ser menor a 10.


Espacios entre variables

Si necesita espacios en las variables en el inspector, agregamos:

 
public int num;
[Space]
public string men;
 

Creara un pequeño espacio, para una mejor visualización. Pero también se puede definir el tamaño de espacio, pasando un valor en pixeles, así:

 
public int num;
[Space(100)]
public string men;
 

Crea un gran espacio vació...


Mejorar la visualizacion de textos

Si queremos ver mejor un texto largo, solo tenemos que agregar:

 
[TextArea] public string dialogo;
 

Pero si queremos tener un mínimo de lineas y un máximo, lo agregamos así:

 
[TextArea(2,8)] public string dialogo;
 

En el ejemplo anterior delimitamos, a mínimo 2 lineas para mostrar, y máximo 8 lineas.


Objetos obligatorios en el script

Si el script obligatoriamente necesita un componente, podemos definirlo dentro del mismo script, así:

 
[RequireComponent(typeof(Rigidbody2D))]
public class Clase : MonoBehaviour
{}
 

En el ejemplo anterior, estamos solicitando el componente Rigidbody2D, esto se pone antes de crear la clase.


Context menu

Podemos usar de manera directa una función o que una variable tenga una función, ejemplo:

 
[ContextMenu("Funcion decir hola")]
private void DecirHola() {
   Debug.Log(" Hola :D ");
}
 

Para poder verlo, le damos click derecho al componente y nos saldrá la función.


También podemos agregarlo a una variable:

 
[ContextMenuItem("Agregar puntuacion", "Mas")] public int puntuacion;

public void Mas() {
   puntuacion += 1;
}
 

Para verlo, haremos lo mismo, le damos click a la variable y nos mostrara la función.


Menu item

También, podemos crear nuestras funciones de una manera mas global, que no dependan de un componente, como ejemplo tenemos:


[MenuItem("Mis herramientas/Remover hijos")]
static void RemoverHijos() {
    var transformSeleccionado = Selection.activeTransform;
    var hijos = new List<GameObject>();
    foreach(Transform hijo in transformSeleccionado) { hijos.Add(hijo.gameObject); }
    hijos.ForEach(hijo => GameObject.DestroyImmediate(hijo));
}

El código anterior es:

La linea 1: es lo que hace accesible la función. Debemos poner una ruta.

Linea 2: es la función, debe ser estática.

Linea 3 a 6:  obtienen el gameObject seleccionado agregan sus hijos a una lista y luego los elimina.

Se vera asi:

La flecha verde indica el gameObject seleccionado, y la flecha roja nuestra función, si notan; la función no se puede usar, y eso porque el objeto no tiene hijos. Pero esta validación hay que codearla... Así:


[MenuItem("Mis herramientas/Remover hijos", true)]
static bool ValidarRemoverHijos() {
    return Selection.activeTransform?.childCount > 0;
}

El código anterior es:

La linea 1: es igual que el ejemplo anterior, ya que para que valide si una función se puede usar debe tener el mismo nombre. Ademas para asegurarnos que es un validador, le agregamos el true.

La linea 2: es la función, tiene que ser estática y debe devolver un boleano.

La linea 3: evalúa si el gameObject seleccionado tiene hijos. Según eso devolverá falso o verdadero.

Se vera así:

Ahora vemos que el objeto tiene 3 hijos, entonces la validación activa el uso de la función, y podremos usarla.
Nota: para que funcione, debemos importar UnityEditor.


En conclusión, estos atributos nos ayudaran en la calidad del código, hay mas, pero estos son los mas útiles.

No presento imágenes, ya que deseo que el lector los pruebe por si mismo.


Recursos

Codigo en repo