Attributes y Property drawers
Clase 12 de 20 • Curso de Herramientas de Unity
Resumen
¿Cómo crear atributos personalizados en Unity?
Crear atributos personalizados en Unity es una práctica poderosa para cualquier desarrollador que quiera personalizar su editor o ampliar la funcionalidad del inspector de Unity. En este proceso, el uso de "drawers" y la separación de carpetas puede ayudarte a mantener tu proyecto organizado y eficiente. Vamos a explorar este proceso de creación de atributos paso a paso.
¿Cómo definimos una estructura de carpetas para los atributos?
La organización del proyecto es crucial para su fácil mantenimiento. Una buena práctica en Unity es crear dos carpetas principales: una para los scripts normales y otra llamada "Editor".
- Scripts: Aquí definirás tu atributo y cualquier funcionalidad relacionada que se pueda necesitar durante el compilado.
- Editor: Esta carpeta es de uso exclusivo para el editor. Las clases dentro de esta carpeta no se incluyen en el compilado final del juego; sirven exclusivamente para mejorar la funcionalidad del editor.
Es fundamental que la carpeta 'Editor' se llame exactamente así para asegurarse de que Unity reconozca que estos scripts no deben ser incluidos en el juego compilado.
¿Cómo se crea un atributo randomizador en Unity?
Un atributo personalizado puede aportar flexibilidad y poder al editor de Unity. En esta clase, creamos un atributo que sirve para randomizar valores dentro de un rango especificado. Aquí te muestro cómo:
Paso 1: Creación del atributo
El atributo debe heredar de la clase PropertyAttribute
. Se definen variables como el rango mínimo y máximo dentro del atributo.
public class RandomizeAttribute : PropertyAttribute {
public float min;
public float max;
public RandomizeAttribute(float min, float max) {
this.min = min;
this.max = max;
}
}
Paso 2: Creación de la clase Property Drawer
La clase PropertyDrawer
nos permite definir cómo el atributo se va a mostrar en el editor. Es importante heredar de PropertyDrawer y usar CustomPropertyDrawer
para asociar nuestro atributo personalizado:
[CustomPropertyDrawer(typeof(RandomizeAttribute))]
public class RandomizeDrawer : PropertyDrawer {
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
if (property.propertyType == SerializedPropertyType.Float) {
// Aquí implementamos la lógica del botón y del randomizador
} else {
EditorGUI.LabelField(position, label.text, "Use Randomize with float.");
}
}
}
Paso 3: Implementación de la funcionalidad
Dentro del método OnGUI
, se implementa la funcionalidad que permite modificar la propiedad mediante un botón. Al presionarlo, debería cambiar el valor a uno aleatorio dentro del rango permitido.
if (GUI.Button(new Rect(position.x, position.y + 20, position.width, 20), "Randomize")) {
RandomizeAttribute randAttr = (RandomizeAttribute)attribute;
property.floatValue = UnityEngine.Random.Range(randAttr.min, randAttr.max);
}
EditorGUI.PropertyField(position, property, label);
¿Cómo manejar tipos incompatibles en el atributo?
Un punto importante al crear atributos personalizados es asegurarse de que funcionen solo con los tipos de datos esperados. En este ejemplo, utilizamos un log para notificar al desarrollador cuando el atributo no se utiliza correctamente.
if (property.propertyType != SerializedPropertyType.Float) {
Debug.LogError("RandomizeAttribute can only be used with float fields.");
return;
}
¿Por qué utilizar atributos personalizados?
Los atributos personalizados ofrecen varias ventajas:
- Modularidad: Puedes separar las funcionalidades del editor del resto de tu código de juego.
- Personalización: Añades características nuevas al Unity Inspector que pueden simplificar y optimizar las tareas de desarrollo.
- Escalabilidad: A medida que tu proyecto crece, la extensión del editor te permite manejar operaciones complejas de manera más sencilla.
Con estos pasos, puedes comenzar a experimentar con atributos personalizados en Unity. Anímate a explorar más allá de los ejemplos y encuentra nuevas formas de mejorar tu flujo de trabajo en el desarrollo de videojuegos.