Por qué personalizar el editor#
Unity no solo te deja hacer juegos: te deja extender el propio editor para trabajar más rápido y cometer menos errores. Desde pequeños atributos que ordenan el Inspector hasta herramientas a medida para tu equipo. Empieza por lo barato y potente: los atributos.
Atributos del Inspector (sin escribir editores)#
Con solo decorar tus campos, mejoras muchísimo el Inspector:
using UnityEngine;
public class Enemigo : MonoBehaviour
{
[Header("Estadísticas")] // título en negrita
[Tooltip("Vida inicial del enemigo")] // ayuda al pasar el ratón
[SerializeField] private int vida = 100;
[Range(0f, 20f)] // deslizador
[SerializeField] private float velocidad = 5f;
[Space(10)] // separación
[SerializeField] private string nombre;
[TextArea] // caja de texto multilínea
[SerializeField] private string descripcion;
}[Header], [Tooltip], [Range], [Space], [TextArea] no requieren editores personalizados y hacen tu Inspector legible y a prueba de errores. Úsalos desde ya: cuestan una línea y tu yo del futuro (y tu equipo) lo agradecerán.
[ContextMenu]: botones de utilidad#
[ContextMenu] añade una opción al menú (⋮) del componente para ejecutar un método desde el editor. Perfecto para pruebas y herramientas rápidas:
[ContextMenu("Rellenar vida")]
void RellenarVida()
{
vida = 100;
Debug.Log("Vida restaurada");
}Editores personalizados (CustomEditor)#
Cuando quieres cambiar cómo se dibuja el Inspector de un componente (añadir botones, ocultar campos según una condición, mostrar avisos), creas un Editor personalizado.
El código de editor no debe incluirse en la build del juego. Ponlo en una carpeta llamada exactamente Editor (Unity la trata de forma especial y la excluye del juego). Además usa using UnityEditor;, que solo existe en el editor.
// Archivo: Assets/Scripts/Editor/EnemigoEditor.cs
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Enemigo))]
public class EnemigoEditor : Editor
{
public override void OnInspectorGUI()
{
// Dibuja el Inspector normal
DrawDefaultInspector();
// 'target' es el objeto que se está inspeccionando
Enemigo enemigo = (Enemigo)target;
// Un botón personalizado
if (GUILayout.Button("Matar enemigo"))
Debug.Log(enemigo.name + " eliminado (prueba)");
}
}Property Drawers y atributos propios#
Un PropertyDrawer define cómo se dibuja un tipo (o un atributo) allá donde aparezca, no solo un componente. Sirve para, por ejemplo, un atributo [ReadOnly] que muestre un campo sin poder editarlo, reutilizable en todo el proyecto. Es un paso más avanzado, pero muy usado en proyectos serios para crear un Inspector consistente.
Gizmos: dibujar ayudas en la escena#
No es exactamente editor scripting, pero encaja: OnDrawGizmos dibuja ayudas visuales en la vista Scene (rangos, rutas, radios de detección). Ya lo usaste en la detección de suelo:
void OnDrawGizmosSelected()
{
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, 5f); // radio de detección
}Cuándo merece la pena#
- Atributos (
[Header],[Range],[ContextMenu]) → siempre; casi gratis - Gizmos → cuando ajustar valores "a ciegas" cuesta (rangos, rutas)
- CustomEditor / PropertyDrawer → cuando una herramienta se usa mucho o la usa un equipo, y el tiempo que ahorra compensa hacerla
- No te pongas a construir herramientas elaboradas para algo que usarás una vez
Errores frecuentes#
- Poner código con
using UnityEditor;fuera de una carpetaEditor(la build falla al compilar). - Sobrecargar de herramientas de editor un proyecto pequeño (tiempo mal invertido).
- Olvidar
DrawDefaultInspector()y perder los campos normales al hacer un CustomEditor. - Confundir Gizmos (ayudas de editor) con algo que se ve en el juego (no aparecen en la build).
Ponte a prueba#
Resumen#
Empieza por los atributos del Inspector ([Header], [Tooltip], [Range], [Space], [TextArea], [ContextMenu]): mejoran el flujo por casi nada. Para cambiar cómo se dibuja un Inspector, usa un CustomEditor (en una carpeta Editor, con OnInspectorGUI y DrawDefaultInspector), y para tipos reutilizables un PropertyDrawer. Los Gizmos dibujan ayudas en la escena. Invierte en herramientas solo cuando el tiempo que ahorran lo justifica.