🎮 UnityDocs

Ventanas y herramientas de editor personalizadas

Crea tus propias herramientas dentro del editor: ventanas custom (EditorWindow), botones con MenuItem, dibujar ayudas en la escena con Gizmos y Handles, y automatizar tareas repetitivas para acelerar tu producción.

📄 ArtículoAvanzado✅ RevisadoUnity 6.0 LTSActualizado 2026-07-15
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 8 min · ⌨️ Práctica 30 min

Unity es tu herramienta... que puedes ampliar#

Ya viste cómo mejorar el Inspector en editor scripting. El siguiente paso es crear tus propias herramientas: ventanas, botones de menú y ayudas visuales que automatizan lo repetitivo. Un buen tooling interno ahorra horas y reduce errores en el equipo.

Carpeta Editor, siempre

Todo el código de editor va en una carpeta llamada Editor (en cualquier nivel del proyecto). Unity lo excluye de la build del juego. Si lo dejas fuera, usar UnityEditor rompe la compilación al exportar. Es la regla de oro del editor scripting.

Un botón de menú (MenuItem)#

Lo más rápido: un atributo [MenuItem] añade una opción a la barra de menús que ejecuta un método estático. Ideal para acciones puntuales:

C#
using UnityEngine;
using UnityEditor;

public static class HerramientasMenu
{
    [MenuItem("Herramientas/Contar objetos en la escena")]
    static void ContarObjetos()
    {
        int n = Object.FindObjectsByType<GameObject>(FindObjectsSortMode.None).Length;
        Debug.Log($"Hay {n} GameObjects en la escena.");
    }
}

Aparece en la barra superior como Herramientas → Contar objetos en la escena.

Una ventana propia (EditorWindow)#

Para herramientas con interfaz (un generador de niveles, un panel de balanceo), creas una EditorWindow:

C#
using UnityEngine;
using UnityEditor;

public class GeneradorEnemigos : EditorWindow
{
    private int cantidad = 10;
    private GameObject prefab;

    [MenuItem("Herramientas/Generador de enemigos")]
    static void Abrir() => GetWindow<GeneradorEnemigos>("Generador");

    void OnGUI()
    {
        GUILayout.Label("Ajustes", EditorStyles.boldLabel);
        prefab = (GameObject)EditorGUILayout.ObjectField("Prefab", prefab, typeof(GameObject), false);
        cantidad = EditorGUILayout.IntSlider("Cantidad", cantidad, 1, 100);

        if (GUILayout.Button("Generar"))
            Generar();
    }

    void Generar()
    {
        if (prefab == null) return;
        for (int i = 0; i < cantidad; i++)
        {
            var go = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
            go.transform.position = Random.insideUnitSphere * 10f;
            Undo.RegisterCreatedObjectUndo(go, "Generar enemigo");   // permite deshacer
        }
    }
}
Respeta el Undo

Cuando una herramienta modifica la escena, regístralo en el sistema de deshacer (Undo.RegisterCreatedObjectUndo, Undo.RecordObject). Así el usuario puede pulsar Ctrl+Z como con cualquier acción de Unity. Una herramienta que no soporta Undo es peligrosa y frustrante.

UI Toolkit para ventanas modernas

OnGUI con EditorGUILayout (IMGUI) es lo clásico y rápido para herramientas sencillas. Para herramientas grandes y mantenibles, Unity recomienda hoy construir las ventanas con UI Toolkit (UXML + USS), su terreno estrella.

Gizmos: dibujar ayudas en la escena#

Los Gizmos son dibujos que solo se ven en el editor (no en el juego), útiles para visualizar rangos, rutas o zonas. Van en un MonoBehaviour normal (no en carpeta Editor):

C#
using UnityEngine;

public class Enemigo : MonoBehaviour
{
    [SerializeField] private float rangoVision = 5f;

    // Se dibuja en la Scene view; ayuda a ver el rango sin ejecutar
    void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, rangoVision);
    }
}

Ahora, al seleccionar el enemigo, ves su radio de visión dibujado. Es la mejor forma de depurar diseño (rangos de ataque, waypoints, áreas de spawn) sin adivinar valores. Los Handles van un paso más allá: permiten manipuladores arrastrables en la escena para editar valores a mano.

Sin crear ventanas, [ContextMenu] añade opciones al menú de clic derecho de un componente, perfecto para acciones de prueba:

C#
[ContextMenu("Resetear vida")]
void ResetearVida() => vida = vidaMax;

Aparece al pulsar el icono de ajustes del componente en el Inspector.

Cuándo merece la pena#

Automatiza lo que repites

Regla práctica: si haces una tarea tediosa a mano más de tres veces (colocar objetos, renombrar en lote, generar datos, validar prefabs), probablemente merezca una herramienta. El tiempo de crearla se recupera rápido, y sobre todo elimina errores humanos. Es lo que distingue a un estudio productivo.

Errores frecuentes#

  • Poner código de editor fuera de una carpeta Editor (rompe la build).
  • Herramientas que modifican la escena sin registrar Undo.
  • Confundir Gizmos (ayudas de editor) con efectos del juego (que serían otra cosa).
  • Reinventar a mano tareas repetitivas en vez de automatizarlas.
  • Usar UnityEditor en scripts de runtime (solo existe en el editor).

Ponte a prueba#

📝 Pon a prueba lo aprendido

Resumen#

Amplía el editor con [MenuItem] (botones de menú), EditorWindow (ventanas con interfaz, mejor con UI Toolkit para las grandes), Gizmos/Handles (ayudas visuales y manipuladores en la escena) y [ContextMenu] (acciones rápidas). Pon siempre el código en una carpeta Editor, respeta el Undo, y automatiza lo que repitas más de tres veces. Un buen tooling interno acelera la producción y elimina errores. Complementa lo visto en editor scripting del Inspector.

Fuentes y para profundizar