03/10/26 · 4 min de lectura

Attributes en Unity

Los atributos le permiten adjuntar un comportamiento adicional a los métodos y variables que crea.

Imagen por Michael Trimble .

Aprenderás el formato de los atributos, así como también cómo usar los atributos Range y ExecuteInEditMode.

Los atributos te permiten anexar información a un método, una variable o una clase, cuando los declaras. Es muy útil para tomar código existente y mejorarlo o cambiarlo de alguna manera.

Los atributos varían mucho en sus efectos y sus usos. Aquí tenemos una escena en Unity con una esfera. La esfera tiene un SpinScript anexado. Ten en cuenta la variable Speed del script, la misma que actualmente está configurada a 0.

img

En el SpinScript, podemos ver que primero declaramos la variable tipo entero speed y la configuramos a 0.

public int speed = 0;

Luego, en el método Update, podemos rotar el objeto en su eje vertical, basado en su velocidad actual. De esta manera, podríamos darle a la variable speed cualquier valor que querramos y la velocidad de rotación del objeto cambiaría como resultado.

void Update()
{    
    transfrom.Rotate(new Vector3(0, speed * Time.deltaTime, 0));
}

Esto funciona bien pero ¿qué pasa si queremos limitar el valor de la variable speed? Podríamos escribir código para detectar el valor actual de la variable y prevenir que salga de rango o podríamos anexarle un atributo.

Los atributos están escritos arriba, o justo antes del código que modifican y generalmente no afectan ninguna otra parte del script.

En este caso vamos a usar el atributo Range. La sintaxis para todos los atributos comienza con un corchete de apertura.

Luego, para el atributo Range, escribimos la palabra reservada Range seguido de paréntesis. Dentro de los paréntesis escribimos nuestros valores mínimos y máximos. Terminamos el atributo con un corchete de cierre.

void Update()
{   
    [Range(-100, 100)]
    public int speed = 0;
}

Ten en cuenta que en este caso hemos puesto el atributo encima de la declaración de la variable. Podríamos haberlo puesto justo antes también.

void Update()
{   
    [Range(-100, 100)] public int speed = 0;
}

Si regresamos a Unity, podemos ver que no tenemos la misma propiedad speed en la vista Inspector. Ahora tenemos un deslizador que va desde nuestro valor mínimo a nuestro valor máximo.

img

Al ver nuestra escena podemos ver que el deslizador móvil cambia directamente la velocidad de la variable, la misma que a su vez cambia la rotación del objeto.

Otro atributo que veremos es el atributo ExecuteInEditMode. Este atributo causa que el script al que está anexado se ejecute incluso cuando la escena no está en modo Play.

Aquí tenemos otra escena con una esfera. Esta esfera tiene un script llamado ColorScript anexado a ella.

En el ColorScript configuramos el color del material del objeto a rojo. Si queremos ver este cambio en Unity sin rodar la escena podríamos aplicarle el atributo ExecuteInEditMode.

void Start()
{   
    GetComponent<Renderer>().shadedMaterial.color = Color.red;
}

Para hacerlo, abrimos un corchete sobre o antes del nombre de nuestra clase. Lo ponemos delante del nombre de la clase porque el atributo ExecuteInEditMode se aplica a todo el código en un script, no solo a una parte. Luego escribimos la palabra reservada ExecuteInEditMode seguida de un corchete de cierre.

[ExecuteInEditMode]
public class ColorScript : MonoBehaviour

void Start()
{   
    GetComponent<Renderer>().shadedMaterial.color = Color.red;
}

Este atributo no tiene ningún parámetro y por lo tanto, no tiene necesidad de ningún paréntesis.

De regreso en Unity, podemos ver que nuestro objeto se ha vuelto rojo. Nuestro script se ejecutó, incluso cuando no rodamos la escena.

Vale la pena recalcar que necesitas tener cuidado con los atributos ExecuteInEditMode. Normalmente los scripts se ejecutan cuando inicia la escena. Cuando paras una escena, cualquier cambio que hagas al GameObject en una escena serán deshechos.

Los scripts que se ejecutan durante el modo Edit pueden modificar, crear y borrar objetos en tu escena. Desde que los cambios no están en modo Play, no serán revertidos y serán permanentes.

Por ejemplo, la esfera en la escena ha sido modificada para que sea roja permanentemente. Si arrastramos otra esfera a nuestra escena, también será roja, ya que el recurso o asset Orb se cambió.

Para ajustar esto, tendríamos que cambiar el color manualmente. Puedes encontrar más información acerca del atributo ExecuteInEditMode en la documentación que está vinculada en la parte inferior de este post.

Gist del proyecto

Apoya el contenido de mi blog a través de:

Fuente:

Copiado!