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.
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:
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:
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
}
}
}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.
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):
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.
Menús contextuales rápidos#
Sin crear ventanas, [ContextMenu] añade opciones al menú de clic derecho de un componente, perfecto para acciones de prueba:
[ContextMenu("Resetear vida")]
void ResetearVida() => vida = vidaMax;Aparece al pulsar el icono de ajustes del componente en el Inspector.
Cuándo merece la pena#
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
UnityEditoren scripts de runtime (solo existe en el editor).
Ponte a prueba#
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.