Resumen

Personalizar el inspector de Unity con menús contextuales es una técnica que acelera el flujo de trabajo y permite ejecutar funciones directamente desde el editor sin necesidad de entrar en modo play. A continuación se explica cómo implementar context menus tanto en métodos como en propiedades de un componente.

¿Cómo funciona el atributo context menu en métodos?

El atributo [ContextMenu] se coloca justo encima de un método dentro de un MonoBehaviour para que aparezca como opción al hacer clic derecho sobre el componente en el inspector, o al presionar los tres puntos del encabezado del componente [01:30].

Por ejemplo, se puede crear un método llamado SpawnSphere que instancie una esfera primitiva usando GameObject.CreatePrimitive(PrimitiveType.Sphere). Esta línea le indica a Unity que genere un objeto primitivo de tipo esfera directamente en la escena [01:05].

Después de crear la esfera, se puede asignar su posición al origen del mundo (cero, cero, cero) y utilizar la clase Selection para establecerla como el objeto activo en el editor. Para usar Selection es necesario importar el namespace UnityEditor [01:35].

Finalmente, con SceneView y su método FrameLastActiveSceneView se logra que la cámara del editor enfoque automáticamente el objeto recién creado [02:05].

El decorador queda así:

csharp [ContextMenu("Spawnear esfera")] void SpawnSphere() { var esfera = GameObject.CreatePrimitive(PrimitiveType.Sphere); esfera.transform.position = Vector3.zero; Selection.activeGameObject = esfera.gameObject; SceneView.FrameLastActiveSceneView(); }

Al dar clic derecho sobre el componente en el inspector, aparece la opción "Spawnear esfera" dentro de la lista del menú contextual. Al seleccionarla, Unity crea la esfera y enfoca la vista hacia ella [02:40].

¿Cómo agregar un context menu a una propiedad específica?

Para asociar un menú contextual directamente a una propiedad en lugar de al componente completo, se utiliza el atributo [ContextMenuItem] [03:10]. Este atributo recibe dos parámetros:

  • El nombre visible que aparecerá en el menú (por ejemplo, "Resetear vida").
  • El nombre del método que se ejecutará al seleccionar esa opción.

Una práctica recomendada es usar la palabra clave nameof en lugar de escribir el nombre del método como string literal. Esto evita errores por cambios de nombre y permite que el compilador valide la referencia [03:40].

csharp [ContextMenuItem("Resetear vida", nameof(ResetLife))] public int vida;

void ResetLife() { vida = 100; }

Al hacer clic derecho directamente sobre el campo vida en el inspector, aparece la opción "Resetear vida". Al ejecutarla, el valor se establece en 100 sin importar cuál fuera su valor previo [04:20].

¿Cuándo conviene usar cada tipo de context menu?

La diferencia principal entre ambos atributos radica en el alcance:

  • [ContextMenu]: aparece en el menú del componente completo. Ideal para acciones globales como instanciar objetos, limpiar datos o ejecutar rutinas de configuración.
  • [ContextMenuItem]: aparece al hacer clic derecho sobre un campo serializado concreto. Perfecto para resetear, randomizar o modificar valores puntuales.

Ambos atributos funcionan exclusivamente en el editor y no afectan el rendimiento en builds finales. Son herramientas de productividad que permiten extender el inspector sin escribir un custom editor completo.

El parámetro de prioridad en [ContextMenu] resulta útil cuando se tienen múltiples opciones y se desea controlar el orden en que aparecen en la lista [02:20]. También existe un parámetro de función de validación que permite habilitar o deshabilitar la opción según condiciones específicas.

Si te interesa ir un paso más allá y convertir estas funciones en botones visibles directamente en el inspector, eso es exactamente lo que se aborda a continuación. ¿Has usado context menus en tus proyectos? Comparte cómo los implementas.