Crea una Editor Window con AssetDatabase

Resumen

Crear una Editor Window en Unity te permite construir herramientas personalizadas dentro del editor para visualizar y manipular datos de tu juego. Aquí aprendes a montar una ventana que cargue automáticamente todos los Scriptable Objects de tipo ítem desde tu proyecto, ideal si trabajas con bases de datos de objetos en desarrollos con Unity.

¿Qué es una Editor Window y dónde se coloca el script?

Una Editor Window es una ventana personalizada que extiende la interfaz del editor de Unity y funciona como una herramienta general, no atada a un componente específico. A diferencia de un custom editor, que modifica la apariencia del Inspector de un objeto, la Editor Window abre un panel propio donde puedes diseñar la lógica que necesites.

Todo el código que dibuje algo en el editor debe ir dentro de la carpeta Editor. Esto le indica a Unity que no compile esos scripts en el build final, evitando errores al exportar el juego [01:00].

¿Por qué el script va en la carpeta Editor? Porque Unity excluye esa carpeta al compilar el build. Así, el código del editor no se incluye en el ejecutable y no genera conflictos de compilación.

¿Cómo defino la clase y abro la ventana desde el menú?

La clase debe heredar de EditorWindow en vez de MonoBehaviour, y necesita importar el namespace UnityEditor. Eliminas Start y Update porque no aplican aquí.

Dentro de la clase declaras dos variables a nivel de ventana que vivirán mientras la ventana esté abierta:

  • Una lista genérica List<ItemScriptableObject> para almacenar todos los ítems cargados.
  • Una variable currentItem para guardar el ítem seleccionado.

Para abrir la ventana usas un método estático decorado con el atributo MenuItem, que registra una entrada en la barra superior del editor [03:20]. La ruta tools/item editor window es la que aparecerá en Unity.

csharp [MenuItem("Tools/Item Editor Window")] static void OpenWindow() { var window = GetWindow<ItemEditorWindow>(); window.titleContent = new GUIContent("Editor de ítems"); window.position = new Rect(Screen.width / 2, Screen.height / 2, 500, 500); }

El método estático GetWindow recibe el tipo de ventana como genérico y devuelve la instancia. Le asignas un título y una Rect con la posición y el tamaño inicial: 500 por 500 píxeles, centrada en pantalla usando Screen.width y Screen.height divididos entre dos.

¿Por qué OpenWindow es estático y dónde cargo los datos?

Los métodos estáticos no pueden acceder a variables de instancia de la clase, así que OpenWindow solo sirve para abrir la ventana. Para cargar los datos usas OnEnable, que se ejecuta automáticamente cuando la ventana se abre y sí tiene acceso a las variables de instancia.

Hacer la carga en OnGUI sería un error: ese método se llama muchas veces por segundo y obtener assets en cada llamada degrada el rendimiento del editor.

¿Cómo cargo todos los Scriptable Objects con AssetDatabase?

La clase AssetDatabase de Unity expone el método FindAssets, que recibe un string con un filtro idéntico al que usas en la barra de búsqueda del Project. Si escribes t:ItemScriptableObject en esa barra, Unity te muestra todos los assets de ese tipo, y el mismo filtro funciona por código.

¿Qué devuelve AssetDatabase.FindAssets? Devuelve un array de GUIDs en formato string, no los objetos directamente. Necesitas convertir cada GUID a una ruta y luego cargar el asset desde esa ruta.

El flujo dentro de OnEnable queda así:

  1. Llamas a AssetDatabase.FindAssets("t:ItemScriptableObject") y guardas los GUIDs.
  2. Inicializas la lista de ítems vacía.
  3. Recorres cada GUID con un foreach.
  4. Conviertes el GUID a path con AssetDatabase.GUIDToAssetPath(guid).
  5. Cargas el asset con AssetDatabase.LoadAssetAtPath<ItemScriptableObject>(path).
  6. Agregas el asset cargado a la lista.

csharp private void OnEnable() { string[] guids = AssetDatabase.FindAssets("t:ItemScriptableObject"); items = new List<ItemScriptableObject>(); foreach (var guid in guids) { string path = AssetDatabase.GUIDToAssetPath(guid); var asset = AssetDatabase.LoadAssetAtPath<ItemScriptableObject>(path); items.Add(asset); } }

Con esto, cada vez que abras la ventana desde Tools > Item Editor Window, Unity rastrea todos los Scriptable Objects de tipo ítem y los deja listos en memoria.

¿Por qué usar GUID en lugar del path directamente?

Unity identifica internamente cada asset con un GUID único que no cambia aunque muevas el archivo de carpeta. El path sí puede cambiar, así que trabajar con GUIDs hace tu herramienta más resistente a reorganizaciones del proyecto [07:30].

La ventana ya existe, ya tiene tamaño definido y ya carga los datos en memoria. Lo que falta es dibujar esa lista en pantalla y permitir seleccionar un ítem para editarlo, que es justo el siguiente paso. ¿Has construido herramientas personalizadas en Unity? Cuéntame qué tipo de tools usas en tu flujo de trabajo.